Sql Optimization

ReZero lol

Sql 优化笔记

大批量插入数据优化

  1. 导入的数据按照主键的顺序保存

  2. 导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,带导入之后再打开设置为1:校验会消耗时间,在数据量大的情况下需要考虑。

  3. 导入前设置SET AUTOCOMMIT=0,关闭自动提交,导入后结束再设置为1

  4. 尽量使用多个值表的 INSERT 语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗。

  5. 如果在不同客户端插入很多行,可使用INSERT DELAYED语句得到更高的速度,DELLAYED含义是让INSERT语句马上执行,其实数据都被放在内存的队列中。并没有真正写入磁盘。LOW_PRIORITY刚好相反。

  6. 将索引文件和数据文件分在不同的磁盘上存放

  7. 当从一个文本文件装载一个表时,使用LOAD DATA INFILE,通常比INSERT语句快20倍

Group by

  1. 默认排序,不使用ORDER BY NULL时:有明显的Using filesort

Order by

  1. WHERE 条件和OREDR BY 使用相同的索引:即key_part1与key_part2是复合索引,where中使用复合索引中的key_part1

    SELECT*FROM user WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;

  2. 而且ORDER BY顺序和索引顺序相同:

    SELECT*FROM user ORDER BY key_part1, key_part2;

  3. 并且要么都是升序要么都是降序:

    SELECT*FROM user ORDER BY key_part1 DESC, key_part2 DESC;

  4. 但以下几种情况则不使用索引:

  • ORDER BY中混合ASC和DESC:

    SELECT*FROM user ORDER BY key_part1 DESC, key_part2 ASC;

  • 查询行的关键字与ORDER BY所使用的不相同,即WHERE 后的字段与ORDER BY 后的字段是不一样的

    SELECT*FROM user WHERE key2 = ‘xxx’ ORDER BY key1;

  • ORDER BY对不同的关键字使用,即ORDER BY后的关键字不相同

    SELECT*FROM user ORDER BY key1, key2;

查询缓存

静态配置表等不是经常更新的表建议可用查询缓存

Sql 执行过程

  • Post title:Sql Optimization
  • Post author:ReZero
  • Create time:2020-07-04 11:10:00
  • Post link:https://rezeros.github.io/2020/07/04/sql-optimize/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
 Comments