服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 生产环境MySQL索引时效的排查过程

生产环境MySQL索引时效的排查过程

2022-10-18 15:41那海蓝蓝 Mysql

这篇文章主要介绍了生产环境MySQL索引时效的排查过程,文章根据SQL查询耗时特别长,看了执行计划发现没有走索引的问题展开详细介绍,需要的朋友可以参考一下

 早上收到开发同学求助,有个SQL查询耗时特别长,看了执行计划发现没有走索引,但是不知道原因在哪里,我们一起来分析一下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mysql>explain SELECT
    *
FROM
    artisan_income
WHERE
    parent_id IN (
        222645481,
        222583953,
        222181775,
        222180931,
        222081126,
        221678753,
        221616102,
        221591783,
        221219312,
        221195482,
        221118672,
        220763129,
        220654289,
        220633930,
        220323633,
        220227641,
        219825564,
        219720338,
        219321345,
    219291958
    ) \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artisan_income
   partitions:
         type: ALL
possible_keys: idx_parent_id
          key:
      key_len:
          ref:
         rows: 20711352
     filtered: 100
        Extra: Using where

确实是全表扫描,带着疑问我们把生产环境数据同步到测试库,方便测试,然后在测试环境进行查询。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mysql>explain SELECT
    *
FROM
    artisan_income
WHERE
    parent_id IN (
        222645481,
        222583953,
        222181775,
        222180931,
        222081126,
        221678753,
        221616102,
        221591783,
        221219312,
        221195482,
        221118672,
        220763129,
        220654289,
        220633930,
        220323633,
        220227641,
        219825564,
        219720338,
        219321345,
    219291958
    ) \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artisan_income
   partitions:
         type: range
possible_keys: idx_parent_id
          key: idx_parent_id
      key_len: 5
          ref:
         rows: 1870780
     filtered: 100
        Extra: Using index condition

发现在测试环境就用到了parent_id字段的索引,生产库和测试库同样都是5.7的版本,数据也几乎一样,但是执行计划不一样,第一时间想到了统计信息的问题,于是进行analyze table

?
1
analyze table artisan_income;

然后查看执行计划:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
mysql>explain SELECT
    *
FROM
    artisan_income
WHERE
    parent_id IN (
        222645481,
        222583953,
        222181775,
        222180931,
        222081126,
        221678753,
        221616102,
        221591783,
        221219312,
        221195482,
        221118672,
        220763129,
        220654289,
        220633930,
        220323633,
        220227641,
        219825564,
        219720338,
        219321345,
    219291958
    ) \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: artisan_income
   partitions:
         type: range
possible_keys: idx_parent_id
          key: idx_parent_id
      key_len: 5
          ref:
         rows: 1901880
     filtered: 100
        Extra: Using index condition

发现执行计划已经恢复正常。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
mysql>SELECT
    *
FROM
    artisan_income
WHERE
    parent_id IN (
        222645481,
        222583953,
        222181775,
        222180931,
        222081126,
        221678753,
        221616102,
        221591783,
        221219312,
        221195482,
        221118672,
        220763129,
        220654289,
        220633930,
        220323633,
        220227641,
        219825564,
        219720338,
        219321345,
    219291958
    ) \G
返回行数:[0],耗时:2 ms.

到此这篇关于生产环境MySQL索引时效的排查过程的文章就介绍到这了,更多相关MySQL索引排查内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.51cto.com/u_12592884/5188377

延伸 · 阅读

精彩推荐