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
作者:revil
出处:https://www.cnblogs.com/revil/p/16721068.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!