【mysql篇-进阶篇】SQL优化

文章目录

      • 插入数据
      • 主键优化
      • order by优化
      • group by优化
      • limit优化
      • count优化
      • update优化(避免行锁升级为表锁)

插入数据

  • insert:如果一次性向数据库插入多条数据记录,可以从以下三个方面进行优化。
  • 优化方案一:
    批量插入数据:insert into 表名 values(值1,值2…),(值1,值2…),(值1,值2…);
  • 优化方案二:
    手动控制事务
    start transaction;
    insert into 表名 values(值1,值2…),(值1,值2…),(值1,值2…);
    commit;
  • 优化方案三:
    主键顺序插入,性能高于乱序插入。
  • load指令:如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用mysql数据库提供的load指令进行插入。
  • 客户端连接服务端时,加上参数 --local-infile
    mysql --local-infile -uroot -p
    【mysql篇-进阶篇】SQL优化_第1张图片
  • 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
    set global local_infile=1;
    【mysql篇-进阶篇】SQL优化_第2张图片
    在这里插入图片描述
  • 执行load指令将准备好的数据,加载到表结构中
    load data local infile ‘/root/sql1.log’ into table 表名 fields terminated by ‘,’ lines terminated by ‘\n’ ;
    【mysql篇-进阶篇】SQL优化_第3张图片

主键优化

order by优化

  • mysql的排序,有两种方式:
  • Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作;所有不是用过索引直接返回排序结果的排序都叫FileSort排序。
  • Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为Using index;操作效率高。
  • 实例:
  • (1)先查看这个表中有哪些索引;
    在这里插入图片描述
  • (2)根据普通字段进行查询,显示为Using filesort在这里插入图片描述
  • (3)创建联合索引在这里插入图片描述
  • (4)再次进行查询,走了索引;显示Using index
    在这里插入图片描述
  • (5)联合索引也要遵循最左前缀原则
    在这里插入图片描述

group by优化

  • (1)查看表中索引
    在这里插入图片描述
  • (2) 执行没有索引的字段
    在这里插入图片描述
  • (3)建立联合索引
    在这里插入图片描述
  • (4) 使用联合索引执行
    在这里插入图片描述
  • 分组操作进行下面的优化,来提升性能:
    (1)通过索引提高效率;
    (2)联合索引的使用满足最左前缀原则。

limit优化

  • 数据量较大时,如果进行limit分页查询;在查询时,分页查询效率会越来越低。

  • 优化思路:一般通过分页查询时,通过创建覆盖索引能够比较好的提高性能;可以通过覆盖索引加子查询的方式进行优化。
    -

count优化

  • 按照效率排序:count(字段) < count(主键 id) < count(1) ≈ count(),所以尽
    量使用 count(
    )。
    【mysql篇-进阶篇】SQL优化_第4张图片
    【mysql篇-进阶篇】SQL优化_第5张图片
  • innodb与myisam的区别:
  • myisam:把一个表的总行数存在了磁盘上,执行count(*)的时候,效率高;
  • innodb:执行count(*)时,需要把数据一行一行的从引擎里面读出来,让然后累加计数。

update优化(避免行锁升级为表锁)

  • 当执行update语句的时候,如果条件为主键索引,则是行锁。事务提交之后,行锁释放。
  • 当执行update语句的时候,如果条件为二级索引,则会升级为表锁,性能降低。

你可能感兴趣的:(mysql,sql,数据库)