SQL慢查询学习篇

发布于:2024-05-16 ⋅ 阅读:(75) ⋅ 点赞:(0)

https://www.cnblogs.com/isyues/p/17733015.html

1. 对扫到的SQL慢查询语句执行 explain

explain select task_id, channel, count(task_id) as count from tablename 
where send_time > "2024-05-10 16:13:59" and send_time <= "2024-05-14 16:13:59" and task_status = 3 group by task_id

2. explain命令是什么东西?

explain 是MySql提供的SQL语句查询性能的工具,是我们优化SQL的重要指标手段,要看懂explain返回的结果集就尤为重要

3. explain命令返回列解读

+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                      |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+
|  1 | PRIMARY     | SC      | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   18 |    10.00 | Using where                                |
|  1 | PRIMARY     | Student | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   12 |    10.00 | Using where; Using join buffer (hash join) |
|  2 | SUBQUERY    | Teacher | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where                                |
|  2 | SUBQUERY    | Course  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    3 |    33.33 | Using where; Using join buffer (hash join) |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+--------------------------------------------+

3.1 Extra

在执行查询语句时额外的详细信息

  • Using index:表示MySQL将使用覆盖索引,这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。
  • Using index condition:在5.6版本后加入的新特性索引下推(Index Condition Pushdown,ICP),在索引遍历过程中,对索引中包含的字段先做判断(即使该字段没有使用到索引),直接过滤掉不满足条件的记录,减少回表次数。
  • Using where:意味着MySQL服务器将在存储引擎检索行后再进行过滤。就是先通过索引读取整行数据,再按 WHRER条件进行检查,符合就留下,不符合就丢弃。查询的列未被索引覆盖。
  • Using temporary:MySQL需要创建一张临时表来中间结果并进一步处理,比如union、group by、distinct等,出现这种情况一般是要进行优化的,首先是想到用索引来优化。
  • Using filesort:MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行,即filesort(文件排序)。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。filesort有两种,一种是内存排序,一种是磁盘排序,无法得知。
  • Distinct: 一旦MySQL找到了与行相联合匹配的行,就不再搜索了,常见于关联查询。
  • No tables used:Query语句中使用from dual 或不含任何from子句。
  • Using join buffer:使用了连接缓存,join语句用到了缓冲区。