码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • SQL优化复习


    目录

    • SQL优化
      • 1、Mysql层优化五个原则
      • 2、SQL执行顺序
      • 3、优化策略(不走索引)
        • 3.1、避免like不走索引
        • 3.2、避免使用in和not in
        • 3.3、避免使用or
        • 3.4、避免null值判断
        • 3.5、避免在where关键字等号的左边进行表达式、函数操作等
        • 3.6、条件查询不能使用<>或者!=
        • 3.7、避免where条件仅包含复合索引非前置列
        • 3.8、隐式类型转换不能使用索引
        • 3.9、order by 条件与where 条件
      • 4、Select优化
      • 5、增删改优化
      • 6、查询条件优化

    SQL优化

    为什么SQL优化这么重要?

    答:SQL优化是提高系统性能性价比最高的一种方式

    • 优化成本:硬件>系统配置>数据库表结构>SQL及索引。
    • 优化效果:硬件<系统配置<数据库表结构

    1、Mysql层优化五个原则

    五个原则

    • 减少数据库访问
    • 返回更少数据
    • 减少交互次数
    • 减少服务器CPU开销
    • 利用更多资源

    总结

    • 尽可能利用索引
    • 避免全表扫描
    • 减少无效查询

    2、SQL执行顺序

    语法顺序

    1. SELECT 
    2. DISTINCT <select_list>
    3. FROM <left_table>
    4. <join_type> JOIN <right_table>
    5. ON <join_condition>
    6. WHERE <where_condition>
    7. GROUP BY <group_by_list>
    8. HAVING <having_condition>
    9. ORDER BY <order_by_condition>
    10.LIMIT <limit_number>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    从from表名

    根据条件on,连接其他表

    根据联表(虚表)的结果where

    对虚表的筛选结果进行分组group by

    再使用having关键字对分组结果进行筛选

    select

    distinct

    order by

    limit

    3、优化策略(不走索引)

    3.1、避免like不走索引

    模糊查询会导致数据库引擎放弃索引进行全表扫描

    原SQL

    select * from user where username like '%李%'
    
    • 1

    优化方式:尽量在字段后面使用模糊查询

    select * from user where username like '李%'
    
    • 1

    3.2、避免使用in和not in

    使用该关键字会导致引擎走全表扫描

    原SQL

    select * from user where id in (2,3)
    
    • 1

    优化方式:使用between或者exists关键字代替

    3.3、避免使用or

    使用or关键字会导致数据库引擎放弃索引进行全表扫描

    原SQL

    select * from user where id=1 or id=3
    
    • 1

    优化方式:使用union代替or

    select * from user where id=1
    union
    select * from user where id-3
    
    • 1
    • 2
    • 3

    3.4、避免null值判断

    进行null值判断,会导致数据库引擎放弃索引进行全表扫描

    原SQL

    select * from user where score = null
    
    • 1

    优化方式:设计数据表时给字符设置默认值,例如0,对0值进行判断

    3.5、避免在where关键字等号的左边进行表达式、函数操作等

    会导致数据库引擎放弃索引进行全表扫描

    原SQL

    select * from user where score/10 = 9
    
    • 1

    优化

    select * from user where score = 10*9
    
    • 1

    3.6、条件查询不能使用<>或者!=

    3.7、避免where条件仅包含复合索引非前置列

    复合(联合)索引:part1/part2/part3三列,但是sql语句where条件未包含part1,按照Mysql联合索引的最左匹配原则,不会走联合索引

    select * from user where part2=1 and part3=2
    
    • 1

    3.8、隐式类型转换不能使用索引

    假设keyPart字段为字符类型,但给定的是数值,涉及隐式类型转换,不能走索引

    select * from user where keyPart = 123
    
    • 1

    3.9、order by 条件与where 条件

    两者的条件要一致,否者order by 不会利用索引进行排序

    4、Select优化

    • 避免使用 select *
    • 多表联查,小表在前,大表在后
    • 使用表别名,表的别名前缀每个列名上,减少解析时间
    • 用were代替having,从二者的执行顺序来进行考虑

    总结:在查询过程中尽可能缩小结果集

    5、增删改优化

    • 插入操作:一条insert语句插入多条值更优,减少了sql语句的解析,sql语句短,减少网络传输的IO

    6、查询条件优化

    • 复杂查询使用中间临时表,暂存数据
    • 优化group by,默认情况下会对分组结果进行排序
    • join效率由于子查询
    • 如果业务不需要尽量使用union all代替union
  • 相关阅读:
    机器视觉自动数据标注方法
    生活总是自己的,请尽情打扮,尽情可爱,,
    ES证书过期替换方案
    使用Spring Web Flow—Spring Web Flow的配置
    Django-(3)
    如何理解Python中的self变量?
    Unity 向量计算、欧拉角与四元数转换、输出文本、告警、错误、修改时间、定时器、路径、
    开发、部署系统环境 - Linux 环境(ubuntu)
    GTS 中testPersistentProcessMemory fail 详解
    Android网络安全配置:允许明文HTTP通信的正确姿势20240418
  • 原文地址:https://blog.csdn.net/qq_48575500/article/details/127434382
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号