SQL數據量很大,分頁查詢很慢,怎麼破解?(SQL分頁查詢 提升 效率/速度 虛擬表/子查詢)

SQL數據量很大,分頁查詢很慢,怎麼破解?(SQL分頁查詢 提升 效率/速度 虛擬表/子查詢)

SQL數據量很大,分頁查詢很慢,怎麼破解?(SQL分頁查詢 提升 效率/速度 虛擬表/子查詢)


資料來源: https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247486969&idx=2&sn=34a5774bdeac23482c1293d06124a88d&chksm=fbb28407ccc50d11ea645c32aad46c19f010b117030b99dbb22c69197d8fa6ed2096bfc66ed4&scene=0&xtrack=1&key=a63109c5a100aa9c73de5b32a36f313224ec837c09f7e28845ff85cd9cd85deb7a880c22f171f80c2040d67afc2cc8d466895028677d02c5a63ebe66124b0cf3798b4c36ee52a32b44b2d07c7d9a1877&ascene=1&uin=MjIwODk2NDgxNw%3D%3D&devicetype=Windows+10&version=62060833&lang=zh_TW&pass_ticket=BtHGC%2FC2Z9q0FzeIoqBPfgT5chmYVOKAetBSdhHCYvn9sckcc6yfiK3WRX668dyT



為了對下面列舉的一些優化進行測試,下面針對已有的一張表進行說明。

▲表名:order_history

▲描述:某個業務的訂單歷史表

▲主要字段:unsigned int id,tinyint(4) int type

▲字段情況:該表一共37個字段,不包含text等大型數據,最大為varchar(500),id字段為索引,且為遞增。

▲數據量:5709294

▲MySQL版本:5.7.16 線下找一張百萬級的測試表可不容易,如果需要自己測試的話,可以寫shell腳本什麼的插入數據進行測試。以下的sql 所有語句執行的環境沒有發生改變,下面是基本測試結果:

select count(*) from orders_history;
#返回結果:5709294
#三次查詢時間分別為:
 #8903 ms
 #8323 ms
 #8401 ms


SELECT * FROM  table  LIMIT [ offset ,] rows | rows  OFFSET  offset

#LIMIT 子句可以被用於指定SELECT 語句返回的記錄數。需注意以下幾點:
#第一個參數指定第一個返回記錄行的偏移量,注意從0開始
#第二個參數指定返回記錄行的最大數目
#如果只給定一個參數:它表示返回最大的記錄行數目
#第二個參數為-1 表示檢索從某一個偏移量到記錄集的結束所有的記錄行
#初始記錄行的偏移量是0(而不是1)

select * from orders_history where  type = 8  order  by  id  limit  10000 , 10 ;
#三次查詢時間分別為:
#3040 ms
#3063 ms
#3018 ms


最後實驗

select * from orders_history where  type = 8  limit  100000 , 1 ; 

select  id  from orders_history where  type = 8  limit  100000 , 1 ; 

select * from orders_history where  type = 8  and 
id >=( select  id  from orders_history where  type = 8  limit  100000 , 1 )
limit  100 ; 

select * from orders_history where  type = 8  limit  100000 , 100 ;

#第1條語句:3674ms

#第2條語句:1315ms

#第3條語句:1327ms

#第4條語句:3710ms 


2 thoughts on “SQL數據量很大,分頁查詢很慢,怎麼破解?(SQL分頁查詢 提升 效率/速度 虛擬表/子查詢)

  1. https://mp.weixin.qq.com/s/6TThlJICZzgGqad-sX1BrQ

    讀取適當的記錄LIMIT M,N,而不要讀多餘的記錄

    select id,name from t limit 866613, 20 [X]

    使用上述sql語句做分頁的時候,可能有人會發現,隨著表數據量的增加,直接使用limit分頁查詢會越來越慢。

    對於 limit m, n 的分頁查詢,越往後面翻頁(即m越大的情況下)SQL的耗時會越來越長,對於這種應該先取出主鍵id,然後通過主鍵id跟原表進行Join關聯查詢。因為MySQL 並不是跳過offset 行,而是取 offset+N 行,然後放棄前offset 行,返回N 行,那當offset 特別大的時候,效率就非常的低下,要么控制返回的總頁數,要么對超過特定閾值的頁數進行SQL 改寫。

    優化的方法如下:可以取前一頁的最大行數的id(將上次遍歷到的最末尾的數據ID傳給數據庫,然後直接定位到該ID處,再往後面遍歷數據),然後根據這個最大的id來限制下一頁的起點。比如此列中,上一頁最大的id是866612。sql可以採用如下的寫法:

    select id,name from table_name where id> 866612 limit 20 [O]

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *