簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM