sql优化工具使用之explain

2017-08-25  本文已影响3571人  Terminalist

关于sql优化,这个话题太大,我怕我说不好,因此本文仅以sql优化工具为题,如果对sql优化有兴趣,我建议去阅读下高性能Mysql这本书,我最近也在读,此文也算是我在阅读此书过程中的一些收获总结。
对于大部分开发人员来说,平常接触的无非就是增删改查这些基本操作,创建存储过程,视图等等都是DBA该干的活,但是想要把这些基本操作写的近乎完美也是一件难事。
而explain显示了MySQL如何使用索引来处理select语句以及连接表。可以通过模拟mysql的优化器帮助选择更好的索引和写出更优化的查询语句。
首先,我们来明确下explain能干嘛 ?

覆盖索引:理解方式一:就是select的数据列只用从索引列中就能取得,不必读取数据行,Mysql可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引列覆盖;理解方式二:索引是高效找到行的一个方法,但是一般数据库也能使用索引找到一个列的数据,因此它不必读取整个行,毕竟索引的叶子节点存储了索引数据;当能通过读取索引就可以得到想要的数据,那就不需要读取行了;一个索引包含了(或者覆盖了)满足查询结果的数据就叫做覆盖索引。
注意:如果要使用覆盖索引,一定要注意select列表中只取出需要的列,不可select *;因为如果将所有的字段一起做索引会导致索引文件过大,查询性能下降;

  1. using where:使用了where
  2. using join buffer:使用了链接缓存;
  3. impossible where:where 子句的值总是false,不能用来获取任何元素;
  4. select tables optimized away:在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化count(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化;
  5. distinct

以上便是explain解析sql后表头各个字段的描述,后续我将会举几个场景优化案例。

上一篇 下一篇

猜你喜欢

热点阅读