Sch*_*zIT 12 sql sql-server indexing
作为一名DBA拥有多年经验,我相信我知道这个问题的答案,但我认为检查我的基础绝对不会受到伤害.
使用SQL Server,假设我有这对列索引的表A和列B,并在列第二指标A,B以及C,那会是安全的,下降的第一指标,作为第二指标基本上都会满足,将受益查询第一个指数?
Jon*_*ler 29
这取决于,但答案往往是"是的,你可以将索引放在(A,B)上".
反例(你不会将索引放在(A,B)上)是指(A,B)上的索引是强制执行约束的唯一索引; 那么你不想把索引放在(A,B)上.(A,B,C)上的索引也可以是唯一的,但唯一性是多余的,因为(A,B)组合因其他索引而是唯一的.
但是在没有这种不寻常的情况下(例如,如果(A,B)和(A,B,C)都允许重复条目),那么(A,B)索引在逻辑上是多余的.但是,如果列C是'宽'(也许是CHAR(100)列),而A和B很小(比如INTEGER),则(A,B)索引比(A,B,C)更有效. )index因为你可以获得每页(A,B)索引读取的更多信息.因此,即使(A,B)是多余的,也可能值得保留.您还需要考虑表格的波动性; 如果表很少变化,额外的索引并不重要; 如果表变化很大,额外的索引会减慢对表的修改.这是否重要难以猜测; 你可能需要进行性能测量.
Mar*_*ith 11
第一指数涵盖查找上的查询A,A,B并且所述第二索引可被用于覆盖查找上的查询A,A,B或A,B,C这显然是所述第一壳体的一个超集.
如果C非常宽,则索引A,B可能仍然有用,因为它可以满足具有较少读取的某些查询.
例如,如果C是char(800)列,则以下查询可以从可用的较窄索引中获益.
SELECT a,b
FROM YourTable
ORDER BY a,b
Run Code Online (Sandbox Code Playgroud)
是的,这是一种常见的优化.任何可以从A,B上的索引中受益的查询也可以从A,B,C上的索引中受益.
在MySQL社区中,甚至还有一个工具可以在整个模式中搜索冗余索引:http: //www.percona.com/doc/percona-toolkit/pt-duplicate-key-checker.html
可能的异常情况是,如果A,B上的索引更紧凑并且使用频率更高,并且您想要控制哪个索引保持在内存中.