【发布时间】:2018-09-16 21:34:59
【问题描述】:
我有一个生成 SQL 的框架。其中一个查询是使用我的索引“A”并在 7 秒内返回结果。我看到我可以优化它并创建了一个索引“B”。
现在如果我运行“解释我的查询”,它仍然使用我的索引 A。但是,如果我强制使用索引 B,我会在 1 秒内得到结果(快 7 倍)
很明显,我的索引 B 比我的索引 A 快。我不能使用“强制索引”或“使用索引”命令,因为我的 sql 是从不支持此功能的框架生成的。
那么,为什么 mysql 不自然地使用最快的索引。有没有一种方法可以告诉 mysql 始终使用某个索引而不添加“使用”或“强制”。
查询:
SELECT *
FROM soumission
LEFT OUTER JOIN region_administrative
ON soumission.region_administrative_oid=region_administrative.oid
WHERE (soumission.statut=2
AND ((soumission.telephone LIKE '%007195155134070067132211046052045128049212213255%'
OR (soumission.autre_telephone LIKE '%007195155134070067132211046052045128049212213255%'))
OR (soumission.cellulaire LIKE '%007195155134070067132211046052045128049212213255%')))
ORDER BY soumission.date_confirmation DESC, soumission.numero;
我在多列“statut”、“telephone”、“autre_telephone”、“cellulaire”上添加了索引
如果我强制使用此索引,我的查询速度会快 7 倍,但如果我不指定要使用的索引,它会使用另一个索引(仅在 statut 字段上),速度会慢 7 倍
如果我选择一个大的日期期间(使用错误的索引),这里是解释
【问题讨论】:
-
在不了解表结构和所讨论的查询的情况下,不可能回答有关优化和索引使用的问题。
-
我添加了详细查询
-
@Yannick Richard - 向我们展示查询的解释。注意:以“%”开头的like总是全表扫描
-
我添加了两个解释,一个使用错误索引的大日期周期,一个使用正确索引的小日期范围的完全相同的查询。要使用的正确索引是“ix_statut_date_confirmation2”
-
您的查询有两个表;你的
EXPLAINs有 3 张桌子——??? “日期期间”条款在哪里???