任务: 生产库慢查询日志, 显示有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/
相关推荐
MySql查询数据慢可以用用这个工具,瞬间提升Like查询效率
45-MySQL单表2000万数据查询慢解决方案1
通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。非常急人,有没有办法可以解决局域网内mysql数据库连接慢呢?下面小编带领大家来解决此问题,感兴趣的朋友一起看看吧
Linux上的mysql数据库通过navicat工具访问很慢,但是ping确很快,配置相关文件解决,配置后需要重启数据库服务
在小伙伴们开发的项目中,对于MySQL排查问题找出性能瓶颈来说,最容易发现并解决的问题就是MYSQL的慢查询以及没有得用索引的查询。 接下来教大家如何开启MySQL5.0版本以上的慢查询日志记录; OK,一起开始找出mysql...
导入注意点:使用phpmyadmin或navicat之类的工具的导入功能还是会相当慢,可以直接使用mysql进行导入导入命令如下:mysql> -uroot -psupidea jb51.net<E> -umysql用户名 -pmysql密码 要导入到的数据库名<...
Mysql 远程连接速度慢的解决方案
在开发的朋友特别是和mysql有接触的朋友会碰到有时mysql查询很慢,当然我指的是大数据量百万千万级了,不是几十条了,下面我们来看看解决查询慢的办法
mysql慢查询会话查询 schedule定时任务调度 pymysql执行sql 代码分解 mysql慢查询 #会话查询,只能查询所有会话,不能按条件过滤,不过比较好记 show PROCESSLIST; #从information_schema中查询会话,可以按条件...
mysql使用dns 流程解析 pdf下载 博文链接:https://whitepoplar.iteye.com/blog/561343
查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络...
MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数... 本人从13年7月份起,一直在美团核心业务系统部做慢查询的优化工作,共计十余个系统,累计解决和积累了上百个慢查询案例。随着业务的复杂性提升
随着网站数据量与访问量的增加,MySQL 查询速度慢与性能差的问题就日渐明显,这里为大家分享一下解决方法,需要的朋友可以参考下
当远程访问mysql时,mysql会解析域名,会导致访问速度很慢,加上下面这个配置可解决此问题 禁止mysql做域名解析 [mysqld] skip-name-resolve PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接...
虽然很多时候建立了索引,但在一些特定的场景下,索引还有可能会失效,所以索引失效也是导致慢查询的主要原因之一。 2. 锁等待 常用的存储引擎有 InnoDB 和 MyISAM,前者支持行锁和表锁,后者只支持表锁。 如果...
最近帮忙定位一个mysql查询很慢的问题,定位过程综合各种方法、理论、工具,很有代表性,分享给大家。 【问题现象】 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的时候,查询的记录数才几万条,但查询的速度...
如果你连接远程数据库(Linux系统)并且很慢(具体症状为第一次连接打开所有的表貌似不是很慢,正常的,但是隔几分钟后任意打开一张表就很慢,即时数据很少的表依然很慢),我们用命令找到配置文件(mysql5.7的) ...
本文介绍主要介绍在mysql中使用in语句时,查询效率非常慢,这里分享下我的解决方法,供朋友们参考。
最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。 原因是默认安装的MySql开启了DNS的反向解析。如果禁用的...