请教大家 如 select * from V2EX where a = 1 order by b desc limit 1 的 sql 如何建立索引?

2019-08-13 10:37:47 +08:00
 Nicolay
5442 次点击
所在节点    MySQL
12 条回复
cz5424
2019-08-13 10:42:55 +08:00
a,b 联合索引不行吗
Raymon111111
2019-08-13 10:43:46 +08:00
不考虑其它查询和区分度的话

建联合索引 a, b
limuyan44
2019-08-13 14:39:17 +08:00
连上你的 mysql,explain
passerbytiny
2019-08-13 14:42:32 +08:00
不知道我理解的对不对,除了直接查索引的( select pk from table where pk > some 这种的),排序跟索引无关。
reus
2019-08-13 14:44:42 +08:00
explain 一下
建索引
再 explain 看看有没有不一样
就行了
Oktfolio
2019-08-13 15:40:04 +08:00
联合索引 a, b
Laz
2019-08-13 15:44:00 +08:00
explain
Zach369
2019-08-13 15:45:38 +08:00
如果只看这个 sql 语句,a,b 联合索引就可以了。 但是也要看实际情况。explain 看下。
xaoduer
2019-08-13 16:19:11 +08:00
a,b 联合索引的时候,先根据 a 索引查找出 a=1 的行,如果没有 desc,直接根据最左前缀从 b 索引取第一条即可。但如果是 desc,是不是意味着要对所有 a=1 的结果由正序变成逆序,刚好对应排序算法的最坏复杂度,看起来执行效率比单个 a 索引更差?
gam2046
2019-08-13 17:06:08 +08:00
@xaoduer #8 应该不是结果由正序变逆序。自然结果下,并不一定是正序啊。所以也不能推导出,最坏的排序复杂度。

从 SQL 语句看,a、b 字段加索引就可以了。
Varchar
2019-08-13 17:54:03 +08:00
感觉 a、b 各自单独加索引或者联合索引区别不大 从扫描级别上看,应该都是 ref
Aresxue
2019-08-26 15:54:37 +08:00
猜一下,a 字段只有两种取值,所以扫描行数过多,导致 CBO 放弃走索引执行全表扫描(联合索引 a,b 同理,因为 mysql 索引是最左匹配原则,联合索引 a,b 你可以想象成在 B+树的分支中挑选出为 a 的子树,然后再在当前范围中找出为 b 的子树,但在熟筛选 a 的时候这个执行计划就被 CBO 放弃了)。

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

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

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

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

© 2021 V2EX