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

时间:2017-12-01 03:08:52

标签: mysql sql indexing

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

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列结合使用。

所以我的问题是:

  1. 我应该把它们中的4个一起索引吗?

      

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

  2. 我应该索引前3列,然后是第4列?

      

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

         

    CREATE INDEX index_name_2 ON tbl(column4)...;

  3. 我应该分别索引所有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)...;

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

      

    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)...;

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

3 个答案:

答案 0 :(得分:2)

您应该将条件表达为:

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

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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