MySql中深度分頁的問題處理
什么是深度分頁?
MySql深度分頁的問題,就是比如我們需要所查詢出的表數(shù)據(jù)量較大,需要進(jìn)行查詢結(jié)果返回集的后面部分,所出現(xiàn)的性能問題。
比如說我們有一個(gè)一百萬數(shù)據(jù)量的表,我們分頁需要查詢99990,10,數(shù)據(jù)庫通常情況下會(huì)先掃描前99990條數(shù)據(jù), 再進(jìn)行分頁返回最后10條,這樣就會(huì)導(dǎo)致查詢接口性能變慢,隨著OFFSET值的增大,查詢性能會(huì)顯著下降。
這是因?yàn)镸ySQL需要掃描從第一條記錄到OFFSET指定的位置,然后返回LIMIT數(shù)量的結(jié)果,這在大數(shù)據(jù)集中會(huì)導(dǎo)致大量的磁盤I/O操作和較慢的查詢響應(yīng)時(shí)間。
解決方案
1. 子查詢過濾主鍵ID
因?yàn)镸ysql中主鍵ID數(shù)據(jù)聚集索引,所有的數(shù)據(jù)都存儲(chǔ)在該節(jié)點(diǎn)的葉子節(jié)點(diǎn)上,所以如果我們使用了ID過濾條件
MySQL就會(huì)跳過前面的索引,也就不會(huì)掃描前方的數(shù)據(jù),進(jìn)行一個(gè)高效的過濾查詢
其實(shí)這也就是利用InndeDB中主鍵索引的優(yōu)點(diǎn),但是這有一個(gè)前提的咱們的主鍵ID必須是自增ID
SELECT * FROM table_name 2WHERE id >= (SELECT id FROM table_name ORDER BY some_column LIMIT 100000, 1) 3ORDER BY some_column LIMIT 10;
2. 基于子查詢進(jìn)行優(yōu)化
SELECT a.* FROM table_name a inner join ( select id from table_name where name="**" order by id limit 10000 10 ) b on a.id=b.id
在InndeDB中,子查詢中name是索引的情況下是不需要回表的
當(dāng)基于我們需要范圍ID中能快速找出我們所需要對應(yīng)的數(shù)據(jù),深度分頁帶來的性能問題也能游刃而解
且這種方式是返回的具體的ID集合,不僅快而且數(shù)據(jù)量也是我們指定
3. 倒序分頁
如果數(shù)據(jù)是按時(shí)間戳或其他遞增字段排序的,可以考慮倒序查詢
即先找出最大的ID,然后逐步往前查,這在某些場景下可以提高效率
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql sql語句性能調(diào)優(yōu)簡單實(shí)例
這篇文章主要介紹了 mysql sql語句性能調(diào)優(yōu)簡單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06
k8s搭建mysql集群實(shí)現(xiàn)主從復(fù)制的方法步驟
本文是基于已有k8s環(huán)境下,介紹在k8s環(huán)境中部署mysql主從集群的實(shí)現(xiàn)步驟,對mysql學(xué)習(xí)有一定的幫助,感興趣的可以學(xué)習(xí)一下2023-01-01
Mysql 5.6.37 winx64安裝雙版本mysql筆記記錄
機(jī)器上現(xiàn)在已經(jīng)存在5.0版本MySQL的情況下裝一個(gè)最新版的mysql,下文通過實(shí)例代碼給大家介紹Mysql 5.6.37 winx64安裝雙版本mysql筆記記錄,感興趣的朋友一起看看吧2017-07-07
Mysql清空表數(shù)據(jù)庫命令truncate和delete詳解
這篇文章主要介紹了Mysql數(shù)據(jù)庫清空表truncate和delete的相關(guān)知識(shí),本文給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
MYSQL實(shí)現(xiàn)添加購物車時(shí)防止重復(fù)添加示例代碼
在向mysql中插入數(shù)據(jù)的時(shí)候最需要注意的就是防止重復(fù)發(fā)添加數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MYSQL如何實(shí)現(xiàn)添加購物車的時(shí)候防止重復(fù)添加的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
MySQL安裝時(shí)一直卡在starting?server的問題及解決方法
這篇文章主要介紹了MySQL安裝時(shí)一直卡在starting?server的問題及解決方法,出現(xiàn)這種情況大概有兩個(gè)原因,文中對每種原因給大家詳細(xì)介紹,需要的朋友可以參考下2022-06-06
MySQL數(shù)據(jù)庫索引及底層數(shù)據(jù)結(jié)構(gòu)詳解
MySQL默認(rèn)使用B+樹索引和InnoDB引擎,索引通過有序結(jié)構(gòu)加速數(shù)據(jù)檢索,但增加存儲(chǔ)與維護(hù)成本,B+樹優(yōu)化了磁盤讀寫與范圍查詢效率,成為主流選擇,本文介紹MySQL數(shù)據(jù)庫索引及底層數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),感興趣的朋友一起看看吧2025-08-08

