我在几个地方读过您使用任何字段来将查询结果限制为索引。但是假设您有一个应用程序,其中不同的查询使用不同的列组合。
例如,我们假设我们有三个查询如下:
Select * from table1 where field1 = 'A';
Select * from table1 where field1 = 'A' and field2 = 'B';
Select * from table1 where field1 = 'A' and field3 = 'C';
为field1,one2和field3创建一个索引是否更好?或者更好的是为field1创建一个索引,一个用于field1和field2的组合,一个用于field1和field3的组合。
答案 0 :(得分:3)
field1
上的索引将有助于所有三个查询。 (field1, field2)
或(field1, field3)
上的复合索引将有助于第一个查询以及第二个或第三个查询 - 并在field1
上呈现非唯一索引冗余(因为可以使用复合索引)第一次查询)。
对于任何给定的索引,您必须权衡添加索引的成本与获得索引的好处。索引使用空间;索引使用添加,删除或更新行时的处理时间(通常)。如果你打算经常使用索引并且在使用它时提供足够的加速,那么好处就超过了成本。如果你很少使用索引,它可能不会为自己买单。如果表是动态的(行频繁更改),则索引的更新成本大于表相对静态(很少更改)的情况。
虽然当有更多索引(检查哪些索引是相关的)时,优化器必须更加努力,但很少是决定创建或不创建索引的决定因素。
通常,请确保您拥有与表相关的所有唯一索引。
如果你有信心(因为你已经测量过),他们会以足够大的幅度加快速度,并且会经常使用,以便为你带来整体利益。