|
|
1
3
一般来说,覆盖索引将覆盖较小的索引选择,这在服务器之间有所不同。 所以如果你有一个覆盖A,B,C的索引,它通常会自动给你一个覆盖A,和A,B的索引。 例如,你不能保证有B,C的覆盖指数。 |
|
2
2
是的,大部分情况下。 但是,作为替代,比如说,ix-bcd并没有太大的帮助。 但是,有一个警告:索引仍然可能需要磁盘读取,因此如果C和D分解索引的大小,那么在ix-a b中查找a、b会有一些效率低下,在ix-a b中查找时不会出现这种情况。 然而,这种差异可能会被单独维护ix_ab带来的额外性能冲击所抵消。 |
|
|
3
1
重要的是索引中的前导列。如果您有索引ix_,以下查询将使用该索引: 从表中选择*,其中a=1 从表中选择*,其中a=1和b=1 从表中选择*,其中a=1,b=1,c=1 但是,以下内容很可能不会使用索引(至少不会按预期方式使用): 从表中选择*,其中b=1 从表中选择*,其中c=1 从表中选择*,其中b=1和c=1 重要的是使用了前导列。因此,创建索引时列的顺序很重要。 |
|
|
4
0
不一定。虽然(a、b、c)上的索引可以用于a上的筛选谓词或a上的排序请求或a上的联接条件,但这并不一定意味着仅索引(a)是无用的。如果(a,b,c)上的指数相当大 更广的 与(a)相比,单独在上进行范围扫描将节省大量的I/O,因为它必须读取更少的页面(索引更窄)。 但我认为这将是例外而不是规则。一般来说,如果(a,b)上存在另一个索引,则可以安全地删除a上的索引。请注意,(a,b)上的索引不满足对b的任何筛选,因此,只有在最左边的列相同的情况下才可以安全地删除。有些数据库有“跳过扫描”运算符,可以使用(a,b)上的索引查找b,但这是一个非常窄的边界情况。 |
|
|
5
0
最好不要假设任何关于数据库引擎内部的事情,并实际检查正在使用的实际查询计划。 |