MySQL应该使用USE INDEX吗?

时间:2016-06-17 17:16:24

标签: mysql

我遇到了一个建议,我绝不应该使用“USE INDEX”来告诉MySQL使用哪个索引。一位专家说我应该把决定留给优化者。这可能意味着我应该只在最需要的列上创建索引,而不再担心它。如果我能做到并依靠优化器,那将是非常好的。

你怎么看?有任何陷阱吗?

2 个答案:

答案 0 :(得分:0)

是的,你可以这样做,优化器不能说你创建的索引不是最好的,或者缺少一个,或者最好有一个复合索引。

您只能在使用了大量时间的日志中检查您的查询,或者查询您的查询以查看优化程序正在使用哪个索引。

创建一个从不使用的索引是一个坏主意。

如果WHERE子句中有更多条件,则在所有字段上创建复合索引。此索引中的第一个字段是最大程度减少结果的字段,依此类推。

您还可以使用不使用所有字段的复合索引ID。

假设你有一个索引(field1,field2,field3)

此索引可以从左到右使用

有效

WHERE field1 =...
WHERE field1 = ... AND field2 =...
WHERE field1 = ... AND field2 =... AND field3 =...

但不是

WHERE field2 =...
WHERE field3 =...
WHERE field2 = ... AND field3 =...

所以有时候最好使用其他订单,这样你就可以在创建第二个订单之前使用索引

对你而言,我可以发布一些样本

答案 1 :(得分:0)

您通常不希望强制优化器执行您想要的操作,除非您已经证明,正如其他人所说,a)您已经拥有正确的索引并且b)使用另一个索引实际上更快。话虽如此,绝对有很好的使用案例USE INDEX或FORCE INDEX!

一个例子是用一组特定的数据来预热mysql缓冲池。如果要将索引加载到缓冲池中(为什么要执行此操作是它自己有趣的问题),可以使用FORCE INDEX子句强制mysql从该索引中读取。

CREATE TABLE my_table(col int,my_col int,index index_on_my_col(my_col));

SELECT my_col FROM my_table FORCE INDEX (index_on_my_col);

虽然数据库优化器非常好,但它们并不完美。由于某些原因,它们并不完美,例如:a)他们做出的决策是基于近似的统计数据,b)优化算法本身(例如volcanocascades)是基于关于不能保证产生最有效查询计划的启发式方法;他们是工程师(希望)非常有教育意义的猜测,适用于绝大多数用例。

同样,大多数人不会自己动手调整汽车的发动机硬件或传动装置。它们是非常复杂的系统,看起来无害的变化可能会带来灾难性的后果。但是,对于有特定目标的专家来说,通过仔细的更改和大量测试可以获得很大的改进。