`
qdpurple
  • 浏览: 272671 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql 慢查询解决之路

阅读更多

任务: 生产库慢查询日志, 显示有1个查询 耗时3s 以上. 需要解决.

 

  •  1. 了解mysql慢查询

mysql 慢查询功能,可以检测到所有数据库操作记录,当操作时间>设定的时间时,将记录操作sql语句等信息.保存到文件中.

 

1.1 开启服务 

 

mysql> show variables like '%slow%';
+---------------------+---------------------------------+
| Variable_name       | Value                           |
+---------------------+---------------------------------+
| log_slow_queries    | OFF                             |
| slow_launch_time    | 2                               |
| slow_query_log      | OFF                             |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+---------------------+---------------------------------+
4 rows in set (0.00 sec)

 off,表示关闭, 开启(global必须)

 

 

mysql> set global log_slow_queries=1;
Query OK, 0 rows affected, 1 warning (0.15 sec)

 开启后, slow_query_log 自动为on.

 

1.2 设置慢查询时间间隔

显示变量

 

mysql> show variables like '%long%';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| long_query_time    | 10.000000 |
| max_long_data_size | 1048576   |
+--------------------+-----------+

 设置为慢查询阈值为2s.

 

mysql> set global long_query_time=2;
Query OK, 0 rows affected (0.00 sec)

 此处需注意,

1). 必须使用global, 否则只是当前会话值. 

2). 设置成功后,需重新建立连接, web应用的话,需重启. --此处在实践中,困扰较长时间,设置后,在web应用调用并不能记录. 原因在此. 

 

1.3 慢查询日志

# Time: 130812 18:43:52
# User@Host: epl[epl] @  [192.168.1.73]
# Query_time: 4.644414  Lock_time: 0.000250 Rows_sent: 0  Rows_examined: 1226476
SET timestamp=1376333032;
select                                                         
   	distinct a.id as id ,                                                 
.................

 其中, Query_time: 4.644414. 说明此查询的时间为4.6 以上. 

 

  • 2. mysql 分析工具使用

2.1 explain使用

explain +sql. 可以分析此sql执行的顺序, 使用索引, 扫描表数据等情况.

具体可搜索相关资料, explain结果,都能对优化有重要参考作用.如 select type, type, extra...

如:http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html

 

id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	PRIMARY	b	index	idx_content_lang	idx_content_lang	5		3340	Using where; Using index; Using temporary; Using filesort
1	PRIMARY	a	eq_ref	PRIMARY	PRIMARY	4	slow_test.b.contentId	1	Using where
3	DEPENDENT SUBQUERY	p	ALL	PRIMARY				1681	Using where; Using temporary
3	DEPENDENT SUBQUERY	pc	eq_ref	idx_product_content	idx_product_content	8	slow_test.p.id,func	1	Using where
2	DEPENDENT SUBQUERY	pc	eq_ref	idx_product_content	idx_product_content	8	const,slow_test.a.id	1	Using index

 从中,有几点重要信息.

type, 可看到id=3 ,table=p,的type=ALL, 表示全表扫描. 从sql中,查询p的语句如下:

 and a.id in(
		    	select distinct pc.contentId from  product_content pc,ssports.product p 
		    	where pc.productId=p.id and p.state='reviewed'
		    	and p.status = 0
		    	and pc.status = 0
		    )

 以上使用了子查询. (关于mysql 子查询效率问题可以单独google).

子查询使用了临时表(Extra 信息中的 Using temporary).

而查看表结构, contentId在表p 中并未加索引. 

 

  • 3. 解决办法

contentId 添加索引.

 经测试, 查询在0.1s之内. 

问题初步解决.

 另 也尝试了profile. 但遇到了疑惑的问题. 下次再分享.

 

  • 4. 问题总结

之前没有做过sql 方面的优化,  经过一天的查资料学习. 最终解决了问题. 体验到作为程序员的成就感. 但mysql 的优化涉及的面还是很广的.

这篇文章只是myslq 优化的冰山一角. 

google下 mysql优化,有太多的好文章. 需慢慢学习ing.

 

如下: http://www.oicto.com/mysql-explain-show/

 

2
5
分享到:
评论
1 楼 lvwenwen 2013-08-22  
google下 mysql优化,有太多的好文章

相关推荐

    解决MySql大数据Like查询慢的问题

    MySql查询数据慢可以用用这个工具,瞬间提升Like查询效率

    45-MySQL单表2000万数据查询慢解决方案1

    45-MySQL单表2000万数据查询慢解决方案1

    如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。非常急人,有没有办法可以解决局域网内mysql数据库连接慢呢?下面小编带领大家来解决此问题,感兴趣的朋友一起看看吧

    Linux mysql访问慢

    Linux上的mysql数据库通过navicat工具访问很慢,但是ping确很快,配置相关文件解决,配置后需要重启数据库服务

    详解MySql的慢查询分析及开启慢查询日志

    在小伙伴们开发的项目中,对于MySQL排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MYSQL的慢查询以及没有得用索引的查询。 接下来教大家如何开启MySQL5.0版本以上的慢查询日志记录; OK,一起开始找出mysql...

    MySQL 导入慢的解决方法

    导入注意点:使用phpmyadmin或navicat之类的工具的导入功能还是会相当慢,可以直接使用mysql进行导入导入命令如下:mysql> -uroot -psupidea jb51.net<E> -umysql用户名 -pmysql密码 要导入到的数据库名<...

    Mysql 远程连接速度慢的解决方案

    Mysql 远程连接速度慢的解决方案

    mysql服务器查询慢原因分析与解决方法小结

    在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法

    python自动结束mysql慢查询会话的实例代码

    mysql慢查询会话查询 schedule定时任务调度 pymysql执行sql 代码分解 mysql慢查询 #会话查询,只能查询所有会话,不能按条件过滤,不过比较好记 show PROCESSLIST; #从information_schema中查询会话,可以按条件...

    远程连接MySQL速度慢的解决方法以及MySQL解析DNS的流程图[附PDF下载]

    mysql使用dns 流程解析 pdf下载 博文链接:https://whitepoplar.iteye.com/blog/561343

    mysql查询慢的原因和解决方案

    查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络...

    MySQL索引原理及慢查询优化

    MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数...  本人从13年7月份起,一直在美团核心业务系统部做慢查询的优化工作,共计十余个系统,累计解决和积累了上百个慢查询案例。随着业务的复杂性提升

    MySQL 查询速度慢与性能差的原因与解决方法

    随着网站数据量与访问量的增加,MySQL 查询速度慢与性能差的问题就日渐明显,这里为大家分享一下解决方法,需要的朋友可以参考下

    禁止mysql做域名解析(解决远程访问mysql时很慢)

    当远程访问mysql时,mysql会解析域名,会导致访问速度很慢,加上下面这个配置可解决此问题 禁止mysql做域名解析 [mysqld] skip-name-resolve PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接...

    MySQL慢SQL语句常见诱因以及解决方法

    虽然很多时候建立了索引,但在一些特定的场景下,索引还有可能会失效,所以索引失效也是导致慢查询的主要原因之一。 2. 锁等待 常用的存储引擎有 InnoDB 和 MyISAM,前者支持行锁和表锁,后者只支持表锁。 如果...

    解决MySQL Sending data导致查询很慢问题的方法与思路

    最近帮忙定位一个mysql查询很慢的问题,定位过程综合各种方法、理论、工具,很有代表性,分享给大家。 【问题现象】 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的时候,查询的记录数才几万条,但查询的速度...

    详解Navicat远程连接mysql很慢

     如果你连接远程数据库(Linux系统)并且很慢(具体症状为第一次连接打开所有的表貌似不是很慢,正常的,但是隔几分钟后任意打开一张表就很慢,即时数据很少的表依然很慢),我们用命令找到配置文件(mysql5.7的) ...

    mysql in语句子查询效率慢的优化技巧示例

    本文介绍主要介绍在mysql中使用in语句时,查询效率非常慢,这里分享下我的解决方法,供朋友们参考。

    连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。 原因是默认安装的MySql开启了DNS的反向解析。如果禁用的...

Global site tag (gtag.js) - Google Analytics