首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL5.5复合索引顺序

MySQL5.5复合索引顺序
EN

Database Administration用户
提问于 2018-10-16 09:19:09
回答 1查看 51关注 0票数 -1

我有这张桌子(做好了,但很相似)

物品(ot_id,numval1,numval2)

我做了一个这样的查询:

代码语言:javascript
复制
Select from OtherTable ot JOIN Items on ot.id=Items.ot_id where 
Items.numval1 > 1 and Items.numval2 < 300

现在,当我创建要覆盖上述查询的项的复合索引时,可以这样做:

代码语言:javascript
复制
create index  idx1 on Items (ot_id,numval1,numval2);

订单正确吗?我需要ot_id吗?

EN

回答 1

Database Administration用户

发布于 2018-10-19 04:22:13

案例1(这不是你的情况,但请原谅我)

代码语言:javascript
复制
FROM Items
    where  ot_id = 321
      and  numval1 > 1
      and  numval2 < 300 

有两个索引:

代码语言:javascript
复制
INDEX(ot_id, numval1)
INDEX(ot_id, numval2)

od_id是第一位的,因为它是用=测试的。一旦命中一个范围(例如,numval1 > 1),就不能使用索引中的更多列。

优化器将基于哪个范围测试(numval1或numval2)可能更快,在它们之间进行选择。优化器不能使用建议的3列索引。(或者说,它将不使用第三列。)

您还没有说过您将成为SELECTing的价值。如果它不超过这3列,那么“覆盖”索引将是一个微小的好处:

代码语言:javascript
复制
INDEX(ot_id, numval1, numval2)
INDEX(ot_id, numval2, numval1)

同样,这让优化器动态地决定哪个更好。

正如Akina指出的那样,优化器可能会出错,而没有注意到表扫描会更好。

案例2(查询随您而定)

代码语言:javascript
复制
     from  OtherTable ot
     JOIN  Items  ON ot.id=Items.ot_id
    where  Items.numval1 > 1
      and  Items.numval2 < 300 

注意,WHERE子句只讨论Items。因此,极有可能优化器将从它开始,然后是JOINOtherTable。同样,它导致了两个选择:

代码语言:javascript
复制
INDEX(numval1)
INDEX(numval2)

或者,如果包括:

代码语言:javascript
复制
INDEX(numval1, numval2, ot_id)
INDEX(numval2, numval1, ot_id)

(最后一对列可以按任意顺序排列。)

然后,要进入ot,需要在id上建立一个索引,想必,您有PRIMARY KEY(id)吗?

(因此,我不同意阿金娜的回答。)

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/220212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档