SQL优化思路
1、首先要避免全表扫描,检查是否有索引
没有索引考虑是否建立索引(可以在经常需要查询的列上、需要排序的列上添加索引),mysql可以通过explain查看执行计划
2、查看索引是否生效(以下是索引失效的部分场景)
不满足最左匹配原则
like以%开头或者全模糊
>、<号右边的索引会失效
or也会导致索引失效(在or的两边都加索引才不会失效或者使用union(去重)、union all(不去重)替代or)
!=、<>也会导致索引失效
在where子句中使用表达式操作、函数操作等
3、sql语句结构的优化
避免使用select*,不要返回不必要的字段,增加索引覆盖的概率
尽量减少子查询(子查询会创建临时表,查询完毕删除临时表)
调整where子句的连接顺序,将过滤数据多的条件放在前面,最快速度缩小结果集
mysql:其条件执行顺序是 从左往右,自上而下;where执行顺序是从左往右执行的,在数据量小的时候不用考虑,但数据量多的时候要考虑条件的先后顺序,
此时应遵守一个原则:排除越多的条件放在第一个
orcale:其条件执行顺序是从右往左,自下而上;由于解析是从下到上进行的,因此应该先编写表联接,然后再执行WHERE子句的任何条件,
并在联接完成后将筛选出最大记录的条件放在最后。
尽量减少联表查询,联表查询是笛卡尔乘积的形式,检索的数据几何倍上升
一次查询的结果最好不要过大,可以使用分页查询
4、数据库表设计的优化
单表的字段最好不要超过20个。如果是比较大的表,有的字段使用的多,有的字段使用比较少,使用频率比较少的会拖慢查询速度
表的结构是否合理(范式、反范式需要结合实际场景来决定)
列类型的选择是否合适(能用int却用了bigint等)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!