ban*_*anx 3 sql database indexing
在SQL数据库中创建SQL索引的最佳方法是什么?
CREATE INDEX idx ON sometable (col1, col2, col3);
Run Code Online (Sandbox Code Playgroud)
要么
CREATE INDEX idx1 ON sometable (col1);
CREATE INDEX idx2 ON sometable (col2);
CREATE INDEX idx3 ON sometable (col3);
Run Code Online (Sandbox Code Playgroud)
这两种方法有什么区别?它取决于SQL实现吗?(SQLite,MySQL,MSSQL,...)?使用这两种方法中的一种时,是否有任何效率考虑因素?
CREATE INDEX idx ON sometable (col1, col2, col3);
Run Code Online (Sandbox Code Playgroud)
这将在所有三个字段上一起创建单个索引.如果您的查询在大多数情况下将所有三个字段用于其WHERE子句,那么这是完美的:
SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 AND col3 = 3
Run Code Online (Sandbox Code Playgroud)
当您单独查询col1和col2时,也将使用此复合索引:
SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2
Run Code Online (Sandbox Code Playgroud)
但是如果你查询上要么无法使用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
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您使用:
CREATE INDEX idx1 ON sometable (col1);
CREATE INDEX idx2 ON sometable (col2);
CREATE INDEX idx3 ON sometable (col3);
Run Code Online (Sandbox Code Playgroud)
然后在每个字段上创建三个单独的单独索引.在这种情况下,任何只使用其中一列的查询都将受益于该列的索引:
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
Run Code Online (Sandbox Code Playgroud)
但是,如果您在一个查询中一起查询两个或所有三列:
SELECT (fields) FROM Table WHERE col1 = 1 AND col2 = 2 AND col3 = 3
Run Code Online (Sandbox Code Playgroud)
然后,将只使用创建的三个索引中的一个,并且它很可能不如(col1,col2,col3)上的复合索引有效.
所以是的,你创建这些索引的方式肯定存在差异,但是没有单一的"最佳方法"来进行索引.这实际上取决于您如何查询数据,以确定两个选项中的哪一个是"更好"的选项.
归档时间: |
|
查看次数: |
1367 次 |
最近记录: |