1. 数据库优化的目的
1)数据库慢速查询,解决界面内容加载不出来;
2. 定位问题
2.1 慢查日志
慢查日志呢就是MySQL日志查询比较慢的SQL语句的日志。详细的记录了所有的超过某一时间的SQL语句。
#mysql-slow
log-slow-queries=d:/mysql-slow.log
long_query_time=0
log-queries-not-using-indexes
# Time: 170319 14:59:38
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 0 Lock_time: 0 Rows_sent: 2 Rows_examined: 2
select* from t_user limit 2;
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 0 Lock_time: 0 Rows_sent: 15 Rows_examined: 305
SELECT QUERY_ID, SUM(DURATION) AS SUM_DURATION FROM INFORMATION_SCHEMA.PROFILING GROUP BY QUERY_ID;
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 0 Lock_time: 0 Rows_sent: 16 Rows_examined: 307
SELECT STATE AS `Status`, ROUND(SUM(DURATION),7) AS `Duration`, CONCAT(ROUND(SUM(DURATION)/0.000490*100,3), '%') AS `Percentage` FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID=26 GROUP BY STATE ORDER BY SEQ;
2.2 explain分析低效SQL执行计划
我们可以通过 explain 或者 desc 获取MySQL 如何执行 SELECT 语句的信息,包括 select 语句执行过程表如何连接和连接的次序。explain 可以知道什么时候必须为表加入索引。
3. 解决问题
3.1索引问题
1)以%开头的LIKE查询不能够使用BTree索引。
2)数据类型出现隐式转换的时候也不会使用索引。特别是类型为数值时,一定要在where条件后加上引号。
3)符合索引的情况下,查询条件不包含索引列最左部分,即不满足最左原则不会使用符合索引。
4)用or分割开的条件,如果or前有索引,or后没有索引则不使用索引。
3.2MySQL排序方式
1)通过有序索引顺序扫描直接返回有序数据。explain时显示的时using index,不需要额外的排序,效率高。
2)通过对返回结果进行拍戏,filesort排序,所有不是通过索引直接返回排序结果的排序都叫filesort。
3.3SQL优化
1)插入数据
insert into table values (),(),()...
2)order by
3.2中提到了MySQL的排序方式,order by的字段考虑创建索引。
where条件和order by使用相同的索引;并且order by的字段都是升序或都是降序。
3)group by
添加order by null禁止排序来提高效率。
4)or
所有条件都需要建立索引。