mysql 中limit 關鍵字

2021-06-08 20:37:33 字數 4090 閱讀 2125

一、基本

sql的limit語法的如以下形式

select * from table 

limit

[offset

,] rows

|rows

offset

offset

當省略offset

的時候,

offset作為0

處理,表示提取查詢到的前

rows

條資料;

當offse

t>

=0時候,表示提取查詢到的

從offset

開始的rows

條資料;此時如果

rows

<0

表示提取查詢到的

從offset

開始的所有資料

當offset

<0

的時候,表示提取查詢到的除出後

rows

條資料的所有資料,即剔除

last row

-rows

到last rows

之間的-

rows

條資料

另外,如果

rows

大於實際查詢的資料條數,則取

rows

為實際查詢的資料條數。

二、例項

例項1

檢索記錄行 6-15

select * from table limit 5,10;

為了檢索從某乙個偏移量到記錄集的結束所有的記錄行,可以指定

rows

引數為 -1:

例項2

檢索記錄行 96-last

select * from table limit 95,-1;

如果只給定

rows

引數,它表示前

rows

條資料;換句話說,limit n 等價於 limit 0,n

例項3

檢索前 5 個記錄行

select * from table limit 5;   

例項4

返回第6-15行資料

select * from table limit 5,10;

或select * from table limit 5;

或select * from table limit 0,5;

例項5

返回0到

last row

-rows的資料

select * from class limit

10, -1

或 select * from class limit

-1 offset 10

假如現在class表中有100條資料,則返回的是0開始的90條資料,即0到(100-

10)三、效能

3.1、基本

1、offset比較小的時候。

select * from yanxue8_visit limit 10,10

多次執行,時間保持在0.0004-0.0005之間

select

*from yanxue8_visit where vid >=(

select

vidfrom yanxue8_visit order by vid limit 10,1

) limit 10

多次執行,時間保持在0.0005-0.0006之間,主要是0.0006

結論

偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。

2、offset大的時候。

select * from yanxue8_visit limit 10000,10

多次執行,時間保持在0.0187左右

select

* from yanxue8_visit where vid >=(

select

vidfrom yanxue8_visit order by vid limit 10000,1

) limit 10

多次執行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。

3.2、效能優化:

方案1.

select * from cyclopedia where id>=(

select max(id) from (

select id from cyclopedia order by id limit 90001

) as tmp

) limit 100;

方案2.

select * from cyclopedia where id>=(

select max(id) from (

select

idfrom cyclopedia order by id limit 90000,1

) as tmp

) limit 100;

同樣是取90000條後100條記錄,第1句快還是第2句快?

第1方案是先取了前90001條記錄,取其中最大乙個id值作為起始標識,然後利用它可以快速定位下100條記錄

第2方案擇是僅僅取90000條記錄後1條,然後取id值作起始標識定位下100條記錄

第1方案執行結果.100 rows in set (0.23) sec

第2方案執行結果.100 rows in set (0.19) sec

很明顯第2方案勝出.

因為這裡id是

主鍵,所以不會去做全表掃瞄,而是直接返回

limit offset+length條記錄,這樣看來limit比起ms-sql的top效能還是要提高不少的.

其實第2個方案完全可以簡化成

select * from cyclopedia where id>=(

select

idfrom cyclopedia limit 90000,1

)limit 100;

直接利用第90000條記錄的id,不用經過max運算,這樣做理論上效率因該高一些,但在實際使用中幾乎看不到效果,因為本身定位id返回的就是1條記錄,max幾乎不用運作就能得到結果,但這樣寫更清淅明朗,省去了畫蛇那一足.

可是,既然mysql有limit可以直接控制取出記錄的位置,為什麼不乾脆用select * from cyclopedia limit 90000,1呢?豈不更簡潔?

這 樣想就錯了,試了就知道,結果是:1 row in set (8.88) sec,怎麼樣,夠嚇人的吧。select * 最好不要隨便用,要本著用什麼,選什麼的原則, select的字段越多,字段資料量越大,速度就越慢. 另外,第2方案中,

id是主鍵,所以不會去做全表掃瞄,而是直接返回

limit offset+length條記錄。

第1種方案同樣可用於ms-sql,而且可能是最好的.因為靠主鍵id來定位起始段總是最快的.

select top 100 * from cyclopedia where id>=(

select top 90001 max(id) from (

select id from cyclopedia order by id

) as tmp

)但不管是實現方式是存貯過程還是直接**中,瓶頸始終在於ms-sql的top總是要返回前n個記錄,這種情況在資料量不大時感受不深,但如果成百上千萬,效率肯定會低下的.相比之下mysql的limit就有優勢的多,執行:

select id from cyclopedia limit 90000

select id from cyclopedia limit 90000,1

的結果分別是:

90000 rows in set (0.36) sec

1 row in set (0.06) sec

而ms-sql只能用select top 90000 id from cyclopedia 執行時間是390ms,執行同樣的操作時間也不及mysql的360ms.

update與limit 關鍵字使用

更新前30行的某個字段內容,沒什麼問題。更新從20行到30行的某個欄位的內容,這樣會報錯。這樣就能實現更新表中根據id公升序排序的第20條到第30條資料的某個欄位的內容 注意 如果這樣的話也是不行的 update tb name set column name test where id in se...

MySQL中any some all關鍵字

mysql中any some all關鍵字 any關鍵字 假設any內部的查詢語句返回的結果個數是三個,那麼,select from where a any select from where a result1 or a result2 or a result3 all關鍵字 all關鍵字與any...

MySQL 中 explain關鍵字

select 查詢的序列號,包含一組數字,表示查詢中執行 select 子句或操作表的順序。三種情況 id 相同 執行順序由上而下 from t1,t2,t3 where t1.id t2.id and t1.id t3.id and t1.other column from t2 where id...