现在有个 mysql 索引问题,表有三个字端:a ,b ,c 表中有三个索引 index ( a,b ), index(b,c),index ( a,c ) 现有查询 where a = ‘1’ and b = ‘1’ and c = ‘1’ 请问哪些字端用到了索引,用到了哪些索引?为什么? 请教大佬解惑
1
cheng6563 2023-05-09 10:35:55 +08:00 1
索引只会用一个,这种情况猜就是 index ( a,b )咯
|
2
jtwor 2023-05-09 10:37:20 +08:00 1
索引最左匹配原则
|
3
brader 2023-05-09 10:42:59 +08:00 1
@cheng6563 #1 新版的 mysql ,有 index_merge 的功能,当然不是指题主这个语句一定会发生,只在某些情况下会出现
|
4
bootvue 2023-05-09 10:43:28 +08:00 2
一切皆有可能
|
5
fiypig 2023-05-09 10:45:40 +08:00 1
建个 a b c 在建个 a c 是不是比较好
|
6
RedisMasterNode 2023-05-09 10:53:18 +08:00 2
我再帮楼主细化一下问题以便于分类讨论。
现在有个 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: 所有索引均有使用可能 |
7
0littleboy 2023-05-09 10:54:48 +08:00 1
a,b
|
8
optional 2023-05-09 10:55:30 +08:00 via iPhone 1
其实用哪个跟你后面还有没有 order by 关系很大,没有的话你这个例子用哪个都有可能
|
9
optional 2023-05-09 10:57:10 +08:00 via iPhone 1
对了,还有 select
|
10
4lieS 2023-05-09 11:00:16 +08:00 1
盲猜会根据 a b c 三个字段区分度决定走哪个索引
|
11
demonps 2023-05-09 11:02:50 +08:00 1
搞几张表 explain 一下各种情况:(
|
12
oldshensheep 2023-05-09 11:09:43 +08:00 via iPhone 1
where a = ‘1’ and b = ‘1’ and c = ‘1’
其中 a = ‘1’ ,b = ‘1’ ,c = ‘1’ 这几个条件是可以随意排列组合的,是等价的。所以都有可能。 除非 MySQL 数据库太菜了。 |
13
morty0 2023-05-09 11:44:45 +08:00 1
取决于哪个索引的区分度更高, 跟存量数据和查询值有关
|