优化大批量插入数据
1.主键顺序插入(InnoDB)
2.关闭唯一性校验
在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后SET UNIQUE_CHECKS=1,再恢复唯一性校验,可以提高导入效率。
3.手动提交事务
在导入数据前执行SET AUTOCOMMIT=0,关闭自动提交,到如结束后再设置回来
优化insert语句
1.如果需要对同一张表插入多条数据,应尽量使用多个值表的insert语句,这样会大大减小客户端与数据库之间的连接,关闭等消耗。使得效率比单个insert语句快
2.在事务中进行插入
3.数据有序插入
优化order by语句
两种排序方式
第一种是通过对返回数据进行排序,也就是通常说的filesort排序,所有不是通过索引直接返回排序结果的排序都叫FileSort排序
第二种通过有序索引顺序扫描直接返回有序数据,这种情况为using index,不需要额外排序,操作效率高。
使用覆盖索引进行排序为using index,否则using filesort
1.多字段排序要么都升序要么都降序,否则using filesort
2.多字段排序,排序顺序需和索引顺序一致,否则using filesort
3.尽量减少额外的排序
优化group by语句
group by实际上也同样会进行排序操作,而且与order by 相比,group by主要是多个排序之后的分组操作。所以,group by的实现过程中也可以利用索引
如果查询包含group by但用户想要避免排序结果的消耗,则可以执行order by null 禁止排序
优化嵌套查询
尽量使用join查询,join查询之所以更有效率,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作。
优化or条件
对于包含OR的查询子句,如果要利用索引,则OR之间的每个条件列都必须用到索引,而且不能使用到复合索引;如果没有索引,则应该考虑增加索引。
建议使用union替换or
优化limit分页查询
一般分页查询时,通过创建覆盖索引能够比较好的提高性能。但是如果limit 2000000,10,此时需要mysql排序前20000010记录,仅仅需要返回后10条记录,其他记录丢弃,查询排序的代价非常大。
1.在索引上完成排序分页操作,最后根据主键关联回表查询所需要的其他列内容。
例如:select * from aa,(select id from aa order by id limit 2000000,10) a where aa.id=a.id`在这里插入代码片`
2.该方案适用于主键自增的表,不能出现断层,可以把limit查询转换成某个位置的查询。
例如:select * from aa where id>1000000 limit 10;
使用SQL提示
SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
use index
在查询语句中表名的后面,添加use index来提供希望MySql去参考的索引列表,就可以让MySql不再考虑其他可以使用的索引。
ignore index
表示忽略某个索引
force index
为强制MySql使用一个特定的索引