mysql LIMIT 子句用法及原理

2021-07-15 03:19:20 字數 2296 閱讀 3574

使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這個時候怎麼辦呢?不用擔心,已 經為我們提供了這樣乙個功能。

limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。

如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。

select * from table limit [offset,] rows | rows offset offset

這是兩個引數,第乙個是偏移量,第二個是數目

select * from employee limit 3, 7; // 返回4-11行

select * from employee limit 3,1; // 返回第4行

乙個引數

select * from employee limit 3; // 返回前3行

以前我在mysql中分頁都是用的 limit 100000,20這樣的方式,我相信你也是吧,但是要提高效率,讓分頁的**效率更高一些,更快一些,那我們又該怎麼做呢?

第一部分:看一下分頁的基本原理:

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

***************** 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)

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

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

如果limit m,n不可避免的話,要優化效率,只有盡可能的讓m小一下,我們擴充套件前面的clue做法,還是select * from message order by id desc,按id降序分頁,每頁20條,當前是第10頁,當前頁條目id最大的是2519,最小的是2500;

當是第10頁的sql如下:

select * from tb_goods_info where auto_id >=2500 order by auto_id asc limit 0,20

比如要跳到第9頁,sql語句可以這樣寫:

select * from tb_goods_info where auto_id <2500 order by auto_id desc limit 0,20

比如要跳到第8頁,sql語句可以這樣寫:

select * from tb_goods_info where auto_id <2500 order by auto_id desc limit 20,20

比如要跳到第7頁,sql語句可以這樣寫:

select * from tb_goods_info where auto_id <2500 order by auto_id desc limit 40,20

跳轉到第11頁:

select * from tb_goods_info where auto_id >2519 order by auto_id asc limit 0,20

跳轉到第12頁:

select * from tb_goods_info where auto_id >2519 order by auto_id asc limit 20,20

跳轉到第13頁:

select * from tb_goods_info where auto_id >2519 order by auto_id asc limit 40,20

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

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

已在60w資料總量的表中測試,效果非常明顯。文尾給出第11頁的

MySQL limit用法及效能分析

在我們使用查詢語句的時候,經常要返回前幾條或者中間某幾行資料 分頁 這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣乙個功能。具體語法 select from table limit offset,rows rows offset offsetlimit 子句可以被用於強制 select ...

Mysql limit分頁語句用法

與oracle和ms sqlserver相比,mysql的分頁方法簡單的讓人想哭。語法 select from table limit offset,rows rows offset offset 舉例 select from table limit5 返回前5行 select from table...

MySQL WHERE子句的用法

where 其實跟if差不多啦,就是查詢資料時判斷新增個條件。語法 select field1 field2 fieldn from table name1 table name2 where condition1 and or condition2 操作符 描述例項 等號,檢測兩個值是否相等,如果...