假设如下所示的表结构,我想知道最好是单独或在组中索引列:
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语句中使用 column1
, column2
和 column3
( WHERE 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 回答
你应该表达的条件是:
适当的索引是
(column1, column2, column3)
上的复合索引 . 索引中这三列的顺序并不重要 . 您可以添加column4
作为索引中的最后一个键 .如果使用
concat()
函数,则MySQL无法利用您建议的任何索引 .看一下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上的单独索引
建议选择选项4,但是如果查询
WHERE column1 = 'val'
,那么由于最左边的原则,column1
上的索引是重复的,实际上将使用index_name
;但如果您查询WHERE column1 = 'val' AND tbl_id = 'val'
,那么column1
上的索引是必要的 . 最后,不要在表上创建太多索引,这会导致写性能问题 .