一:常用SQL的优化
1,优化大批量insert语句
- 因为innodb类型的表是按照主键的顺序进行保存的,所以导入数据安装主键的顺序排列,可以有效的提高导入数据的效率。
- 在导入数据前执行SET unique_checks = 0,关闭唯一性校验,再导入结束后执行SET unique_checks = 1,恢复唯一性校验,可以提高导入速度。
- 如果应用是使用自动提交的方式,建议在导入前设置set autocommit=0,关闭自动提交,导入结束后再执行set autocommit=1,打开自动提交。可以提高导入效率
- 如果从统一客户导入数据,尽量使用如下格式
insert into test values(1,2),(2,3),(6,7)
不要使用
insert into test values(1,2)
insert into test values(2,3)
insert into test values(6,7)
因为第一种方式大大减少了客户端和数据库的连接时间,关闭等消耗。
2,优化order by语句
mysql的排序方式分2种分别是
- 通过索引排序
- 通过Filesort排序
了解了mysql排序方式,优化目标就清晰了:尽量减少额外的排序,通过索引直接返回有序数据。
3,优化group by语句
默认情况下,mysql对所有group by col1,col2,.....的字段进行排序,这与在查询中制定order by col1,col2。。。类似,因此,如果显式包括一个包含相同列的order by 子句,则对mysql的实际性能没有影响,如果查询包含group by 但用户想要避免排序带来的性能消耗,则可以制定order by null禁止排序。
4,优化嵌套查询
子查询,可以使用select语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另外一个查询中,使用子查询可以一次性地完成很多逻辑上需要多个步骤才能完成的sql操作,同时也可以避免事务或者表死锁,并且写起来也很容易,但是,在某些情况下一个子查询可以用更加效率的join替代。连接(join)之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上需要2个步骤的工作。
5,MySQL如何优化OR条件
对于含有or的查询子句,如果要利用索引,则OR间的每个条件都必须使用索引,如果没有索引,则该考虑增加索引。
6,优化分页查询
方式一:在索引上完成排序分页的操作,左后根据主键关联回原表查询所需要的其他列内容,例如,对电影表film根据标题title排序后取某一页的数据,直接查询的时候,能够从Explain的输出结果中看到优化器实际做了全表扫描,处理效率不高:
修改后的语句
第二种优化思路
和开发人员协商,翻页的过程中增加一个参数,last_page_record,用来记录上一页最后一行的id,假设id是15460查询sql可以是
select payment_id from payment where payment_id < 15460 order by payment_id desc limit 10。