记录一次索引优化经历

表结构如下:
这里写图片描述

主要用到FIS_BACKUP、FID和FSTATUS几个字段做查询。

索引如下:

这里写图片描述

整张表,前半部分数据FIS_BACKUP都是1,后半部分数据FIS_BACKUP都是0,共2000w多条数据


查询语句如下:

SELECT *
    FROM `T_MP_COMMENT` C
    WHERE C.FID>=15041538 AND C.FSTATUS!=9 AND C.FIS_BACKUP=0
    ORDER BY C.FID
    LIMIT 100;

使用count查看FIS_BACKUP为0 和为1的分别有1000多w条数据。

SELECT COUNT(1) FROM `T_MP_COMMENT` a WHERE a.`FIS_BACKUP`=1; //数据有1000w
SELECT COUNT(1) FROM `T_MP_COMMENT` a WHERE a.`FIS_BACKUP`=0; //数据也有1000w

语句1执行耗时0.003秒,语句如下:

        SELECT *
        FROM `T_MP_COMMENT` C
        WHERE C.FID>=15041538 AND C.FSTATUS!=9 AND C.FIS_BACKUP=0
        ORDER BY C.FID
        LIMIT 100;

执行计划:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  C   ref PRIMARY,IDX_FISBACKUP   IDX_FISBACKUP   1   const   11799193    Using where

语句2执行耗时26秒,语句如下:

        SELECT *
        FROM `T_MP_COMMENT` C
        WHERE C.FID>=15041538 AND C.FSTATUS!=9 AND C.FIS_BACKUP=1
        ORDER BY C.FID
        LIMIT 100;

执行计划:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  C   ref PRIMARY,IDX_FISBACKUP   IDX_FISBACKUP   1   const   11799193    Using where

以上出现原因分析:

  • 都使用了FIS_BACKUP索引
  • extra都使用了where
  • 综上可知,第二个语句执行的时候,虽然用到了索引,但是一直扫描到最后一条,但是第一个语句执行的时候只扫描了前几百条就找到了,所以会出现这么大的偏差。

第二种情况:

语句1耗时0.002秒,语句如下:

        SELECT *
        FROM `T_MP_COMMENT` C
        WHERE C.FID>=0 AND C.FSTATUS!=9 AND C.FIS_BACKUP=1
        ORDER BY C.FID
        LIMIT 100;

执行计划:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  C   ref PRIMARY,IDX_FISBACKUP   IDX_FISBACKUP   1   const   11799193    Using where

语句2耗时0.002秒,语句如下:

        SELECT *
        FROM `T_MP_COMMENT` C
        WHERE C.FID>=0 AND C.FSTATUS!=9 AND C.FIS_BACKUP=0
        ORDER BY C.FID
        LIMIT 100;

执行计划:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  C   ref PRIMARY,IDX_FISBACKUP   IDX_FISBACKUP   1   const   11799193    Using where

分析:

  • 都使用了FIS_BACKUP索引
  • extra都使用了where
  • 综上可知:两者都使用了where查询,并且两次查询都是刚刚扫描了几百条数据就找到了所需的结果。

所以,若执行计划中有where,一定要小心全表扫描!

小问题:若是把FIS_BACKUP索引去掉,直接用FID主键索引,会有什么问题呢?????下篇文章继续。。。
qq:475804848

猜你喜欢

转载自blog.csdn.net/starryninglong/article/details/77995342