MySQL优化(SQL优化)
前导内容:MySQL索引篇
一、SQL优化
1.插入优化
1.单条插入效率较低我们使用批量插入
2.手动提交事物
3.按主键的顺序插入
大批量数据插入使用load命令可以大大提升效率
mysql --local-infile -u root -p #客户端连接服务器
set global local_infile = 1; #设置全局参数为1,开启本地文件导入数据的开关
load data local infile '文件路径' into table '表名' fields terminated by "字段分割符" lines terminated by '行分隔符'
2.主键优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Knz0WJP-1645689869423)(C:\Users\89737\AppData\Roaming\Typora\typora-user-images\image-20220224150754259.png)]
页分裂:在innodb存储引擎中,数据按主键顺序存储,那么如果乱序存储的话就会造成页分裂。
加入第一页和第二页数据满了。那么下一个数据的主键顺序应该在第一页和第二页中间,此处使用页分裂,将第一页的后一半放入第三页然后在拼上需要插入的数据,随后 改变链表结构,让页1的下一个指向页3,在下一个指向页2,这样就保证了主键数据的顺序
如下图:
页合并:是指加入相邻页的数据量小于50%(可以调整)的话,innodb就将两个页合并
3.order by优化
效率:using index > using filesort
使用order by 排序的时候 ,如果没有索引那么会在排序缓冲区完成排序,若有索引则会通过顺序扫描直接返回有序数据
因为存储默认顺序是升序,所以当我们降序的时候会显示backword index scan 表示倒序扫描,
但是如果一个升序一个降序或者不满足最左前缀法则的话我们就会出现using filesort
查询使用索引都是覆盖索引
4.group by优化
尽量使用联合索引
满足最左前缀法则
5.limit 优化
大数据量情况下由于会先进行排序后进行查询效率较慢
解决办法:覆盖索引+子查询
6.count优化
count(*)效率最高,不取值直接累加
7.update优化
#注意点:innodb引擎是行级锁
begin;
update ... . .. . where #此时后面条件若没有索引相当于会使用表锁锁住,会大大降低并发的效率
commit;