mysql数据库查询好慢解决方法

一、慢查询:MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句

1,slow_query_log
这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。

2,long_query_time
当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。

3,slow_query_log_file
记录日志的文件名。

4,log_queries_not_using_indexes
这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。

设置方法
方法一:全局变量设置
将 slow_query_log 全局变量设置为“ON”状态

mysql> set global slow_query_log='ON'; 

设置慢查询日志存放的位置

mysql> set global slow_query_log_file='/usr/local/mysql/data/slow.log';

查询超过1秒就记录

mysql> set global long_query_time=1;

方法二:配置文件设置
修改配置文件my.cnf,在[mysqld]下的下方加入

[mysqld]
slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

3.重启MySQL服务

service mysqld restart

4.查看设置后的参数


mysql> show variables like 'slow_query%';
+---------------------+--------------------------------+
| Variable_name       | Value                          |
+---------------------+--------------------------------+
| slow_query_log      | ON                             |
| slow_query_log_file | /usr/local/mysql/data/slow.log |
+---------------------+--------------------------------+

mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+mysql> sho

查询好慢解原因分析

1、后台数据库中的数据过多,没做数据优化导致后台查询数据很慢

2、前端数据请求-解析-展示过程处理不当

3、网络问题所致

解决问题

1、缓存,在持久层或持久层之上做缓存

使用ehcache缓存,这个一般用于持久层的缓存,提供持久层、业务层的快速缓存,hibenate默认使用的二级缓存就是ehcache;

2、数据库表的大字段剥离

假如一个表的字段数有100多个,学会拆分字段,保证单条记录的数据量很小;

3、恰当地使用索引

必要时建立多级索引,分析MySQL的执行计划,通过表数据统计等方式协助数据库走正确的查询方式,该走索引就走索引,该走全表扫描就走全表扫描;

4、表的拆分

表分区和拆分,无论是业务逻辑上的拆分(如一个月一张报表、分库)还是无业务含义的分区(如根据ID取模分区);

5、字段冗余

减少跨库查询和大表连接操作;,数据通过单个或多个JOB生成出来,减少实时查询;

7、放弃关系数据库的某些特性。如:引入NoSQL数据库;

换种思路存放数据,例如搜索中的倒排表;

 

写SQL时我们应该注意

1、对查询进行优化,应尽可能避免全表扫描

2、 建立索引查询,首先应考虑在 where 及 order by 涉及的列上建立索引。

3、减少where 字段值null判断,就会导致引擎放弃使用索引而进行全表扫描

4、应尽量避免在 where 子句中使用!=或<>操作符

5、应尽量避免在 where 子句中使用 or 来连接条件

6、in 和 not in 也要慎用,会导致引擎进行全表扫描

7、不要在条件判断时进行 算数运算函数运算等

 

内容整理自网络

你可能感兴趣的:(mysql数据库查询好慢解决方法)