文章目录
- 1、explain 输出执行计划
- 2、in 和 not in 要慎用
- 3、少用select *
- 4、善用limit 1
- 5、 order by字段建索引
- 6、count(*)推荐使用
- 7、where 子句中避免is null /is not null
- 8、应尽量避免在 where!=或<>
- 9、应尽量避免在 where 子句中使用 or
- 10、尽量用union all代替union
- 11、应尽量避免在where子句中对字段进行函数操作
- 12、可以选择 exists 代替 in
- 13、避免%xxx式查询
- 14、选择重复值较低的字段建索引
- 15、高效的分页
- 16、join使用问题
- 17、关于索引本身
1、explain 输出执行计划
在select语句前加上explain就可以了(MySQL 5.6开始,不仅仅支持select )能够简单分析sql的执行情况,是否走索引等。
- type列,连接类型。一个好的SQL语句至少要达到range级别。从最好到最差的连接类型为const、eq_reg、- ref、range、index和ALL。一般来说,得保证查询至少达到range级别(范围扫描),最好能达到ref(索引访问)。
- key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。
- key_len列,索引长度。
- rows列,扫描行数。该值是个预估值。
- extra列,详细说明。注意,常见的不太友好的值,如下:Using filesort,Using temporary。
更多相关关内容联合索引、索引失效、索引下推优化、回表、覆盖盖索引等问题可参看:MySQL慢查询是怎么回事、MySQL索引
2、in 和 not in 要慎用
SQL语句中IN包含的值不应过多,MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
<