高效的MySQL分頁 利用子查詢分頁

2021-09-08 17:06:17 字數 1467 閱讀 8632

——先抄回來~~~

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

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

***************** 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 idasclimit 20;

select * from message where id < 9500 order by iddesclimit 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 idasclimit 20,20;

跳轉到第13頁:

select * from message where id < 9500 order by iddesclimit 40,20;

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

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

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

子查詢和高效分頁

select id from classes where name 一期 select from students where cid select id from classes where name 一期 子查詢 select from students where cid in select ...

高效的MySQL分頁

size large percona performance conference 2009上,來自雅虎的幾位工程師帶來了一篇 efficient pagination using mysql 的報告,有很多亮點,本文是在原文基礎上的進一步延伸。首先看一下分頁的基本原理 mysql explain ...

Mysql高效分頁

通常針對mysql大資料量的查詢採取 分頁 策略,但是如果翻頁到比較靠後的位置時查詢將變得很慢,因為mysql將花費大量的時間來掃瞄需要丟棄的資料。通常情況下,為了實現高效分頁,需要在查詢中where條件列和排序列應用組合索引。例如,建立索引 a,b,c 使得以下查詢可以使用索引,提高查詢效率 1 ...