在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,...)? 使用这两种方法中的一种时,是否有任何效率方面的考虑因素?
答案 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
但如果您分别在col2
或col3
或col2
和col3
上同时查询,则无法使用
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中的说明和示例。
(首先参见示例部分,然后阅读每种索引的定义,否则我觉得文章太吓人了)