MySQL 索引优化分析:为啥你的SQL慢?为啥你建的索引常失效?( 四 )


覆盖索引(Covering Index) :也叫索引覆盖,就是select 的数据列只用从索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select 列表中的字段,而不必根据索引再次读取数据文件 。
Using index condition: 在5.6版本后加入的新特性,优化器会在索引存在的情况下,通过符合RANGE范围的条数 和 总数的比例来选择是使用索引还是进行全表遍历 。
Using where: 表明使用了where 过滤
Using join buffer: 表明使用了连接缓存
impossible where: where 语句的值总是false,不可用,不能用来获取任何元素
distinct: 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作 。
filtered
一个百分比的值,和rows 列的值一起使用,可以估计出查询执行计划(QEP)中的前一个表的结果集,从而确定join操作的循环次数 。小表驱动大表,减轻连接的次数 。
通过explain的参数介绍,我们可以得知:
1 表的读取顺序(id)
2 数据读取操作的操作类型(type)
3 哪些索引被实际使用(key)
4 表之间的引用(ref)
5 每张表有多少行被优化器查询(rows)
性能下降的原因
从程序员的角度
1 查询语句写的不好
2 没建索引,索引建的不合理或索引失效
3 关联查询有太多的join
从服务器的角度
1 服务器磁盘空间不足
2 服务器调优配置参数设置不合理
总结
1 索引是排好序且快速查找的数据结构 。其目的是为了提高查询的效率 。
2 创建索引后,查询数据变快,但更新数据变慢 。
3 性能下降的原因很可能是索引失效导致 。
4 索引创建的原则,经常查询的字段适合创建索引,频繁需要更新的数据不适合创建索引 。
5 索引字段频繁更新,或者表数据物理删除容易造成索引失效 。
6 擅用 explain 分析sql语句
7 除了优化sql语句外,还可以优化表的设计 。如尽量做成单表查询,减少表之间的关联 。设计归档表等 。
到这里,MySQL的索引优化分析就结束了,有什么不对的地方,大家可以提出来 。如果觉得不错可以点一下推荐 。

【MySQL 索引优化分析:为啥你的SQL慢?为啥你建的索引常失效?】


推荐阅读