mysql优化常用步骤
2018-03-04 19:01
281 查看
SQL优化
步骤
1,通过show status like 'Com_%' 查询数据库以查询为主还是以更新为主,以及各种sql的大致执行比例是多少,对于事务型的应用,通过Com_commit和Com_rollback可以了解事物提交和回滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。
show status like 'Com_select' ;
show status like 'Com_update' ;
show status like 'Com_delete' ;
show status like 'Com_insert' ;
。。。。
2,通过慢日志查询执行效率较低的sql
3,通过EXPLAIN分析低效SQL的执行计划,通过慢日志查查询到效率较低的sql以后,可以通过EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序,语法如下:
EXPLAIN select sum(amount) from customer a, payment b where 1=1 and a.customer_id = b.customer_id ;
4,通过show profile分析sql
show PROFILES ; -- 查看sql的执行过程
show PROFILE FOR QUERY 77 ; -- 查看sql执行过程中线程的每个状态和耗时
5,通过trace分析优化器如何选择执行计划
6,确定问题并采取相应的优化措施
a>索引:通过以上分析考虑给某些字段增加索引。
常用的sql优化
1,大批量的插入插入数据
2,优化insert语句
如果同一客户插入很多行,应尽量使用多个值表的insert语句,这种方式将大大缩减客户端数据库间的连接、关闭等消耗,使得比执行单个insert语句性能要快,如下:
insert into test values(1,2),(1,3)(1,4)....
如果从客户不同插入很多行,可以使用insert delayed语句得到更高的效率。delayed的意义是让insert语句立即执行,其实数据都存放在了内存的队列当中,并没有写入磁盘,这比每条语句分别插入要快的多。
3,优化order by语句
尽量减少额外的排序,通过索引直接返回索引数据,where条件和order by条件使用相同的索引,并且order by的顺序和索引顺序相同,并且排序字段同为升序或者同为降序。
4,优化group by语句
和优化order by语句类似,如果查询包含group by但是想要避免排序结果的性能消耗,可以使用order by null 禁止排序
5,优化嵌套查询
尽量使用join避免使用where后的子查询,因为join会走索引,但是where条件后的子查询会全表扫描。
6,优化or条件
对于含有or的查询子句,如果要利用索引就需要在or的两边都有索引;如果没有索引则考虑增加索引。
7,优化分页查询
1,在索引上执行分页操作,再根据子查询关联回原表所需要的查询内容。例如:
select a.* from A a inner join (select b.id from B b order by b.cdate limit 50,5) t on a.id = t.id ;
2,把limit查询换成某个位置的查询,例如分页到了41页,当要查询第42页时,可以提前记录41页最后一条记录的ID,比如第41行最后一条记录的ID的2000,sql如下:
select * from A where id > 2000 limit 10 ;
步骤
1,通过show status like 'Com_%' 查询数据库以查询为主还是以更新为主,以及各种sql的大致执行比例是多少,对于事务型的应用,通过Com_commit和Com_rollback可以了解事物提交和回滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。
show status like 'Com_select' ;
show status like 'Com_update' ;
show status like 'Com_delete' ;
show status like 'Com_insert' ;
。。。。
2,通过慢日志查询执行效率较低的sql
3,通过EXPLAIN分析低效SQL的执行计划,通过慢日志查查询到效率较低的sql以后,可以通过EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序,语法如下:
EXPLAIN select sum(amount) from customer a, payment b where 1=1 and a.customer_id = b.customer_id ;
4,通过show profile分析sql
show PROFILES ; -- 查看sql的执行过程
show PROFILE FOR QUERY 77 ; -- 查看sql执行过程中线程的每个状态和耗时
5,通过trace分析优化器如何选择执行计划
6,确定问题并采取相应的优化措施
a>索引:通过以上分析考虑给某些字段增加索引。
常用的sql优化
1,大批量的插入插入数据
2,优化insert语句
如果同一客户插入很多行,应尽量使用多个值表的insert语句,这种方式将大大缩减客户端数据库间的连接、关闭等消耗,使得比执行单个insert语句性能要快,如下:
insert into test values(1,2),(1,3)(1,4)....
如果从客户不同插入很多行,可以使用insert delayed语句得到更高的效率。delayed的意义是让insert语句立即执行,其实数据都存放在了内存的队列当中,并没有写入磁盘,这比每条语句分别插入要快的多。
3,优化order by语句
尽量减少额外的排序,通过索引直接返回索引数据,where条件和order by条件使用相同的索引,并且order by的顺序和索引顺序相同,并且排序字段同为升序或者同为降序。
4,优化group by语句
和优化order by语句类似,如果查询包含group by但是想要避免排序结果的性能消耗,可以使用order by null 禁止排序
5,优化嵌套查询
尽量使用join避免使用where后的子查询,因为join会走索引,但是where条件后的子查询会全表扫描。
6,优化or条件
对于含有or的查询子句,如果要利用索引就需要在or的两边都有索引;如果没有索引则考虑增加索引。
7,优化分页查询
1,在索引上执行分页操作,再根据子查询关联回原表所需要的查询内容。例如:
select a.* from A a inner join (select b.id from B b order by b.cdate limit 50,5) t on a.id = t.id ;
2,把limit查询换成某个位置的查询,例如分页到了41页,当要查询第42页时,可以提前记录41页最后一条记录的ID,比如第41行最后一条记录的ID的2000,sql如下:
select * from A where id > 2000 limit 10 ;
相关文章推荐
- Mysql 优化 - 常用步骤 show processlist
- MySQL架构优化实战系列4:SQL优化步骤与常用管理命令
- MySQL的优化步骤总结
- MySql 学习笔记三:常用SQL优化
- Mysql常用命令七(MySQL的优化方法)
- mysql性能优化简单步骤
- Mysql优化步骤
- MYSQL 优化常用方法
- MySql优化的一般步骤:
- mysql查询优化之一:mysql查询优化常用方式
- MYSQL优化-----常用技术
- MySQL 性能优化及常用命令
- MySQL InnoDB 常用优化参数
- 十二、MySQL中常用的SQL优化 - 系统的撸一遍MySQL
- Mysql常用30种SQL查询语句优化方法
- 浅谈MySQL中优化sql语句查询常用的30种方法
- MySQL中优化sql语句查询常用的30种方法
- MYSQL 优化常用方法
- MySql的优化步骤
- MySql常用30种SQL查询语句优化方法