目录
在上一期说到索引的使用,这期来聊一下SQL优化,也是平常写SQL的时候常用到的。
1、批量插入数据
在前几期也有聊到过批量插入数据的方法,例如insert ... select...,select ... into,数据量到达百万级时效率也会打折扣,此时可以使用MySQL提供的load指令插入。
1.1 linux环境下
1.1.1 开启文件读取
首先查看mysql是否开启了支持读取本地文件:
show global variables like '%local_infile%';
可以看到ON,说明默认开启了文件读取。
手动开启:set global local_infile=1;
1.1.2 load数据
load data local infile '要加载的文件路径' into table target_table。
target_table目标表结构需要与源文件格式一致。
1.2 windows环境下
windows下使用load指令加载可能会出现问题,源文件路径格式可能会存在问题,推荐使用可视化工具自带的导入功能,使用默认选项一路点击“下一步”到结束。
2、order by优化
先来看下当前表tb_user索引的情况:
当前除了主键外没有任何索引,我们先来验证一下没有索引的情况:
explain select id,age from tb_user order by age;
explain select id,phone from tb_user order by phone;
可以看到两条查询都没有用到索引。
Extra:Using filesort:所有不是通过索引返回排序结果的都叫filesort排序。
2.1 最左前缀
给age和phone添加联合索引:
create index idx_age_phone on tb_user(age,phone);
添加了联合索引后,只要查询覆盖索引且符合最左前缀原则,都不会回表。
explain select age,phone from tb_user group by age,phone;
3、group by
3.1 最左前缀
使用group by也是要遵守最左前缀原则:
explain select age,phone from tb_user group by age,phone;
4、count优化
按照效率排序,count(字段) < count(主键 id) < count(1) ≈ count()。
所以尽量使用 count(*)。
5、or条件优化
条件之间用到or,则两个条件都需要有索引。
explain select age,phone from tb_user where age='31' or phone='17799990023';
推荐阅读: