• SQL 优化


    插入数据

    1. -- 客户端连接服务端时,加上参数 -–local-infile
    2. mysql –-local-infile -u root -p
    3. -- 查询全局参数 local_infile 默认是0
    4. select @@local_infile;
    5. -- 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
    6. set global local_infile = 1;
    7. -- 执行load指令将准备好的数据,加载到表结构中 文件中字段以,分割,行以换行分割
    8. load data local infile '/root/load_user_100w_sort.sql' into table tb_user fields terminated by ',' lines terminated by '\n' ;

     可以看出使用load用时16秒多,如果使用insert可以需要数分钟。注意 “load时,主键顺序插入性能高于乱序插入

    主键优化

    主键按顺序插入

     主键乱序插入 

    页分裂

    主键乱序插入时,可能出现页分裂的情况

    1.当插入一个id=50的数据,这时第一个page剩余的容量不够存储

     2.则申请一个新的page

     3,将1#page从50%处分割,分割后后半部分,移动到新的page中

     4.把新插入的id=50的数据追加到新的page中

     

    5.需用重新设置每个page的,双向链表

     以上的5步,就是在乱序插入可能发生的页分裂情况,所以批量插入时,推荐按照主键顺序插入。

    页合并

    1.当行数据被删除时,没有物理删除,只是被标记,例如图中的13,14,15,16

    2.当page被标记删除的数据已经超过容量的50%,则会查看前后的page是否有容量少于50%,可以合并的page,如果有则,移动数据到2#page中

     3.如果在插入新的数据则会在#page中插入,这种动态移动行数据的被称为页合并

    MERGE_THRESHOLD 表示 合并的上限的阀值

     主键设计的原则

    Order by 优化

     Mysql的排序有两种方式

    Using filesort : 通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区 sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。

    Using index : 通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index,不需要额外排序,操作效率高。对于以上的两种排序方式,Using index的性能高,而Using filesort的性能低,我们在优化排序 操作时,尽量要优化为 Using index

    实例:

     升序、降序的索引结构图

    由上述的测试,我们得出order by优化原则:
    A. 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
    B. 尽量使用覆盖索引。
    C. 多字段排序, 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
    D. 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小
    sort_buffer_size(默认256k)

     

    Group by 优化

    所以,在分组操作中,我们需要通过以下两点进行优化,以提升性能:
    A. 在分组操作时,可以通过索引来提高效率。
    B. 分组操作时,索引的使用也是满足最左前缀法则的。

    Limit 优化

    在数据量比较大时,如果进行 limit 分页查询,在查询时,越往后,分页查询效率越低。
    我们一起来看看执行 limit 分页查询耗时对比:

     

    Count 优化

     

     

    update优化

     行锁升级成表锁的原因是,where的条件,没有设置索引,所以需要全表扫描,所以会升级锁,如果name存在索引,则数据库可以定位到一行,只会使用行锁进行更新操作。

     总结

     

     

     

     

  • 相关阅读:
    【Django-GAGA系统】添加用户时自动追加权限-20220801
    Ansys Zemax | 大功率激光系统的STOP分析2:如何进行光机械设计准备
    【牛客刷题】每日一练—反转链表
    智慧经营| 物业数字化管理系统
    面向Java开发者的ChatGPT提示词工程(8)
    【JVM】对象创建与访问
    网页图标工具
    【原创】旧手机上安装Linux操作系统(未完。。。)
    从零开始做一个SDWAN
    计算机毕业设计springboot驾照一点通的设计与实现02bpd源码+系统+程序+lw文档+部署
  • 原文地址:https://blog.csdn.net/qq_33753147/article/details/126783315