MySql中深度分頁的問題處理
什么是深度分頁?
MySql深度分頁的問題,就是比如我們需要所查詢出的表數(shù)據(jù)量較大,需要進(jìn)行查詢結(jié)果返回集的后面部分,所出現(xiàn)的性能問題。
比如說我們有一個一百萬數(shù)據(jù)量的表,我們分頁需要查詢99990,10,數(shù)據(jù)庫通常情況下會先掃描前99990條數(shù)據(jù), 再進(jìn)行分頁返回最后10條,這樣就會導(dǎo)致查詢接口性能變慢,隨著OFFSET
值的增大,查詢性能會顯著下降。
這是因?yàn)镸ySQL需要掃描從第一條記錄到OFFSET指定的位置,然后返回LIMIT數(shù)量的結(jié)果,這在大數(shù)據(jù)集中會導(dǎo)致大量的磁盤I/O操作和較慢的查詢響應(yīng)時間。
解決方案
1. 子查詢過濾主鍵ID
因?yàn)镸ysql中主鍵ID數(shù)據(jù)聚集索引,所有的數(shù)據(jù)都存儲在該節(jié)點(diǎn)的葉子節(jié)點(diǎn)上,所以如果我們使用了ID過濾條件
MySQL就會跳過前面的索引,也就不會掃描前方的數(shù)據(jù),進(jìn)行一個高效的過濾查詢
其實(shí)這也就是利用InndeDB中主鍵索引的優(yōu)點(diǎn),但是這有一個前提的咱們的主鍵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ù)是按時間戳或其他遞增字段排序的,可以考慮倒序查詢
即先找出最大的ID,然后逐步往前查,這在某些場景下可以提高效率
總結(jié)
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C3P0連接池+MySQL的配置及wait_timeout問題的解決方法
這篇文章主要介紹了C3P0連接池+MySQL的配置及wait_timeout問題的解決方法,本文介紹的非常詳細(xì),具有參考借鑒價值,需要的朋友可以參考下2016-09-09mysql命令導(dǎo)出表結(jié)構(gòu)和數(shù)據(jù)的操作方法
在日常使用中,我們經(jīng)常需要對數(shù)據(jù)庫進(jìn)行備份和復(fù)制,因此必須了解如何導(dǎo)出表結(jié)構(gòu)和表數(shù)據(jù),以下是使用MySQL命令導(dǎo)出表結(jié)構(gòu)和表數(shù)據(jù)的方法,感興趣的朋友一起看看吧2023-11-11MYSQL 隨機(jī) 抽取實(shí)現(xiàn)方法及效率分析
MYSQL的隨機(jī)抽取實(shí)現(xiàn)方法。舉個例子,要從tablename表中隨機(jī)提取一條記錄,大家一般的寫法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。2009-05-05mysql zip archive 版本(5.7.19)安裝教程詳細(xì)介紹
這篇文章主要介紹了mysql zip archive 版本(5.7.19)安裝教程詳細(xì)介紹,需要的朋友可以參考下2017-10-10解決MySQL主從數(shù)據(jù)庫沒有同步的兩種方法
這篇文章主要介紹了解決MySQL主從數(shù)據(jù)庫沒有同步的兩種方法,需要的朋友可以參考下面文章內(nèi)容2021-09-09