• 【mysql学习笔记25】sql语句优化


    insert优化

    1.多条单个insert语句可以合并成一条批量插入insert语句。一次插入肯定比多次插入效果好,因为每次插入都需要建立连接。
    2.手动控制事务。因为mysql的事务默认是自动的,每执行一条sql语句都会开启一个事务。
    3.主键顺序插入。这和mysql底层有关。
    4.大批量数据导入不建议使用insert,而是load指令。
    在这里插入图片描述
    #客户端连接服务端时,加上参数–local-infile
    mysql --local-infile -u root -p
    #设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
    set global local_infile = 1;
    #执行load指令将准备好的数据,加载到表结构中
    load data local infile ‘/root/sql1.log’ into table ‘tb_user’ fields terminated by ‘,’ lines terminated by ‘\n’;

    主键优化

    1.在innodb引擎中,表数据是根据主键组织存放的,这种存储方式称为索引组织表(index organized table IOT)
    主键乱序插入时容易发生页分裂,因此应避免乱序插入,或者直接使用自增主键,一劳永逸
    拓展:页合并,当一页中的数据量低于50%时,mysql会尝试合并相邻页,称为页合并
    2.在开发中应该尽量降低主键长度,因为二级索引存的都是主键,逐渐越长占空间越大

    order by优化

    using filesort:把数据放入缓存区,进行排序。
    using index:直接利用索引返回排序结果。
    mysql由于使用了B+Tree索引,容易按顺序遍历数据,索引当order by后面跟的字段有索引时,就不需要额外的排序,使得order by效率提高。
    如果没有使用覆盖索引,那么使用索引排序是不现实的,因为缺少字段,所以需要进行filesort。
    filesort的缓冲是是有大小限制的,如果数据超出了缓冲区就会在磁盘上排序,大大影响性能。
    缓冲区大小是可以调整的。
    在这里插入图片描述

    group by优化

    using temporary:使用临时表分组,效率低
    using index:使用索引分组,效率高

    设表user有(profession,age,status)联合索引
    select profession from user group by profession;#using index
    select age,count(age) from user group by age;#using index;using temporary
    注:前面有一个using index是因为覆盖索引
    select profession , age, count() from tb_user group by profession,age;#using index
    select age, count(
    ) from tb_user where profession = ‘软件工程’ group by age;#using index

    limit优化

    select * from tb_sku limit 2000000,10;
    替换为
    select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = a.id;

    count优化

    myisam引擎使用单独变量记录了表的记录总数,所以count效率很高,前提是没有where
    innodb引擎则需要全表扫描,才能统计数量
    优化思路:自己额外开辟一个地方存储总数量
    count(字段)<count(主键)<count(1)≈count(*)

    update优化

    更新时尽量根据有索引的字段更新,这样子是行锁,否则会变成表锁。

  • 相关阅读:
    MFC中CString的用法及使用示例
    QCSPCChart for Java R3x0 Crack
    第七章:Python匿名函数和装饰器
    闲人闲谈PS之三十一——新收入准则中的合同损失计提
    Python网络物品采购系统毕业设计源码031035
    Vue实现简单的接口封装
    双向带头循环链表的(增删查改)的是实现
    【每日一题】最长回文子序列
    【云原生】Kubernetes----POD控制器
    【C#】RestSharp踩坑日记
  • 原文地址:https://blog.csdn.net/qq_31618549/article/details/125484634