编辑 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 你将看到下面的结果: +—-+————-+———————+——+ MySQL慢查询查找和调优是数据库管理中的关键环节,它涉及到数据库性能的优化,从而提升系统整体效率。这里我们将深入探讨如何找出并优化慢查询,以及如何有效地利用索引来提升查询速度。 慢查询的识别是通过配置MySQL服务器来实现的。在`my.cnf`或`my.ini`配置文件中,取消`log_slow_queries = /var/log/mysql/mysql-slow.log`、`long_query_time = 2`和`log-queries-not-using-indexes`的注释。`log_slow_queries`设置告诉MySQL记录运行时间超过`long_query_time`秒的查询,单位通常是秒。`long_query_time`的默认值是10秒,但可以根据实际需求调整,例如设置为2秒以捕获更慢的查询。`log-queries-not-using-indexes`选项会记录那些没有使用索引的查询。这些配置会将相关信息写入到指定的日志文件`mysql-slow.log`中。 在日志生成后,使用`tail -f mysql-slow.log`命令持续监控,可以实时查看哪些查询运行缓慢或未使用索引。一旦找到慢查询,就可以进行分析和优化。 使用`EXPLAIN`关键字可以进一步了解查询执行计划。例如,输入`EXPLAIN SELECT low_query`,其中`low_query`是你要分析的SQL语句。`EXPLAIN`返回的结果将展示查询执行的详细信息,包括`id`(查询识别号)、`select_type`(查询类型,如SIMPLE或SUBQUERY)、`table`(涉及的表)、`type`(访问类型,如ALL或INDEX)、`possible_keys`(可能使用的索引)、`key`(实际使用的索引,如果为空表示未使用索引)、`key_len`(索引字段长度)、`ref`(引用列名)、`rows`(预计扫描的行数)和`Extra`(额外信息,如Using where表示使用了WHERE条件)。 `rows`列尤为重要,因为它显示了查询预期要扫描的行数。理想的状况是这个数值尽可能小,因为较大的数值意味着更高的I/O操作和更长的等待时间。如果`key`列显示为NULL,这通常意味着查询没有使用索引,这可能是导致查询慢的原因之一。在这种情况下,可以考虑为相关列创建合适的索引。 创建索引可以显著提高查询性能。例如,如果你发现`myapp_mytable`表的`myfield`字段经常出现在WHERE子句中,可以创建如下的索引: ```sql CREATE INDEX myapp_mytable_myfield_idx ON myapp_mytable(myfield); ``` 此外,还可以使用以下SQL语句来检查当前数据库中哪些索引可能没有得到充分利用。这个查询会列出索引的选择性,选择性高的索引对于区分度较高的数据更有价值: ```sql 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慢查询查找和调优是一个系统性的过程,涉及配置调整、日志分析、`EXPLAIN`查询分析、索引设计等多个环节。通过对这些方面进行深入理解和优化,可以显著提升数据库的性能,减少延迟,提高应用程序的整体响应速度。
- 粉丝: 4
- 资源: 947
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 学校课程软件工程常见10道题目以及答案demo
- javaweb新手开发中常见的目录结构讲解
- 新手小白的git使用的手册入门学习demo
- 基于Java观察者模式的info-express多对多广播通信框架设计源码
- 利用python爬取豆瓣电影评分简单案例demo
- 机器人开发中常见的几道问题以及答案demo
- 基于SpringBoot和layuimini的简洁美观后台权限管理系统设计源码
- 实验报告五六代码.zip
- hdw-dubbo-ui基于vue、element-ui构建开发,实现后台管理前端功能.zip
- (Grafana + Zabbix + ASP.NET Core 2.1 + ECharts + Dapper + Swagger + layuiAdmin)基于角色授权的权限体系.zip