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的值来开启
常见慢查询优化
索引没起作用的情况
- 使用LIKE关键字的查询语句
- 在使用LIKE关键字进行查询的查询语句中,如果匹配字符串的第一个字符为“%”,索引不会起作用。
- 只有“%”不在第一个位置索引才会起作用。
- 使用多列索引的查询语句
- MySQL可以为多个字段创建索引,一个索引最多可以包括16个字段。
- 对于多列索引,只有查询条件使用了这些字段中的第一个字段时,索引才会被使用。
优化数据库结构
- 对于字段比较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表
- 增加中间表,对于需要经常联合查询的表,可以建立中间表以提高查询效率
- 通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率
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);