创建SQL索引的最佳方法?

时间:2010-07-31 13:26:49

标签: sql database indexing

在SQL数据库中创建SQL索引的最佳方法是什么?

CREATE INDEX idx ON sometable (col1, col2, col3);

或者

CREATE INDEX idx1 ON sometable (col1);
CREATE INDEX idx2 ON sometable (col2);
CREATE INDEX idx3 ON sometable (col3);

这两种方法有什么区别?它取决于SQL实现吗? (SQLite,MySQL,MSSQL,...)? 使用这两种方法中的一种时,是否有任何效率方面的考虑因素?

2 个答案:

答案 0 :(得分:7)

CREATE INDEX idx ON sometable (col1, col2, col3);

这将在所有三个字段上一起创建一个索引。如果您的查询在大多数情况下将WHERE子句全部用于所有三个字段,那么这是完美的:

SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 AND col3 = 3

仅在col1和col2上查询时,也会使用此复合索引:

SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 

但如果您分别在col2col3col2col3上同时查询,则无法使用

SELECT (fields) FROM Table WHERE col2 = 2 AND col3 = 3  -- will *NOT* use index
SELECT (fields) FROM Table WHERE col2 = 2               -- will *NOT* use index
SELECT (fields) FROM Table WHERE col3 = 3               -- will *NOT* use index

另一方面,如果您使用:

CREATE INDEX idx1 ON sometable (col1);
CREATE INDEX idx2 ON sometable (col2);
CREATE INDEX idx3 ON sometable (col3);

然后在每个字段上创建三个单独的单独索引。在这种情况下,任何仅使用其中一列的查询都将受益于该列的索引:

SELECT (fields) FROM Table WHERE col1 = 1   -- will use index on col1
SELECT (fields) FROM Table WHERE col2 = 2   -- will use index on col2
SELECT (fields) FROM Table WHERE col3 = 3   -- will use index on col3

但是,如果您在一个查询中一起查询两列或全部三列:

SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 AND col3 = 3

然后只使用创建的三个索引中的一个,并且它很可能不如(col1,col2,col3)上的复合索引有效。

所以,是的,你创建这些索引的方式肯定存在差异,但是没有单一的“最佳方法”来进行索引。这完全取决于您如何查询数据,以确定两个选项中哪一个是“更好”的选项。

答案 1 :(得分:0)

第一个在3列上创建复合索引,而第二个在每列上创建一个简单索引。查看MSDN article中的说明和示例。

(首先参见示例部分,然后阅读每种索引的定义,否则我觉得文章太吓人了)