我有这张桌子(做好了,但很相似)
物品(ot_id,numval1,numval2)
我做了一个这样的查询:
Select from OtherTable ot JOIN Items on ot.id=Items.ot_id where
Items.numval1 > 1 and Items.numval2 < 300现在,当我创建要覆盖上述查询的项的复合索引时,可以这样做:
create index idx1 on Items (ot_id,numval1,numval2);订单正确吗?我需要ot_id吗?
发布于 2018-10-19 04:22:13
案例1(这不是你的情况,但请原谅我)
FROM Items
where ot_id = 321
and numval1 > 1
and numval2 < 300 有两个索引:
INDEX(ot_id, numval1)
INDEX(ot_id, numval2)od_id是第一位的,因为它是用=测试的。一旦命中一个范围(例如,numval1 > 1),就不能使用索引中的更多列。
优化器将基于哪个范围测试(numval1或numval2)可能更快,在它们之间进行选择。优化器不能使用建议的3列索引。(或者说,它将不使用第三列。)
您还没有说过您将成为SELECTing的价值。如果它不超过这3列,那么“覆盖”索引将是一个微小的好处:
INDEX(ot_id, numval1, numval2)
INDEX(ot_id, numval2, numval1)同样,这让优化器动态地决定哪个更好。
正如Akina指出的那样,优化器可能会出错,而没有注意到表扫描会更好。
案例2(查询随您而定)
from OtherTable ot
JOIN Items ON ot.id=Items.ot_id
where Items.numval1 > 1
and Items.numval2 < 300 注意,WHERE子句只讨论Items。因此,极有可能优化器将从它开始,然后是JOIN到OtherTable。同样,它导致了两个选择:
INDEX(numval1)
INDEX(numval2)或者,如果包括:
INDEX(numval1, numval2, ot_id)
INDEX(numval2, numval1, ot_id)(最后一对列可以按任意顺序排列。)
然后,要进入ot,需要在id上建立一个索引,想必,您有PRIMARY KEY(id)吗?
(因此,我不同意阿金娜的回答。)
https://dba.stackexchange.com/questions/220212
复制相似问题