SQL 优化

1)基本写法优化#

  1. 少使用select *,尽量使用具体字段;
  2. 对于条件来说等号之类两边的字段类型要一致,字符串不加单引号索引会失效;
  3. 对于条件来说后面少使用函数或者算数运算;
  4. 对于group by语句要先过滤后分组;
  5. 在查询时减少使用null,所有字段需添加默认值;
  6. 少使用like,对于需要使用的, 如需要使用尽量用like abc%这种,不要把%放字段前面;
  7. 去除的distinct过滤字段要少,避免distinct *
  8. 不要超过 5 个以上的表连接;

2)建立使用合适索引#

  1. 对于高频筛选字段可以适当的建立索引;
  2. 一个表的索引最好不要超过5个,多了会影响插入修改速度;
  3. 对于需要多个字段进行排序的可以使用组合索引;
  4. 使用组合索引一定要遵守最左原则;
  5. 不要对值是有限重复的字段建立索引,如性别等;
  6. 使用explain查看SQL是否命中索引;

3)替代优化#

  1. 对于existsin需遵守小表驱动大表,exists需要外表小,in则需要内表小;
  2. 不要使用not in<>,这个会破坏索引,not in可以用not exists来代替,<> 可以分成两个条件>或者<等;
  3. 使用连接查询代替子查询;

4) 特殊优化#

  1. 强制索引 force index(<索引名>)
    MySQL 可能会选择错索引,我们可以通过 force index 进行矫正
select * from order_info
force index(idx_period)
where period = 202208
order by modified desc limit 0, 10
  1. 使用联合索引避免Using filesort,将过滤字段和排序字段一同建立索引
alter table order_info add index idx_period_modified(period, modified)
  1. 使用覆盖索引解决深翻页问题
    为避免无效回表,只使用过滤条件查询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
  1. 在连表查询时,必须保证 ON 两侧字段的排序规则相同

  2. 多个查询使用了group by并用union连起来时,可以将group by放至最外层统一分组

  3. 连表时,必须保证两边字段使用相同的字符集和排序规则。当无法修改成相同时,可以在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 国际」许可协议进行许可。

posted @   多久会在  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示