假设下面的表结构,我想知道最好是单独或在组中索引列:
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'
)将非常有用。希望我能用这个索引清除我的知识,谢谢。
答案 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
上的索引。最后,不要在表上创建太多索引,这会导致写性能问题。