[英]How to query an index in WHERE and ORDER BY clause in MySQL?
請參閱 MySQL 8.0 新 DESC 索引功能的此文檔。
假設我有一個這樣的索引:
INDEX worstReviewIdx (rating ASC, hasReview DESC, id DESC)
這使我可以非常快速地按評級 ASC、hasReview DESC、id DESC 排序。 但是,在我的用例中,我需要提供分頁。 如果我將查詢限制為 10,我需要能夠找到保持上述排序順序的下 10 個項目。
MySQL 是否允許我做這樣的事情(其中 lastWorstReveiewIdx 是前一個分頁中最后一項的索引):
SELECT ... WHERE worstReviewIdx < {lastWorstReviewIdx} ORDER BY worstReviewIdx
問題不在於 ASC 與 DESC,而在於“記住你離開的地方”,然后使用與索引匹配的ORDER BY
來查找下一個 10。
在你的情況下,“你離開的地方”是一個三元組(rating, hasReview, id)
並用它來表示
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 的新索引功能。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.