记录一次索引优化经历

数据库技术
374
0
0
2022-05-10

表结构如下:

记录一次索引优化经历

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

索引如下:

记录一次索引优化经历

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

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

第一种情况

查询语句如下:

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;

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

记录一次索引优化经历

执行计划:

记录一次索引优化经历

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

记录一次索引优化经历

执行计划:

记录一次索引优化经历

分析:

- 都使用了FIS_BACKUP索引

- extra都使用了where

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

第二种情况:

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

记录一次索引优化经历

执行计划:

记录一次索引优化经历

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

记录一次索引优化经历

执行计划:

记录一次索引优化经历

分析:

- 都使用了FIS_BACKUP索引

- extra都使用了where

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

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

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