什么时候索引(在DBMS中)是一个坏索引?

Ano*_*op 10 sql indexing

当索引是一个糟糕的索引时,谁能告诉我?

Ras*_*ack 11

如果从不搜索索引列并且表经过大量更新,则无法获得indeces所用的性能优势.相反,你可能遭受性能损失.


Jon*_*ler 11

索引几乎无条件坏的一种情况是,如果有另一个索引使用相同的列(以相同的顺序)作为前缀:

CREATE INDEX ix_good ON SomeTable(Col1, Col2, Col3);
CREATE INDEX ix_bad  ON SomeTable(Col1, Col2);
Run Code Online (Sandbox Code Playgroud)

坏索引是浪费磁盘空间并减慢修改操作而没有任何好处.


kqu*_*inn 9

我之前已经联系过了,我会再次链接到它,因为它很棒:

由Stephane Faroult撰写的SQL索引在9分半钟内完成.


wei*_*ohn 5

除了上述"实际使用"部分之外,要记住一个重要的事项是选择性概念.

构造索引时,您希望在很有可能具有"高选择性"的列上创建索引.这需要对列中的数据有所了解(根据您对样本数据的域/可用性的了解,您可能拥有或不拥有该数据).

选择性=不同值的数量/总行数

让我们使用表"People",其中包含Given_name,Surname,Gender,Age的列

例如,在诸如Gender之类的列上创建索引(其中性别被约束为NULL,M或F)在查询期间不会提供太多好处(特别是如果查询由于其他原因已经导致表扫描).在任何情况下,该指数的选择性都会非常低.根据DBMS,使用此索引实际上可能比全表扫描更糟糕.

但是,在(Given_name,Surname)上创建复合索引将在针对这些列执行查询时提供好处.该指数(对大多数人群而言)的选择性非常好.

选择性为1的索引是理想的,但是,实现1的选择性的唯一方法是在非可空列上具有唯一索引.

另外,请记住,您可以轻松编写查询以"跟踪"索引及其选择性.


Jef*_*ffO 1

如果该字段从未被使用过,那么它就是一个不好的索引(如果你觉得不必要的东西就是不好的。)。