explain 查看 sql 执行计划
explain select * from `t_message_info`
- type:连接类型。(不要出现 ALL,至少是 RANGE)
- key:使用到的索引。
- key_len:索引长度。
- rows:扫描行数。
- extra:详细说明。
in 条件
in 条件中的值被存储在一个有序数组中,值的数量过多时,效率较低。所以,能用 between 的就不要用 in,能用连接的也不要用 in。
不要用 *
select * 增加了不必要的消耗,还增加了索引失效的可能性。所以,查询时要指定列。
不要用 % 前缀
like ‘%name’,这种模糊查询会导致索引失效。
可使用全文索引:
ALTER TABLE `user` ADD FULLTEXT INDEX `idx_name` (`name`);
模糊查询:
select * from `user` where match(`name`) against('zhangsan' in boolean mode);
limit 1
只查询 1 条数据时,使用 limit 1,可使 explain 结果中的 type 达到 const。
排序
如果要排序的列上没有索引,尽量少用。
or 条件
在 or 左右的两个条件中,如果有一列上没有索引,就会造成索引失效。可使用 union all 或 union 代替 or。
使用 union all 代替 union
union 需要将结果合并,然后排序,进行唯一性过滤,效率较低。如果两个结果中没有重复数据,可以使用 union all 代替 union。
分页
每页 10 条,第二页:
select * from `user` limit 20,10
当数据量很大时,效率较低,可使用 id 设置起始位置:
select * from `user` where `id`>29 limit 10
避免在 where 条件中计算
select * from `user` where `age`*2=36;
应该改成:
select * from `user` where `age`=36/2;
索引失效
在 where 条件中判空。(!=、<>)
like 中使用 % 前缀。
范围查询。(between、<、>)