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

改寫(xiě)后:

優(yōu)化方式四、降級(jí)策略
?配置limit的偏移量和獲取數(shù)一個(gè)最大值,超過(guò)這個(gè)最大值,就返回空數(shù)據(jù)(超過(guò)這個(gè)值你已經(jīng)不是在分頁(yè)了,而是在刷數(shù)據(jù)了,如果確認(rèn)要找數(shù)據(jù),應(yīng)該輸入合適條件來(lái)縮小范圍,而不是一頁(yè)一頁(yè)分頁(yè)。)
?這種降級(jí)邏輯在ES中也有體現(xiàn),當(dāng)深分頁(yè)數(shù)據(jù)大于10000時(shí)會(huì)報(bào)錯(cuò)。。。
?總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Sql查詢(xún)MySql數(shù)據(jù)庫(kù)中的表名和描述表中字段(列)信息
這篇文章主要介紹了Sql查詢(xún)獲取MySql數(shù)據(jù)庫(kù)中的表名和描述表中列名數(shù)據(jù)類(lèi)型,長(zhǎng)度,精度,是否可以為null,默認(rèn)值,是否自增,是否是主鍵,列描述等列信息2017-12-12
關(guān)于MySQL?B+樹(shù)索引與哈希索引詳解
索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),被設(shè)計(jì)用來(lái)快速查詢(xún)數(shù)據(jù)庫(kù)表中的特定記錄,下面這篇文章主要給大家介紹了關(guān)于MySQL?B+樹(shù)索引與哈希索引的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
MySQL基于索引的壓力測(cè)試的實(shí)現(xiàn)
本文主要介紹了MySQL基于索引的壓力測(cè)試的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
MySQL數(shù)據(jù)同步Elasticsearch的4種方案
本文主要介紹了MySQL數(shù)據(jù)同步Elasticsearch的4種方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
openEuler?RPM方式安裝MySQL8的實(shí)現(xiàn)
本文主要介紹了openEuler?RPM方式安裝MySQL8的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
MySQL服務(wù)器權(quán)限與對(duì)象權(quán)限詳解
這篇文章主要介紹了MySQL服務(wù)器權(quán)限與對(duì)象權(quán)限,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08

