最近公司让我做SQL优化的工作(MySql),用explain发了一些问题。常见的像OR ,IN,>= ,或者是嵌套等导致索引失效,导致查询性能降低的问题在这里就不做陈述了,网上的文章一搜一 大片。我只是写点个人工作中遇到的,网上不好搜索的,但是不保证所有的场景都试用,后续我还会更新。

1、order by 和 limit 结合使用,如果where 字段,order by字段都是索引,那么有limit索引会使用order by字段所在的索引。没有limit会使用where 条件的索引。遇到此类状况可以考虑用子查询将order by 和 limit 分开。这种情况主要发生在你用了多个索引,那么你需要注意了。它可能不执行你希望的走索引。(我觉得mysql会自动计算索引)

2、DATE_FORMAT()格式化时间,格式化后的时间再去比较,可能会导致索引失效。

3、子查询中order by的索引会失效,同时可能导致子查询中的where条件索引都不能用。

4、字符集的使用导致不走索引,有时你会发现用一个SQL 条件值不同可能会有天的差别(我之前遇到的 两个不同的ID号,一个查询80s,一个不到1s)

5、like语句
6、列类型为字符串类型,查询时没有用单引号引起来
7、在where查询语句中使用表达式
8、在where查询语句中对字段进行NULL值判断
9、在where查询中使用了or关键字, myisam表能用到索引, innodb不行;(用UNION替换OR,可以使用索引) 10、全表扫描快于索引扫描(数据量小时)

先说这几条.如果查看执行计划不理想的话,我建议在启动数据库时加上两个启动参数,会看的更清楚(每个表的执行次数和执行时间)

–log-slow-queries     (查询日志)

–log-queries-not-using-indexes   (查询未使用索引日志)

最后的优化方式就是测试,因为业务的不同优化理论不可能总是可以带来很高的效率,利用explain或desc查看,然后再真的某个查询或表做改进吧。

Leave a Reply

Your email address will not be published. Required fields are marked *