MySQL分頁(yè)技術(shù)、6種分頁(yè)方法總結(jié)
概述
有朋友問(wèn): MySQL的分頁(yè)似乎一直是個(gè)問(wèn)題,有什么優(yōu)化方法嗎?
網(wǎng)上看到趕集網(wǎng)XX推薦了一些分頁(yè)方法,但似乎不太可行,你能點(diǎn)評(píng)一下嗎?
方法總結(jié)
方法1: 直接使用數(shù)據(jù)庫(kù)提供的SQL語(yǔ)句
語(yǔ)句樣式: MySQL中,可用如下方法: SELECT * FROM 表名稱 LIMIT M,N
適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量較少的情況(元組百/千級(jí))
原因/缺點(diǎn): 全表掃描,速度會(huì)很慢 且 有的數(shù)據(jù)庫(kù)結(jié)果集返回不穩(wěn)定(如某次返回1,2,3,另外的一次返回2,1,3). Limit限制的是從結(jié)果集的M位置處取出N條輸出,其余拋棄.
方法2: 建立主鍵或唯一索引, 利用索引(假設(shè)每頁(yè)10條)
語(yǔ)句樣式: MySQL中,可用如下方法: SELECT FROM 表名稱 WHERE id_pk > (pageNum10) LIMIT M
適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量多的情況(元組數(shù)上萬(wàn))
原因: 索引掃描,速度會(huì)很快. 有朋友提出: 因?yàn)閿?shù)據(jù)查詢出來(lái)并不是按照pk_id排序的,所以會(huì)有漏掉數(shù)據(jù)的情況,只能方法3
方法3: 基于索引再排序
語(yǔ)句樣式: MySQL中,可用如下方法: SELECT FROM 表名稱 WHERE id_pk > (pageNum10) ORDER BY id_pk ASC LIMIT M
適應(yīng)場(chǎng)景: 適用于數(shù)據(jù)量多的情況(元組數(shù)上萬(wàn)). 最好ORDER BY后的列對(duì)象是主鍵或唯一所以,使得ORDERBY操作能利用索引被消除但結(jié)果集是穩(wěn)定的(穩(wěn)定的含義,參見(jiàn)方法1)
原因: 索引掃描,速度會(huì)很快. 但MySQL的排序操作,只有ASC沒(méi)有DESC(DESC是假的,未來(lái)會(huì)做真正的DESC,期待…).
方法4: 基于索引使用prepare(第一個(gè)問(wèn)號(hào)表示pageNum,第二個(gè)?表示每頁(yè)元組數(shù))
語(yǔ)句樣式: MySQL中,可用如下方法: PREPARE stmt_name FROM SELECT FROM 表名稱 WHERE id_pk > (? ?) ORDER BY id_pk ASC LIMIT M
適應(yīng)場(chǎng)景: 大數(shù)據(jù)量
原因: 索引掃描,速度會(huì)很快. prepare語(yǔ)句又比一般的查詢語(yǔ)句快一點(diǎn)。
方法5: 存儲(chǔ)過(guò)程類(lèi)(最好融合上述方法4)
語(yǔ)句樣式: 不再給出
適應(yīng)場(chǎng)景: 大數(shù)據(jù)量. 作者推薦的方法
原因: 把操作封裝在服務(wù)器,相對(duì)更快一些。
方法6: 反面方法
網(wǎng)上有人寫(xiě)使用 SQL_CALC_FOUND_ROWS。 沒(méi)有道理,勿模仿
- MySql分頁(yè)時(shí)使用limit+order by會(huì)出現(xiàn)數(shù)據(jù)重復(fù)問(wèn)題解決
- 為什么MySQL分頁(yè)用limit會(huì)越來(lái)越慢
- mysql分頁(yè)的limit參數(shù)簡(jiǎn)單示例
- 淺談MySQL分頁(yè)Limit的性能問(wèn)題
- MySQL分頁(yè)Limit的優(yōu)化過(guò)程實(shí)戰(zhàn)
- mysql分頁(yè)性能探索
- 淺析Oracle和Mysql分頁(yè)的區(qū)別
- SpringMVC+Mybatis實(shí)現(xiàn)的Mysql分頁(yè)數(shù)據(jù)查詢的示例
- 利用Spring MVC+Mybatis實(shí)現(xiàn)Mysql分頁(yè)數(shù)據(jù)查詢的過(guò)程詳解
- mysql分頁(yè)時(shí)offset過(guò)大的Sql優(yōu)化經(jīng)驗(yàn)分享
- MySQL分頁(yè)分析原理及提高效率
- MySQL優(yōu)化案例系列-mysql分頁(yè)優(yōu)化
- 你應(yīng)該知道的PHP+MySQL分頁(yè)那點(diǎn)事
- MYSQL分頁(yè)limit速度太慢的優(yōu)化方法
- MySQL分頁(yè)優(yōu)化
- 8種MySQL分頁(yè)方法總結(jié)
- mysql分頁(yè)原理和高效率的mysql分頁(yè)查詢語(yǔ)句
- MySQL的幾種分頁(yè)方式,你知道幾種方式
相關(guān)文章
導(dǎo)致sql執(zhí)行速度慢的幾種情況盤(pán)點(diǎn)(生產(chǎn)環(huán)境踩過(guò)的坑)
盤(pán)點(diǎn)分析MySQL執(zhí)行速度慢可以幫助我們進(jìn)行優(yōu)化MySQL數(shù)據(jù)庫(kù)的效率,這篇文章主要給大家盤(pán)點(diǎn)介紹了關(guān)于導(dǎo)致sql執(zhí)行速度慢的幾種情況,文中介紹的這些主要是生產(chǎn)環(huán)境踩過(guò)的坑,需要的朋友可以參考下2023-03-03
mysql服務(wù)器查詢慢原因分析與解決方法小結(jié)
在開(kāi)發(fā)的朋友特別是和mysql有接觸的朋友會(huì)碰到有時(shí)mysql查詢很慢,當(dāng)然我指的是大數(shù)據(jù)量百萬(wàn)千萬(wàn)級(jí)了,不是幾十條了,下面我們來(lái)看看解決查詢慢的辦法2012-04-04
解決MySQL報(bào)錯(cuò)1267 - Illegal mix of coll
這篇文章主要給大家介紹了解決MySQL報(bào)錯(cuò)1267 - Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8mb4_general_ci,IMPL的問(wèn)題,文中有詳細(xì)的解決方案,需要的朋友可以參考下2023-09-09
MySQL索引優(yōu)化之分頁(yè)探索詳細(xì)介紹
大家好,本篇文章主要講的是MySQL索引優(yōu)化之分頁(yè)探索詳細(xì)介紹,感興趣的同學(xué)趕快來(lái)看看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
MyBatis中實(shí)現(xiàn)動(dòng)態(tài)SQL標(biāo)簽
動(dòng)態(tài)SQL是MyBatis的一項(xiàng)強(qiáng)大功能,它允許開(kāi)發(fā)者根據(jù)條件動(dòng)態(tài)地生成SQL語(yǔ)句,本文主要介紹了MyBatis中實(shí)現(xiàn)動(dòng)態(tài)SQL標(biāo)簽,感興趣的可以可以了解一下2024-09-09
使用Rotate Master實(shí)現(xiàn)MySQL 多主復(fù)制的實(shí)現(xiàn)方法
眾所周知,MySQL只支持一對(duì)多的主從復(fù)制,而不支持多主(multi-master)復(fù)制2012-05-05
mysql使用GROUP BY分組實(shí)現(xiàn)取前N條記錄的方法
這篇文章主要介紹了mysql使用GROUP BY分組實(shí)現(xiàn)取前N條記錄的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了mysql中GROUP BY分組的相關(guān)使用技巧,需要的朋友可以參考下2016-06-06

