MySql中深度分頁(yè)的問(wèn)題處理
什么是深度分頁(yè)?
MySql深度分頁(yè)的問(wèn)題,就是比如我們需要所查詢(xún)出的表數(shù)據(jù)量較大,需要進(jìn)行查詢(xún)結(jié)果返回集的后面部分,所出現(xiàn)的性能問(wèn)題。
比如說(shuō)我們有一個(gè)一百萬(wàn)數(shù)據(jù)量的表,我們分頁(yè)需要查詢(xún)99990,10,數(shù)據(jù)庫(kù)通常情況下會(huì)先掃描前99990條數(shù)據(jù), 再進(jìn)行分頁(yè)返回最后10條,這樣就會(huì)導(dǎo)致查詢(xún)接口性能變慢,隨著OFFSET
值的增大,查詢(xún)性能會(huì)顯著下降。
這是因?yàn)镸ySQL需要掃描從第一條記錄到OFFSET指定的位置,然后返回LIMIT數(shù)量的結(jié)果,這在大數(shù)據(jù)集中會(huì)導(dǎo)致大量的磁盤(pán)I/O操作和較慢的查詢(xún)響應(yīng)時(shí)間。
解決方案
1. 子查詢(xún)過(guò)濾主鍵ID
因?yàn)镸ysql中主鍵ID數(shù)據(jù)聚集索引,所有的數(shù)據(jù)都存儲(chǔ)在該節(jié)點(diǎn)的葉子節(jié)點(diǎn)上,所以如果我們使用了ID過(guò)濾條件
MySQL就會(huì)跳過(guò)前面的索引,也就不會(huì)掃描前方的數(shù)據(jù),進(jìn)行一個(gè)高效的過(guò)濾查詢(xún)
其實(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. 基于子查詢(xún)進(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中,子查詢(xún)中name是索引的情況下是不需要回表的
當(dāng)基于我們需要范圍ID中能快速找出我們所需要對(duì)應(yīng)的數(shù)據(jù),深度分頁(yè)帶來(lái)的性能問(wèn)題也能游刃而解
且這種方式是返回的具體的ID集合,不僅快而且數(shù)據(jù)量也是我們指定
3. 倒序分頁(yè)
如果數(shù)據(jù)是按時(shí)間戳或其他遞增字段排序的,可以考慮倒序查詢(xún)
即先找出最大的ID,然后逐步往前查,這在某些場(chǎng)景下可以提高效率
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL索引類(lèi)型總結(jié)和使用技巧以及注意事項(xiàng)
索引是快速搜索的關(guān)鍵。MySQL索引的建立對(duì)于MySQL的高效運(yùn)行是很重要的。下面介紹幾種常見(jiàn)的MySQL索引類(lèi)型2014-04-04MySQL同步Elasticsearch的6種方案小結(jié)
在分布式架構(gòu)中,MySQL與Elasticsearch(ES)的協(xié)同已成為解決高并發(fā)查詢(xún)與復(fù)雜檢索的標(biāo)配組合,本文整理了MySQL同步ES的6種主流方案,大家可以根據(jù)自己的需要進(jìn)行選擇2025-05-05在Linux環(huán)境下mysql的root密碼忘記解決方法(三種)
這篇文章主要介紹了在Linux環(huán)境下mysql的root密碼忘記解決方法,詳細(xì)的介紹了3種解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2016-12-12windows下MySQL數(shù)據(jù)庫(kù)移動(dòng)到其它盤(pán)
大家好,本篇文章主要講的是windows下MySQL數(shù)據(jù)庫(kù)移動(dòng)到其它盤(pán),感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏2021-12-12mysql報(bào)錯(cuò)RSA?private?key?file?not?found的解決方法
當(dāng)MySQL報(bào)錯(cuò)RSA?private?key?file?not?found時(shí),可能是由于MySQL的RSA私鑰文件丟失或者損壞導(dǎo)致的,此時(shí)可以重新生成RSA私鑰文件,以解決這個(gè)問(wèn)題2023-06-06MySQL數(shù)據(jù)庫(kù)優(yōu)化的六種方式總結(jié)
關(guān)于數(shù)據(jù)庫(kù)優(yōu)化,網(wǎng)上有不少資料和方法,但是不少質(zhì)量參差不齊,所以下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)優(yōu)化的六種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01VMware中Linux共享mysql數(shù)據(jù)庫(kù)的方法
VMware中Linux共享mysql數(shù)據(jù)庫(kù)的方法,需要的朋友可以參考下。2010-11-11