MySQL的explain
在日常的开发中会遇到某些SQL执行特别慢。这种SQL会导致系统由于同步查询反馈缓慢影响用户体验。所以必须对这些SQL采取一定的措施进行优化,比如加联合索引,索引覆盖等措施。
1.发现执行效率差的SQL
在开发场景,一般开发者手里只有测试数据,如果不进行专业的压力测试,很容易疏忽SQL因为数据量导致执行缓慢。在生产上,仅仅通过测试定位问题不够精准,问题的可预见性也不强。MySQL提供了一个慢查询记录的功能,其实就是自动记录一些超过配置文件约定时间的SQL查询语句。这个慢查询因为只会记录超时SQL因此对数据库系统的影响较小。
my.conf配置代码
long_query_time = 10 # 执行超过10s的SQL会被记录
log-slow-queries = /var/lib/mysql/mysql-slow.log # 超时SQL日志所在位置
2.分析执行效率差查询的SQL
在Mysql数据库中定位出执行慢的SQL,就得开始分析为什么执行的慢,不能盲目的建索引。建索引固然能提高效率,但是最好是在读多写少的表中,如果是读少写多的表,维护索引对系统的性能也是不菲的损耗。
explain可以看到一条SQL的执行计划,确定该SQL是否用到了索引,是否进行全表扫描。试用效果如图。

可见explain的执行结果为一个表的形式进行展示
| 字段 | 含义 |
|---|---|
| id | 一条SQL会有多个select过程,id为查询的序号 |
| select_type | 查询类型,每个SELECT子句类型,比如SIMPLE,UNION |
| table | 访问数据库中表的名称 |
| partitions | 找到表中所需行的方式,比如ALL、INDEX |
| possible_keys | 查询涉及的字段存在的索引被列出 |
| key | 确定使用的索引 |
| key_len | 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度 |
| ref | 哪些列或常量被用于查找索引列上的值 |
| rows | 估算结果的行数 |
| filtered | 多少比例数据行数通过了过滤,图中为100% |
浙公网安备 33010602011771号