Sql Optimization
Sql 优化笔记
大批量插入数据优化
导入的数据按照主键的顺序保存
导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,带导入之后再打开设置为1:校验会消耗时间,在数据量大的情况下需要考虑。
导入前设置SET AUTOCOMMIT=0,关闭自动提交,导入后结束再设置为1
尽量使用多个值表的 INSERT 语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗。
如果在不同客户端插入很多行,可使用INSERT DELAYED语句得到更高的速度,DELLAYED含义是让INSERT语句马上执行,其实数据都被放在内存的队列中。并没有真正写入磁盘。LOW_PRIORITY刚好相反。
将索引文件和数据文件分在不同的磁盘上存放
当从一个文本文件装载一个表时,使用LOAD DATA INFILE,通常比INSERT语句快20倍
Group by
- 默认排序,不使用ORDER BY NULL时:有明显的Using filesort
Order by
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;
而且ORDER BY顺序和索引顺序相同:
SELECT*FROM user ORDER BY key_part1, key_part2;
并且要么都是升序要么都是降序:
SELECT*FROM user ORDER BY key_part1 DESC, key_part2 DESC;
但以下几种情况则不使用索引:
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.