本文素材来源与2017年的阿里巴巴在线技术峰会。后续视频及PPT资料在文章后面提供下载地址。
作者自我介绍:罗龙九
作者博客地址:http://hidba.org/
文章目录:
从上面的执行计划看,type=ALL 表示全表扫描,SQL执行一次的时候,需要扫描70多万行的数据。如果系统频繁的调用这条SQL,那么这个SQL可能会出现堆积。
先查看表结构:
表结构中有三个字段的索引,没有“mo”字段的索引。所以考虑是不是在“mo”字段上加上索引,在索引的时候,需要考虑索引的过滤性。假如这个字段是过滤性非常差的字段,即时我们字段上加了索引,也可能优化器也不会使用。所以加索引之前需要先验证字段的过滤性。
通过上面的结果,符合条件的结果是非常少的,那么字段加索引的效率是非常高的。
还有另外一种方法判断过滤性:(补充内容)
DISTINCT "mo" 字段,以及 count(DISTINCT "mo" 字段) 的不同个数,以及表的总个数去判断这个字段的过滤性。
(补充)要注意的地方:加索引之前,如果数据库有正在运行的慢SQL,那么加索引操作就会被其阻塞,进而导致表的后续访问都会被阻塞住。
加完索引之后
扫描行数与之前的过滤性验证数据不符。接着分析原因。使用explain extended 命令(将执行计划中的信息进一步的打印出来)。
出现了索引的隐私转换问题。解决办法如下图:将查询条件 类型一致
总结案例一
在MYSQL 5.1、 5.5版本时,处理子查询与Oracle 子查询是完全不一致的。导致由Oracle 数据库迁移至MYSQL数据库,出现了大量的SQL堆积。
mysql的优化器支持嵌套循环,A表驱动B表。如果驱动表A表非常大,那驱动的循环次数就非常多.
本人从网上查询上面描述的结果。不一定正确,只是描述下上面的意思。
Reference:
https://dev.mysql.com/doc/refman/5.5/en/nested-loop-joins.html
-----------------------------------------------------------------------------------------------------------------------
除了上面两个常用的引擎外:tokuDB引擎、MEMORY引擎。本人推荐查看(每种引擎有不同的适应情景)
tokuDB引擎
https://www.cnblogs.com/billyxp/p/3567421.html
MEMORY引擎
https://www.cnblogs.com/yuxiuyan/p/6511837.html
-----------------------------------------------------------------------------------------------------------------------
主讲人特定强调注意:线上繁忙的系统,或者有许多慢SQL,在添加字段,或者选择添加索引时,后面对表的访问将全部被lock住,所以一定要特别特别小心。请在做DDL操作前,一定将慢查询Kill掉。
下图是针对阿里云DRS的读写分离
上面的图说的是,在主库上做DDL操作,会导致备库(子节点)同样会出现了相同的延迟操作。所以进行操作时,选择业务低峰或者流量小的时候进行。
同时也要屁避免子节点上的大业务查询造成的延迟,进行操作前,请先在子节点上 show processlist 查看连接状态,可以将慢的查询kill掉。
遇到延迟的情况,排查思路