個別場景沒必要排序

xuexiaogang 發表於 2022-05-02

我原創連線

https://mp.weixin.qq.com/s/3Zx8EBTGwp4sn96AHKJWiQ


經常遇到索引比列還要多的表。為什麼?因為開發結合業務需求一個場景一個索引。比如說一個表有id,name,status,time幾個欄位吧。然後看看這表的索引可能會出現如下的索引:

1、name

2、time

3、name+time

4、time+name

5、status

6、name+status

7、name+status+time

8、status+time

。。。。。。沒完,我就不一一寫了。因為結合業務場景。每個場景來一下,然後發現還是不快,那在已有的上再加一列,或者反過來試試,再或者孫行者這樣不行,者行孫試試?於是乎就出現了類似上面的,各種排列組合。我這還寫少了。實際中怎麼可能就這幾個欄位。

      真正結合業務一般怎麼來?比如我有個訂單表,站在使用者維度一定是要看自己的,傳入進來的一定帶userid。然後使用者一定看自己最新的然後往下翻。。。。。。那麼檢索條件應該是userid+time+其他的什麼我們先不管。但是前兩個要素userid和time定了。這是場景1

       還是這個訂單,運營人員想看看最近一週哪些使用者買的東西最多。一定是time+userdi++其他的什麼我們先不管。但是前兩個要素time和userid定了。這是場景2

   當然必須包括訂單號了。比如說id。那麼以上三個場景按照出現頻次來說佔這個表的select總數多少?我估計99.99%以上。如果這個公司業務量大,日活使用者100w。那麼每天100w次場景1,場景2可能幾百次吧。場景3至少100萬次。這個體量的公司也算可以了。

   假設這就是那個表了。以MySQL為例,Oracle PG也一樣。

個別場景沒必要排序 個別場景沒必要排序

針對場景1來說我只要建立i1索引。

實驗資料如下:

個別場景沒必要排序

個別場景沒必要排序 我先查一下c使用者。注意我沒排時間,時間倒序了。因為我索引指定desc了。

個別場景沒必要排序

個別場景沒必要排序 再看一次

個別場景沒必要排序 個別場景沒必要排序

那麼這個是的我帶上其他條件。看到了嗎?不影響。

個別場景沒必要排序 個別場景沒必要排序

這意味著我們索引就2列,其他不見得都要帶進來。(單表場景下可以)基於這個單表簡單場景,注意一定是單表簡單場景。就可以limit分頁一頁一頁往下了。

其他幾個也看一下吧。

個別場景沒必要排序 個別場景沒必要排序 個別場景沒必要排序

個別場景沒必要排序

補充說一下MySQL8才支援倒序。

其他資料庫只要支援倒序索引就行。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2890231/,如需轉載,請註明出處,否則將追究法律責任。