大批量插入数据优化
1、主键顺序插入
2、关闭唯一性校验(索引)
导入数据前,执行 SET UNIQUE_CHECKS=0,关闭唯一性校验;
导入完成后,执行 SET UNIQUE_CHECKS=1,恢复唯一性校验。
3、手动提交事务
导入数据前,执行 SET AUTOCOMMIT=0,关闭自动提交;
导入完成后,执行 SET AUTOCOMMIT=1,开启自动提交。
insert优化
1、多条insert语句合并成1条insert执行,减少客户端与数据库之间的连接、关闭等消耗。
例如:INSERT INTO `t_user` VALUES ('1', 'zs');
INSERT INTO `t_user` VALUES ('2', 'ls');
INSERT INTO `t_user` VALUES ('3', 'ww');
优化后:INSERT INTO `t_user` VALUES ('1', 'zs'),('2', 'ls'),('3', 'ww');
2、事务提交改成手动提交。
3、数据有序插入
例如:INSERT INTO `t_user` VALUES ('3', 'ww');
INSERT INTO `t_user` VALUES ('2', 'ls');
INSERT INTO `t_user` VALUES ('1', 'zs');
优化后:INSERT INTO `t_user` VALUES ('1', 'zs');
INSERT INTO `t_user` VALUES ('2', 'ls');
INSERT INTO `t_user` VALUES ('3', 'ww');
order by优化
两种排序:filesort和using index
1、filesort排序,效率低
2、using index排序,通过有序索引顺序扫描直接返回有序数据
尽量减少额外排序,通过索引直接返回有序数据。where条件和order by使用相同索引,并且order by的顺序 与索引顺序相同,同时order by的字段都是升序或者降序,否则会出现额外的操作。
filesort优化:适当提高sort_buffer_size和max_length_for_sort_data系统变量,来增大排序区大小,提高排序效率。
group by优化
对于包含group by的查询语句,可以添加order by null来避免排序结果的消耗,同时可通过创建索引来提高效率。
嵌套查询优化
所表关联查询替代子查询
or条件优化
建议使用union替换or,union优于or
分页查询优化
在索引上完成排序分页操作,最后根据主键关联查询所需的其他列
例如:select * from t_user limit 2000,10;
优化后:select * from t_user t,(select uid from t_user order by uid limit 2000,10)a
where t.uid=a.uid;
使用SQL提示
1、use index
使用use index提供希望MySQL去参考的索引列表。
例如:id_user_name为t_user表的索引,如果希望MySQL去参考这个索引,可以编写如下:
select * from t_user use index(id_user_name) where name='zs';
2、ignore index
使用ignore index,希望MySQL去忽略的索引列表。
例如:id_user_name为t_user表的索引,如果希望MySQL去参考这个索引,可以编写如下:
select * from t_user ignore index(id_user_name) where name='zs';
3、force index
强制MySQL使用一个特定索引。