MySQL慢查询查找和调优测试

 更新时间:2013年01月02日 11:08:58   作者:  
MySQL慢查询查找和调优测试,接下来详细介绍,需要了解的朋友可以参考下
编辑 my.cnf或者my.ini文件,去除下面这几行代码的注释:
复制代码 代码如下:

log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes

这将使得慢查询和没有使用索引的查询被记录下来。
这样做之后,对mysql-slow.log文件执行tail -f命令,将能看到其中记录的慢查询和未使用索引的查询。
随便提取一个慢查询,执行explain:
复制代码 代码如下:

explain low_query
 
你将看到下面的结果
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | some_table | ALL | NULL | NULL | NULL | NULL | 166 | Using where |
+----+-------------+---------------------+------+---------------+------+---------+------+------+-------------+
注意上面的rows和key列。rows显示该查询影响了多少行记录,我们不想让这个值太大。key显示用了哪个索引,为NULL时表示查询未用任何索引。
如果想让查询更快,你或许需要为某些列增加索引:
CREATE INDEX myapp_mytable_myfield_idx on myapp_mytable(myfield);
除了配置mysql配置文件来实现记录慢查询外,还有下面的方法可以记录慢查询:
复制代码 代码如下:

SELECT t.TABLE_SCHEMA AS `db`,
t.TABLE_NAME AS `table`,
s.INDEX_NAME AS `index name`,
s.COLUMN_NAME AS `FIELD name`,
s.SEQ_IN_INDEX `seq IN index`,
s2.max_columns AS `# cols`,
s.CARDINALITY AS `card`,
t.TABLE_ROWS AS `est rows`,
ROUND(((s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) * 100), 2) AS `sel %`
FROM INFORMATION_SCHEMA.STATISTICS s
INNER JOIN INFORMATION_SCHEMA.TABLES t ON s.TABLE_SCHEMA = t.TABLE_SCHEMA AND s.TABLE_NAME = t.TABLE_NAME
INNER JOIN (
SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, MAX(SEQ_IN_INDEX) AS max_columns
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA != 'mysql' GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME ) AS s2 ON s.TABLE_SCHEMA = s2.TABLE_SCHEMA AND s.TABLE_NAME = s2.TABLE_NAME AND s.INDEX_NAME = s2.INDEX_NAME
WHERE t.TABLE_SCHEMA != 'mysql' /* Filter out the mysql system DB */
AND t.TABLE_ROWS > 10 /* Only tables with some rows */
AND s.CARDINALITY IS NOT NULL /* Need at least one non-NULL value in the field */
AND (s.CARDINALITY / IFNULL(t.TABLE_ROWS, 0.01)) < 1.00 /* unique indexes are perfect anyway */
ORDER BY `sel %`, s.TABLE_SCHEMA, s.TABLE_NAME /* DESC for best non-unique indexes */
LIMIT 10;

相关文章

  • MySQL抛出Incorrect string value异常分析

    MySQL抛出Incorrect string value异常分析

    从上至下统一用上UTF-8就高枕无忧,今天还是遇到字符的异常,本文将介绍解决方法
    2012-11-11
  • Mysql数据库表中为什么有索引却没有提高查询速度

    Mysql数据库表中为什么有索引却没有提高查询速度

    你有没有想起过为什么明明再数据库中有索引,但是查询速度却并没有希望的那样快?本篇文章将带给你答案,跟小编一起看看吧
    2022-02-02
  • 一次Mysql update sql不当引起的生产故障记录

    一次Mysql update sql不当引起的生产故障记录

    这篇文章主要给大家介绍了关于一次Mysql update sql不当引起的生产故障的相关资料,由于update涉及到数据的修改,所以很容易推断,update语句比select语句会更复杂一些,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 如何添加一个mysql用户并给予权限详解

    如何添加一个mysql用户并给予权限详解

    在很多时候我们并不会直接利用mysql的root用户进行项目的开发,一般我们都会创建一个具有部分权限的用户,下面这篇文章主要给大家介绍了关于如何添加一个mysql用户并给予权限的相关资料,需要的朋友可以参考下
    2023-03-03
  • mysqlsla慢查询分析工具使用笔记

    mysqlsla慢查询分析工具使用笔记

    mysqlsla是一款帮助语句分析、过滤、和排序的功能,能够处理MySQL慢查询日志、二进制日志等。整体来说, 功能非常强大. 能制作SQL查询数据报表,分析包括执行频率, 数据量, 查询消耗等
    2014-05-05
  • MySQL数据表设计之自动增长的实现

    MySQL数据表设计之自动增长的实现

    本文主要介绍了MySQL数据表设计之自动增长的实现,包括创建数据表时设置自动增长和修改数据表时添加自动增长,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • 实例讲解MySQL 慢查询

    实例讲解MySQL 慢查询

    这篇文章主要介绍了MySQL 慢查询的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL实现字段分割一行转多行的示例代码

    MySQL实现字段分割一行转多行的示例代码

    这篇文章主要介绍了MySQL实现字段分割一行转多行的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • mysql 行列动态转换的实现(列联表,交叉表)

    mysql 行列动态转换的实现(列联表,交叉表)

    下面小编就为大家带来一篇mysql 行列动态转换的实现(列联表,交叉表)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • MySQL Sleep连接过多问题解决方法

    MySQL Sleep连接过多问题解决方法

    这篇文章主要介绍了MySQL Sleep连接过多问题解决方法,MySQL Sleep连接过多一般多为客户端没关闭连接导致的,解决方法很简单,修改一下配置文件即可,需要的朋友可以参考下
    2015-05-05

最新评论