mysql 用到了哪些索引

2023-05-09 10:33:54 +08:00
 zhaokun

现在有个 mysql 索引问题,表有三个字端:a ,b ,c 表中有三个索引 index ( a,b ), index(b,c),index ( a,c ) 现有查询 where a = ‘1’ and b = ‘1’ and c = ‘1’ 请问哪些字端用到了索引,用到了哪些索引?为什么? 请教大佬解惑

1885 次点击
所在节点    MySQL
13 条回复
cheng6563
2023-05-09 10:35:55 +08:00
索引只会用一个,这种情况猜就是 index ( a,b )咯
jtwor
2023-05-09 10:37:20 +08:00
索引最左匹配原则
brader
2023-05-09 10:42:59 +08:00
@cheng6563 #1 新版的 mysql ,有 index_merge 的功能,当然不是指题主这个语句一定会发生,只在某些情况下会出现
bootvue
2023-05-09 10:43:28 +08:00
一切皆有可能
fiypig
2023-05-09 10:45:40 +08:00
建个 a b c 在建个 a c 是不是比较好
RedisMasterNode
2023-05-09 10:53:18 +08:00
我再帮楼主细化一下问题以便于分类讨论。

现在有个 mysql 索引问题,表有三个字段:a ,b ,c ,共计 1000w 行数据。表中有三个索引 index(a,b), index(b,c),index(a,c)。现有查询 where a = 1 and b = 1 and c = 1 。

场景 1:
满足 a=1 and b=1 的数据有 999w 行,满足 b=1 and c=1 的数据有 999w 行,满足 a=1 and c=1 的数据有 100 行。

场景 2:
满足 a=1 and b=1 的数据有 999w 行,满足 b=1 and c=1 的数据有 999w 行,满足 a=1 and c=1 的数据有 999w 行。

场景 3:
满足 a=1 and b=1 的数据有 1 行,满足 b=1 and c=1 的数据有 1 行,满足 a=1 and c=1 的数据有 1 行。

场景 4:
满足 a=1 and b=1 的数据有 1000 行,满足 b=1 and c=1 的数据有 50 行,满足 a=1 and c=1 的数据有 10 行。

请问哪些字端用到了索引,用到了哪些索引?为什么? 请教大佬解惑

--------------------------------------
我认为的答案:
场景 1:
极大概率使用 index(a,c)

场景 2:
执行全表扫描

场景 3:
所有索引均有使用可能

场景 4:
所有索引均有使用可能
0littleboy
2023-05-09 10:54:48 +08:00
a,b
optional
2023-05-09 10:55:30 +08:00
其实用哪个跟你后面还有没有 order by 关系很大,没有的话你这个例子用哪个都有可能
optional
2023-05-09 10:57:10 +08:00
对了,还有 select
4lieS
2023-05-09 11:00:16 +08:00
盲猜会根据 a b c 三个字段区分度决定走哪个索引
demonps
2023-05-09 11:02:50 +08:00
搞几张表 explain 一下各种情况:(
oldshensheep
2023-05-09 11:09:43 +08:00
where a = ‘1’ and b = ‘1’ and c = ‘1’
其中 a = ‘1’ ,b = ‘1’ ,c = ‘1’ 这几个条件是可以随意排列组合的,是等价的。所以都有可能。

除非 MySQL 数据库太菜了。
morty0
2023-05-09 11:44:45 +08:00
取决于哪个索引的区分度更高, 跟存量数据和查询值有关

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/938507

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX