Mysql大數(shù)據(jù)量分頁優(yōu)化過程
MySQL分頁 (limit offset ,N)并不是跳過 offset 行,而是取 offset+N 行,然后返回放棄前 offset 行,返回 N 行,那當offset特別大的時候,效率就非常的低下。
比如 limit 9999990,10 則mysql 一共會查詢 9999990+10條數(shù)據(jù)(一千萬條)然后拋棄掉前邊的9999990條數(shù)據(jù),返回最后10條
優(yōu)化思路:
- 控制返回的總頁數(shù)
- 對超過特定閾值的頁數(shù)進行 SQL改寫。
未優(yōu)化時普通sql
SELECT count(id) FROM `alarm_base` SELECT * FROM alarm_base limit 9000000,25
優(yōu)化方式一、索引覆蓋+子查詢優(yōu)化
SELECT * FROM alarm_base WHERE id >=(SELECT id FROM alarm_base limit 9000000,1) ORDER BY id limit 25
可能有小伙伴有疑問了,你子查詢不也得查900_0000+1條數(shù)據(jù)嗎?
確實是這樣,但查的僅僅只是900_0000+1條數(shù)據(jù)的Id,且Id還是主鍵
優(yōu)化方式二、起始位置重定義
# 前提 1:(默認ID自增生成、升序排列) # id> (pageIndex-1)*pageSize # 前提二 2:(記住上次查找結果的主鍵位置,但只能一頁一頁分,跳頁會有問題) # 兩個前提滿足其一即可使用 # sql SELECT * FROM alarm_base WHERE id>=2300316 limit 25
優(yōu)化方式三、利用延遲關聯(lián)或者子查詢
正例:先快速定位需要獲取的 id 段,然后再關聯(lián): SELECT t1.* FROM 表 as t1, (select id from 表 where 條件 LIMIT 100000,20 ) as t2 where t1.id=t2.id
改寫前:

改寫后:

優(yōu)化方式四、降級策略
?配置limit的偏移量和獲取數(shù)一個最大值,超過這個最大值,就返回空數(shù)據(jù)(超過這個值你已經不是在分頁了,而是在刷數(shù)據(jù)了,如果確認要找數(shù)據(jù),應該輸入合適條件來縮小范圍,而不是一頁一頁分頁。)
?這種降級邏輯在ES中也有體現(xiàn),當深分頁數(shù)據(jù)大于10000時會報錯。。。
?總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Sql查詢MySql數(shù)據(jù)庫中的表名和描述表中字段(列)信息
這篇文章主要介紹了Sql查詢獲取MySql數(shù)據(jù)庫中的表名和描述表中列名數(shù)據(jù)類型,長度,精度,是否可以為null,默認值,是否自增,是否是主鍵,列描述等列信息2017-12-12
MySQL數(shù)據(jù)同步Elasticsearch的4種方案
本文主要介紹了MySQL數(shù)據(jù)同步Elasticsearch的4種方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03
openEuler?RPM方式安裝MySQL8的實現(xiàn)
本文主要介紹了openEuler?RPM方式安裝MySQL8的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-01-01

