首页 > 数据库 >MySQL23 - SQL优化

MySQL23 - SQL优化

时间:2023-01-09 16:35:01浏览次数:45  
标签:COUNT 索引 插入 InnoDB SQL MySQL23 排序 优化 主键

SQL优化

插入数据

  • 批量插入

    • 插入多条数据时,执行批量插入,但批量插入也不建议插入超过1k条

    • 几百万数据时,多次批量插入

    • INSERT INTO table_name VALUES (..) (..) (..) ...;
      
  • 手动事务提交

    • 默认每一条DML语句都会开启\提交一次事务

    • 手动开启事务,将多次插入进行一次提交

    • START TRANSACTION;
      INSERT ..
      INSERT ..
      ...
      COMMIT;
      
  • 主键顺序插入

  • load

    • 将本地磁盘文件的数据直接加载到数据库中,常用于万级、百万级数据

主键优化

  • 在InnoDB存储引擎中,表数据是根据主键顺序组织存放的,称为索引组织表(IOT index organized tabel)
  • 尽量减少页分裂、增多页合并 -- 尽量按序插入
  • 应尽量降低主键的长度,因为二级索引的叶子节点存放主键的值
  • 插入数据时,应尽量选择主键顺序插入,如选择使用 AUTO_INCREMENT 自增主键
  • 尽量不要使用UUID做主键,或其他自然主键,如身份证号,会乱序插入,且长度过长

ORDER BY 排序优化

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

  • Using index:通过有序所有顺序扫描直接返回有序数据,不需要额外排序,操作效率高

  • 尽量使用 Using index => 对有索引的字段进行与其索引相同顺序的排序

  • 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则

  • 尽量使用覆盖索引

  • 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则 (ASC\DESC)

  • 如果不可避免的出现FileSort,大量数据排序时,可以适当增大排序缓冲区大小(默认为256k)


GROUP BY 分组优化

  • 可以通过索引提高效率
  • 分组操作时,索引的使用也是满足最左前缀法则

LIMIT 分页优化

  • 当执行 LIMIT 200_0000, 10时,此时 MySQL 需要排序前 200_0010条记录,仅仅返回 200_0000 ~ 200_0010 的记录,其他记录丢弃,查询排序代价大,性价比低
  • 可以先查询数据的主键,在与查询到的主键数据进行多表联查,返回完整记录

COUNT 求和优化

  • 在MyISAM引擎中,表的总行数被存储在磁盘中,因此执行 COUNT(*) 的时候会直接返回这个数,效率很高

  • InnoDB引擎执行 COUNT(*) 时,需要吧数据一行行得读取,再进行累计计数

  • 优化思路:自己计数存储数据量 。。。

  • COUNT 的主要用法:COUNT( * ) , COUNT( 主键 ) , COUNT( 字段 ) , COUNT( 1 )

  • **COUNT( 主键 ) **

    • InnoDB 引擎会遍历整张表,将 主键id 值都取出来,返回给服务层,直接按行进行累加,主键不为 null ,因此不用判断值是否为 null
  • COUNT( 字段 )

    • 如果没有 NOT NULL 约束,InnoDB 引擎会遍历整张表,将每一行的字段值都取出来,返回给服务层,服务层判断是否为 NULL,不为 NULL,计数累加
    • 有 NOT NULL 约束,InnoDB 引擎会遍历整张表,将每一行的字段值都取出来,返回给服务层,直接按行进行累加
  • COUNT ( 1 )

    • InnoDB 引擎会遍历整张表,但不取值,服务层对于返回的每一行,放一个数字 1 进去,直接按行进行累加
  • **COUNT( * ) **

    • InnoDB 引擎并不会把全部字段取出,而是专门做了优化,不取值,服务层直接按行累加
  • **效率:COUNT( * ) = COUNT ( 1 ) ** > 其他


UPDATE 更新优化

  • Kakfa 避免行锁升级为表锁 ???

标签:COUNT,索引,插入,InnoDB,SQL,MySQL23,排序,优化,主键
From: https://www.cnblogs.com/Ashen-/p/17037415.html

相关文章

  • MySQL统计一个数据库中所有表的数据量
    mysql统计一个数据库里所有表的数据量,最近在做统计想查找一个数据库里基本所有的表数据量,数据量少的通过selectcount再加起来也是可以的,不过表的数据有点多,不可能一个一个......
  • 项目中统计SQL执行缓慢的方案-数据预处理
    使用场景:由于表数据量巨大,导致一些统计相关的sql执行非常慢,使用户有非常不好的体验,并且sql和数据库已经没有优化空间了。(并且该统计信息数据实时性要求不高的前提下)解......
  • SQL211 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
    SQL211获取当前薪水第二多的员工的emp_no以及其对应的薪水salary题目描述有一个薪水表salaries请你获取薪水第二多的员工的emp_no以及其对应的薪水salary,若有多个员工......
  • Unity优化 - 总览
    基于Unity移动端游戏性能优化简谱-UWA整理而得,不定期更新。细节部分可移步UWA相关博文查阅优化总览Q&A图片放大看不清?A.图片右键->新标签页打开图片->放大B.右键......
  • MySQL22 - SQL性能分析
    SQL性能分析SQL执行频率通过SHOW[SESSION|GLOBAL]STATUS命令可以提供服务器状态信息,通过以下指令可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频......
  • DP 及其优化
    DPDP概述线性DP区间DP状压DP数位DP树形DP树形DP树形背包DP优化状态优化缩减状态优化DP套DP(建DAG优化)折半优化状态复用优化长链剖......
  • MySQL21 - 索引
    索引什么是索引索引相当于一本书的目录,为了缩小扫描范围而存在、提高查询效率的一种数据结构一张表的一个字段可以添加索引,多个字段也可以联合起来添加索引在任何数据......
  • MySQL入门之查询操作
    单表查询SELECT[DISTINCT]*|<字段名1,字段名2,字段名3,...> FROM<表名> [WHERE<条件查询表达式1>] [GROUPBY<字段名>[HAVING<条件表达式2>]] [ORDERBY<字段......
  • mysql性能优化explain了解
    总结索引的设计原则:1.**最适合**索引的列是出现在**WHERE子句**和连接子句中的列。2.索引列的基数越大(取值多、重复值少),索引的效果就越好。3.使用**前缀索引**可以......
  • MySQL入门之表和数据的操作
    数据表的操作创建数据表时,要先use数据库名;来确定要操作的数据库。创建数据表CREATE[TEMPORARY]TABLE[IFNOTEXISTS]表名(字段名字段类型[字段属性]...)[表选项]......