查询优化:强制MySQL使用3列复合索引

r55awzrz  于 2023-04-19  发布在  Mysql
关注(0)|答案(2)|浏览(101)

我有一个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%';

nhhxz33t

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

euoag5mw

euoag5mw2#

为了

WHERE column b = 'XYZ' AND column c = 'ABC' AND column d LIKE 'P%';

你需要

INDEX(b, c, d)   -- with `d` last

并去掉INDEX(b)INDEX(b,c);他们可能会妨碍选择最佳指数。
我怀疑你有一些“碍事”的索引。
另外,它们真的是字符串类型吗?比较INT和字符串或VARCHAR和数字可能会引起麻烦。
(我同意迈克尔的回答。)

相关问题