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)
坏索引是浪费磁盘空间并减慢修改操作而没有任何好处.
除了上述"实际使用"部分之外,要记住一个重要的事项是选择性概念.
构造索引时,您希望在很有可能具有"高选择性"的列上创建索引.这需要对列中的数据有所了解(根据您对样本数据的域/可用性的了解,您可能拥有或不拥有该数据).
选择性=不同值的数量/总行数
让我们使用表"People",其中包含Given_name,Surname,Gender,Age的列
例如,在诸如Gender之类的列上创建索引(其中性别被约束为NULL,M或F)在查询期间不会提供太多好处(特别是如果查询由于其他原因已经导致表扫描).在任何情况下,该指数的选择性都会非常低.根据DBMS,使用此索引实际上可能比全表扫描更糟糕.
但是,在(Given_name,Surname)上创建复合索引将在针对这些列执行查询时提供好处.该指数(对大多数人群而言)的选择性非常好.
选择性为1的索引是理想的,但是,实现1的选择性的唯一方法是在非可空列上具有唯一索引.
另外,请记住,您可以轻松编写查询以"跟踪"索引及其选择性.