SQL 优化
1)基本写法优化
- 少使用
select *,尽量使用具体字段; - 对于条件来说等号之类两边的字段类型要一致,字符串不加单引号索引会失效;
- 对于条件来说后面少使用函数或者算数运算;
- 对于
group by语句要先过滤后分组; - 在查询时减少使用
null,所有字段需添加默认值; - 少使用
like,对于需要使用的, 如需要使用尽量用like abc%这种,不要把%放字段前面; - 去除的
distinct过滤字段要少,避免distinct *; - 不要超过 5 个以上的表连接;
2)建立使用合适索引
- 对于高频筛选字段可以适当的建立索引;
- 一个表的索引最好不要超过5个,多了会影响插入修改速度;
- 对于需要多个字段进行排序的可以使用组合索引;
- 使用组合索引一定要遵守最左原则;
- 不要对值是有限重复的字段建立索引,如性别等;
- 使用
explain查看SQL是否命中索引;
3)替代优化
- 对于
exists和in需遵守小表驱动大表,exists需要外表小,in则需要内表小; - 不要使用
not in和<>,这个会破坏索引,not in可以用not exists来代替,<>可以分成两个条件>或者<等; - 使用连接查询代替子查询;
4) 特殊优化
- 强制索引
force index(<索引名>)
MySQL 可能会选择错索引,我们可以通过force index进行矫正
select * from order_info
force index(idx_period)
where period = 202208
order by modified desc limit 0, 10
- 使用联合索引避免
Using filesort,将过滤字段和排序字段一同建立索引
alter table order_info add index idx_period_modified(period, modified)
- 使用覆盖索引解决深翻页问题
为避免无效回表,只使用过滤条件查询id,再通过join进行回表查询
select * from (
select id from order_info where period = 202207 order by modified desc limit 99000, 1000
) temp
join order_info on temp.id = order_info.id
-
在连表查询时,必须保证 ON 两侧字段的排序规则相同
-
多个查询使用了
group by并用union连起来时,可以将group by放至最外层统一分组 -
连表时,必须保证两边字段使用相同的字符集和排序规则。当无法修改成相同时,可以在
SQL使用convert进行转换
select a.id from order_info a
left join t_user u on convert(a.card_id using utf8) COLLATE utf8_general_ci = a.user_id

浙公网安备 33010602011771号