提前说明:
1.TR 表示随机I/O查找(假设为10ms)
2.TS 表示顺序I/O查找(0.01ms)
3.TR查询的速度远远小于TS
4.一次的查询,最少一次随机I/O
5.通过索引查询,如果无法满足覆盖索引条件,需要进行一次回表查询(随机I/O)
6.以下都不考虑有缓存的情况
7.下面的仅供参考,如有问题,欢迎留言指出。
设计索引时,一次查询需要考虑的问题:
1.最好输入,即执行查询限定条件,比如limit 20, 索引前20条即可满足查询条件
2.最坏输入,索引无法满足查询条件或者需要扫描整个索引
栗子:
1.非聚簇索引且非覆盖索引
SQL1:SELCT A,B,C,D,F,G FROM TEST WHERE A = A1 AND B=B1 LIMIT 20
索引(A,B) 非聚簇索引
数据量100W, A的过滤因子 1% ,B的过滤因子10% (A,B)共过滤至1000条数据,其中每10条有一个符合B条件的数据。
最坏输入(符合条件的只有19条)
索引(A,B) TR=1 TS = 1000
回表:TR=19 TS = 0
拉取数据成本:19*0.1ms
总成本:TR(20*10ms) + TS(1000*0.01ms) + 拉取成本(19*0.1ms) = 211ms
最好输入(直接能找到20条数据)
索引(A,B) TR=1 TS=20