关于数据查询索引失效走全表扫描的问题
每个版本我们都要进行全表扫描的检查,会发现明明字段加上索引,但还是走了全表扫描,所以进行了简单的分析。
影响全表扫描的因素有:(可能还有其它)
1. 返回的数据量的百分比;
2. 数据在数据库中的存储方式;
3. 舍弃的百分比
看如下例子,为什么有时候走全表扫描会比走索引更好:
假如table A,有10万条数据,如果我们要读取其中20000条数据,也就是占比只有20%,表中每行数据大小为80字节,那么数据块大小8K,所以一个数据块有100行数据。Table A 至少会占用1000个数据块
如果通过全表扫描,我们需要读取1000个数据块再乘以100行数据也就是100000次。
如果通过索引要找其中20000条数据,那么你需要先读取20000个索引去找对应数据块,然后再乘以100行数据,所以如果数据分别分散在不同的数据块,通过索引找就需要2000000次。
通过对比走索引就会比全表要慢很多。
那为什么有时候走索引会比走全表更好
但也有例外,如果数据相对比较集中,20000条数据可能刚好就集中在前面200个数据块中,这个时候走索引就会要快一点,但是全表就一直会是100000
还有如果数据量很大,超过20000*100,但是还是只查询20000条数据,那么这时走索引就会比走全表要快。
加上图便于理解
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……100
101 102 103 104 105 106 107 108
109 110 111 112 113 114 115 116
117 118 119 120 121 122 123 124
125 126 127 128 129 130 131 132
133 134 135 136 137 138 139……200
........
........