我们都知道,想要看一个 SQL 有没有用到索引,可以通过执行计划来看,并且 MySQL 的索引选择是优化器根据成本预估进行的。也就是说,其实是有可能优化器最终选错索引的。
那么,我们自己在做分析的时候,如何去评判一条 SQL 用到的索引是好是坏呢?如果一个 SQL 可以用到多个索引,那到底应该用哪个更合适呢?
根据上面这篇文章中,我们可以知道,优化器评判一个索引的好坏的依据就是成本,成本低的索引就是好的,成本高的索引就是不好的。
假如说有以下 SQL:
EXPLAIN SELECT * FROM orders WHERE customer_name = "Hollis" and age = 12;
在不考虑索引合并的情况下,他可能会用到customer_name的索引,也可能会用到age的索引。那么,当我们分析两个索引的好坏的时候,有两种非常直观的方式:
第一种方式最直接,就是使用指定的索引直接运行一下 SQL,看看他的整体耗时就行了。如:
SELECT * FROM orders FORCE INDEX (customer_name) WHERE customer_name = 'Hollis' AND age = 12;
SELECT * FROM orders FORCE INDEX (age) WHERE customer_name = 'Hollis' AND age = 12;
这里使用 force index进行指定索引。如果是 MySQL 8.0之前,可以用SHOW PROFILES、如果是 MySQL 8.0之后的版本,可以用EXPLAIN ANALYZE来查看 SQL 的耗时情况。具体参考:
执行计划分析相关的文章我们也介绍过很详细的,如:
当我们分析两个索引的好坏的时候,一般对比他们的以下信息: