提公升mysql的分頁效率

2021-08-25 14:55:58 字數 1548 閱讀 1831

percona performance conference 2009上,來自雅虎的幾位工程師帶來了一篇」efficient pagination using mysql「的報告,有很多亮點,本文是在原文基礎上的進一步延伸。

首先看一下分頁的基本原理:

mysql> explain select * from message order by id desc limit 10000, 20\g

***************** 1. row **************

id: 1

select_type: ******

table: message

type: index

possible_keys: null

key: primary

key_len: 4

ref: null

rows: 10020

extra:

1 row in set (0.00 sec)

limit 10000,20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行,問題就在這裡,如果是limit 100000,100,需要掃瞄100100行,在乙個高併發的應用裡,每次查詢需要掃瞄超過10w行,效能肯定大打折扣。文中還提到limit n效能是沒問題的,因為只掃瞄n行。

select * from message where id > 9527 order by id asc limit 20;

select * from message where id < 9500 order by id desc limit 20;

不管翻多少頁,每次查詢只掃瞄20行。

如果limit m,n不可避免的話,要優化效率,只有盡可能的讓m小一下,我們擴充套件前面的」clue」做法,還是select * from message order by id desc,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是9527,最小的是9500,比如要跳到第8頁,我看的sql語句可以這樣寫:

select * from message where id > 9527 order by id asc limit 20,20;

跳轉到第13頁:

select * from message where id < 9500 order by id desc limit 30,20;

原理還是一樣,記錄住當前頁id的最大值和最小值,計算跳轉頁面和當前頁相對偏移,由於頁面相近,這個偏移量不會很大,這樣的話m值相對較小,大大減少掃瞄的行數。其實傳統的limit m,n,相對的偏移一直是第一頁,這樣的話越翻到後面,效率越差,而上面給出的方法就沒有這樣的問題。

注意sql語句裡面的asc和desc,如果是asc取出來的結果,顯示的時候記得倒置一下。

已在60w資料總量的表中測試,效果非常明顯。

from:[url]

mysql 分頁效率 MySQL提高分頁效率

提高分頁效率 實現分頁時只讀取顯示資料,需要先在資料庫建立資料庫 testforpaging use testforpaging go 建立表somedata create table somedata id int primary key,name varchar 30 null,descript...

MySQL提高分頁效率

下面就是大資料量時提高分頁的效率的測試 分享給大家。提高分頁效率 實現分頁時只讀取顯示資料,需要先在資料庫建立資料庫 testforpaging use testforpaging go 建立表somedata create table somedata id int primary key,nam...

提公升你的效率

最近發現工作中,老是有些很讓人煩躁的事情,而這些事情你不做就沒有人去做,從而會導致整個專案就會是有你的進度而確定的。先簡單概述下,狀況 我負責整合工作 有兩三個同事負責提供庫,還有乙個專案經理打包和一名測試人員,大家坐的位置比較分散。我這邊的 量不是很多,庫那邊的同事也主要是修改。但他媽的這個工作的...