首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL的WHERE和ORDER BY子句中查询索引?

如何在MySQL的WHERE和ORDER BY子句中查询索引?
EN

Stack Overflow用户
提问于 2021-06-17 06:42:43
回答 1查看 23关注 0票数 0

请参考MySQL 8.0新的DESC索引功能的此documentation

假设我有一个这样的索引:

代码语言:javascript
复制
INDEX worstReviewIdx (rating ASC, hasReview DESC, id DESC)

这让我可以通过评级ASC,hasReview DESC,id DESC非常快速地订购。但是,在我的用例中,我需要提供分页。如果我将查询限制为10个,我需要能够找到保持上述排序顺序的下10个项目。

MySQL是否允许我这样做(其中lastWorstReveiewIdx是前一个分页中最后一项的索引):

代码语言:javascript
复制
SELECT ... WHERE worstReviewIdx < {lastWorstReviewIdx} ORDER BY worstReviewIdx
EN

回答 1

Stack Overflow用户

发布于 2021-06-17 10:20:20

问题不是ASC vs DESC,而是“记住你停下来的地方”,然后使用一个与索引匹配的ORDER BY来查找下10个。

在你的例子中,“你停下来的地方”是一个三重(rating, hasReview, id),用它来表示本质上

代码语言:javascript
复制
WHERE (rating, hasReview, id) > ($r, $h, $id)   -- not quite right
ORDER BY rating ASC, hasReview DESC, id DESC
LIMIT 10

(我建议使用LIMIT 11,这样您就可以知道是否会有更多。)

我不清楚MySQL 8.0是否像WHERE中所示那样优化了“行构造函数”表达式。无论如何,它不能像您需要的那样来回切换ASC/DESC的混合。因此,您需要拼写出一个相当长的复杂布尔表达式,如下所述:http://mysql.rjweb.org/doc.php/pagination

如果添加一个计算为(- rating)GENERATED列,然后使用它而不是rating --这将使这三个列都为DESC,则可以避免很多这种讨论和复杂性。(而且您不需要8.0的新索引功能。)

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

https://stackoverflow.com/questions/68010841

复制
相关文章

相似问题

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