首页 文章

我应该单独或成组索引列?

提问于
浏览
1

假设如下所示的表结构,我想知道最好是单独或在组中索引列:

tbl_id | column1 | column2 | column3 | column4 | column 5
---------------------------------------------------------
1      | 'aaa'   | 'bbb'   | 'ccc'   | 'ddd'   | 'eee'
2      | 'bbb'   | 'ccc'   | 'ddd'   | 'eee'   | 'fff'
3      | 'ccc'   | 'ddd'   | 'eee'   | 'fff'   | 'ggg'
4      | 'ddd'   | 'eee'   | 'fff'   | 'ggg'   | 'hhh'
5      | 'eee'   | 'fff'   | 'ggg'   | 'hhh'   | 'iii'

有一点我可以在where语句中使用 column1column2column3WHERE column1 = 'val' AND column2 = 'val' AND column3 = 'val'WHERE CONCAT(column1, ' ', column2, ' ', column3) = 'val val val' <=我认为这是不切实际的) . 在特殊情况下,我也可以将 column4 与前3列结合使用 .

所以我的问题是:

  • 我应该将它们中的4个一起索引吗?

CREATE INDEX index_name ON tbl(column1,column2,column3,column4)...;

  • 我应该索引前3列,然后是第4列吗?

CREATE INDEX index_name_1 ON tbl(column1,column2,column3)...; CREATE INDEX index_name_2 ON tbl(column4)...;

  • 我应该分别索引所有4个吗?

CREATE INDEX index_name_1 ON tbl(column1)...; CREATE INDEX index_name_2 ON tbl(column2)...; CREATE INDEX index_name_3 ON tbl(column3)...; CREATE INDEX index_name_4 ON tbl(column4)...;

  • 我应该将它们分组,然后分开吗?

CREATE INDEX index_name ON tbl(column1,column2,column3,column4)...; CREATE INDEX index_name_1 ON tbl(column1)...; CREATE INDEX index_name_2 ON tbl(column2)...; CREATE INDEX index_name_3 ON tbl(column3)...; CREATE INDEX index_name_4 ON tbl(column4)...;

我的理解是,如果我要单独索引它们,那么在它们将被单独搜索/加入的情况下(即: WHERE column1 = 'val' )将非常有用 . 希望我能用这个索引清除我的知识,谢谢 .

3 回答

  • 2

    你应该表达的条件是:

    WHERE column1 = 'val' AND column2 = 'val' AND column3 = 'val'
    

    适当的索引是 (column1, column2, column3) 上的复合索引 . 索引中这三列的顺序并不重要 . 您可以添加 column4 作为索引中的最后一个键 .

    如果使用 concat() 函数,则MySQL无法利用您建议的任何索引 .

  • 2

    看一下https://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html - 如果你把一个索引放在column1和column2以及column3和column4的组合上,任何查询都使用column1或(第1列和第2列)或(第1,2和3列)或(第1列, 2,3和4)可以使用此索引 . 因此,通过选择选项4,不需要column1上的单独索引

  • 1

    建议选择选项4,但是如果查询 WHERE column1 = 'val' ,那么由于最左边的原则, column1 上的索引是重复的,实际上将使用 index_name ;但如果您查询 WHERE column1 = 'val' AND tbl_id = 'val' ,那么 column1 上的索引是必要的 . 最后,不要在表上创建太多索引,这会导致写性能问题 .

相关问题