其思想是基于列c1
、c2
和c3
进行快速查询。
有3种查询:
SELECT COUNT(*) FROM tbl WHERE c1=... AND c2=...
SELECT c2, c3 FROM tbl WHERE c1=...
SELECT DISTINCT c2 FROM tbl WHERE c1=... AND c3=...
如果我想让(c1
,c2
)是唯一的,那么构建索引的最佳方法是什么?
我想到了一个这样的索引:
UNIQUE INDEX idx_c1_c2 (c1, c2)
但是第三个查询不会使用这个索引。
有什么建议吗?
WHERE c1= AND c2=
需要INDEX(c1, c2)
。如果该对是"唯一的",则将其设为UNIQUE
,而不是INDEX
。或者考虑将其设为PRIMARY KEY
(也是UNIQUE
和INDEX
)。
WHERE c1=
将愉快地使用以c1
开始的任何类型的索引。
WHERE c1= AND c3=
将仅使用(c1, c2)
的c1
部分,这在一定程度上是有用的。最好按任意顺序添加另一个索引:INDEX(c1, c3)
。建议(c3, c1)
获得一些变化。
没有一个单独的索引可以"很好"地用于所有三个查询。
如果表是Engine=InnoDB
,则用PRIMARY KEY
搜索通常比用UNIQUE INDEX
搜索快。如果你现在有一个AUTO_INCREMENT
作为PRIMARY KEY
,那么考虑一下它是否值得保留,而不是用"自然"的(c1, c2)
代替。