MySQL的慢查询

167 阅读3分钟

MySQL-慢查询应用

慢查询的概念:

  • MySQL 的慢查询,全名是慢查询日志,是MySQL 提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句
  • 具体环境 中,运行时间超过long_query_time值的SQL 语句,则会被记录到慢查询日志中
  • long_query_time的默认值为10,意思是记录运行 10秒以上的语句。默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数
  • 当然,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响
  • 此外,慢查询日志支持将日志记录写入文件和数据库表

MySQL 慢查询的相关参数解释:

  • slow_query_log:是否开启慢查询日志,1表示开启,0表示关闭
  • log-slow-queries : 旧版(5.6以下版本)MySQL 数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件 host_name-slow.log
  • slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的 文件host_name-slow.log
  • long_query_time:慢查询阈值,当查询时间多于设定的阈值时,记录日志
  • log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)
  • log_output:日志存储方式。 log_output=‘FILE’表示将日志存入文件,默认值是’FILE’。 log_output='TABLE’表示将日志存入数据库。 那么如何进行慢查询日志的配置呢?默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的,可以通过设置 slow_query_log的值来开启

常见慢查询优化

索引没起作用的情况

  1. 使用LIKE关键字的查询语句
  1. 在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。
  2. 只有“%”不在第一个位置索引才会起作用。
  1. 使用多列索引的查询语句
  1. MySQL可以为多个字段创建索引,一个索引最多可以包括16个字段。
  2. 对于多列索引,只有查询条件使用了这些字段中的第一个字段时,索引才会被使用。

优化数据库结构

  1. 对于字段比较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表
  2. 增加中间表,对于需要经常联合查询的表,可以建立中间表以提高查询效率
  3. 通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率

SELECT * FROM tag 
        JOIN tag_post ON tag_id = tag.id
        JOIN post ON tag_post.post_id = post.id
        WHERE tag.tag = 'mysql';
 
        分解为:
 
        SELECT * FROM tag WHERE tag = 'mysql';
        SELECT * FROM tag_post WHERE tag_id = 1234;
        SELECT * FROM post WHERE post.id in (123,456,567);