我有一个3列的复合索引。现在我想只基于2列执行查询,这两列都没有索引。所以查询需要很长的时间来执行。
如何使用复合索引来修改查询?
示例:表温度
| 色谱柱A|B栏|色谱柱C|D栏|
| --------------|--------------|--------------|--------------|
| 1号牢房|二号牢房|二号牢房|二号牢房|
| 3号牢房|4号牢房|二号牢房|二号牢房|
现在假设我在列B、列C和列D上有复合索引。
现在我想选择仅基于列b和列c的行SELECT column A from Temp WHERE column b = 'XYZ' AND column c = 'ABC';
这不使用索引。
那么,有没有一种方法可以优化查询,以便使用复合索引。
我尝试了类似下面的方法,它确实使用了索引,但是我想去掉这个限制,因为值可以是任何值SELECT column A from Temp WHERE column b = 'XYZ' AND column c = 'ABC' AND column d LIKE 'P%';
2条答案
按热度按时间nhhxz33t1#
如mysql documentation所述:
如果表具有多列索引,则优化器可以使用索引的任何最左边的前缀来查找行。例如,如果在(col1,col2,col3)上具有三列索引,则可以在(col1)、(col1,col2)和(col1,col2,col3)上进行索引搜索。
这意味着如果你的索引被定义为(B,C,D),那么像
B = '...' AND C = '...'
这样的条件查询应该使用该索引,因为(B,C)是(B,C,D)的最左边前缀。像C = '...' AND D = '...')
或B = '...' OR C = '...'
这样的条件查询不会使用该索引。这里是example on db-fiddle
euoag5mw2#
为了
你需要
并去掉
INDEX(b)
和INDEX(b,c)
;他们可能会妨碍选择最佳指数。我怀疑你有一些“碍事”的索引。
另外,它们真的是字符串类型吗?比较INT和字符串或VARCHAR和数字可能会引起麻烦。
(我同意迈克尔的回答。)