SQL优化
Insert优化
- 批量插入
Insert into emp values(1,'tom'),(2,'mike'),(3,'john');
- 手动提交事务
start transaction;
、commit;
- 主键顺序插入,
1 2 3 4 5 6 7...
- 大批量插入数据,Insert性能较低,可以使用
load
指令,使用指令:
#客户端连接服务器,加上参数--local-infile
mysql --local-infile -u root -p
#设置全局参数local_infile为1,开启从本地加载文件导入数据的开关
set global local_infile = 1;
#执行load指令将准备好的数据加载到表结构中
load data local infile '/root/sql1.log' into table 'emp' fields terminated by ',' lines terminated by '\n';
主键优化
-
在InnoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表(index organized table, IOT),默认主键索引为聚集索引
-
页可以为空,也可以填充一半或100%,每个页包含了2-N行数据,根据主键排列
-
主键顺序插入:
-
页分裂,主键乱序插入:
-
页合并,当删除一行记录时,实际上并未被物理删除,只是被标记(flagged)为删除,并且其空间变得允许被其他记录声明使用
-
主键设计原则:
- 满足业务需求下,尽量降低主键长度
- 插入数据时,尽量选择顺序插入,使用AUTO_INCREMENT自增主键
- 尽量不要使用UUID作主键或者是其他自然主键,如身份证号(会乱序插入,且长度长)
- 业务中,尽量避免对主键的修改
order by优化
- Using filesort:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫FileSort排序
- Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高
- 根据排序字段建立合适的索引,多字段排序时,也遵循最前缀法则
- 尽量使用覆盖索引
- 多字段排序,一个升序一个降序,此时需要注意联合索引在创建时的规则
- 如果不可避免出现filesort,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认为256K)
- 一种现象思考:当使用联合索引时,如果联合索引为tb(age,professsion),当根据order by profession排序时,不符合最左前缀法则,会同时出现Using index和Using filesort,原因是age包含在复合索引中,会进行覆盖索引,但是无法直接根据B+tree索引有序性进行排序(age二级索引下无)