大概的优化思路
先看sql的执行计划,根据执行计划和当前的逻辑判断sql是不是最优解。提高性能主要的方式还是使用索引,尽量不要使用索引。
执行计划
- 慢查询日志
当查询超过一定的时间没有返回结果的时候,才会记录到慢查询日志中。默认不开启。采样的时候手工开启。可以帮助我们找出执行慢的 SQL 语句
show variables like ‘slow_query_log’;
查看执行慢于多少秒的 SQL 会记录到日志文件中
show variables like ‘long_query_time’;
可以使用模糊搜索,查看所有含有 query 的变量信息
show variables like ‘%query%’; - 执行计划
-
EXPLAIN SELECT ……
经常使用的方式,查看 sql 的执行计划
-
EXPLAIN EXTENDED SELECT ……
将执行计划"反编译"成 SELECT 语句,运行 SHOW WARNINGS ,可得到被 MySQL优化器优化后的查询语句。 -
EXPLAIN PARTITIONS SELECT ……
用于分区表的 EXPLAIN 生成 QEP 的信息,用来查看索引是否正在被使用,并且输出其使用的索引的信息。
-
索引
聚簇索引:主键索引就是聚簇索引。
二级索引:除了聚簇索引之外的就是二级索引。
聚簇索引和二级索引的区别:二级索引记录当前列的信息和主键id,查询叶子节点不包含的信息会发生回表。
sql优化
- union 和 union all的区别:使用 union 会把查询结果先插入到一个临时表里面,然后再去重。所以union的效率比 union all 的效率高
- 使用exists 和 not exists 替换 in 和 not in 前者索引能生效,后者会全表扫描。
==========持续完善中