欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL limit子句用法及優(yōu)化小結(jié)

 更新時(shí)間:2024年09月03日 09:36:56   作者:V1ncent Chen  
limit在獲取到滿足條件的數(shù)據(jù)量時(shí)即會(huì)立刻終止SQL的執(zhí)行,本文主要介紹了MySQL limit子句用法及優(yōu)化小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下

在MySQL中,如果只想獲取select查詢結(jié)果的一部分,可以使用limit子句來限制返回記錄的數(shù)量,limit在獲取到滿足條件的數(shù)據(jù)量時(shí)即會(huì)立刻終止SQL的執(zhí)行。相比于返回所有數(shù)據(jù)然后丟棄一部分,執(zhí)行效率會(huì)更高。

一、limit子句用法示例

limit子句通常放在select查詢的最后,語法是limit [offset,] rowcount :

  • limit m,n 返回偏移量為m之后的n條數(shù)據(jù),即先獲取m+n條記錄,然后丟棄前面的m條,返回之后的n條記錄
  • limit n 返回開頭的n條數(shù)據(jù),相當(dāng)于limit 0, n

1.1 基本用法

新建一張測試表并填充幾條數(shù)據(jù):

create table test(
id int auto_increment primary key,
name varchar(32),
salary decimal(10,2));

insert into test values(null, 'aaa',1000),(null, 'bbb',2000),(null, 'ccc',3000),(null, 'ddd',4000),(null, 'eee',5000),(null, 'fff',6000),(null, 'ggg',7000),(null, 'hhh',8000),(null, 'iii',9000);

在這里插入圖片描述

limit 0會(huì)立刻返回一個(gè)空結(jié)果集,它通常用來檢測SQL語法是否正確或者快速獲取結(jié)果集的字段屬性。limit n用來返回最先獲取的n條記錄,找到足夠的記錄時(shí)SQL就會(huì)停止執(zhí)行并返回結(jié)果:

select * from test limit 3;

在這里插入圖片描述

采用limit m,n的形式,就是跳過前面的m條記錄,返回之后的n條記錄:

select * from test limit 3,3;

在這里插入圖片描述

如果只是想跳過開頭的m條記錄,只需要給n一個(gè)足夠大的數(shù)字即可,例如跳過開頭100條記錄:limit 100, 9999999999

1.2 limit和order by

如果order by子句和limit子句同時(shí)出現(xiàn),那么MySQL會(huì)先對結(jié)果進(jìn)行排序,對排序后的結(jié)果集應(yīng)用limit子句。例如查詢工資最高的3個(gè)人(按salary列倒序排列后取前3條記錄):

select * from test order by salary desc limit 3;

在這里插入圖片描述

如果排序的列存在重復(fù)數(shù)據(jù),例如本例返回3條數(shù)據(jù),但是3,4,5條記錄的salary列都是相同的(它們都可以排在第三),這時(shí)返回的結(jié)果集是不確定的,查詢時(shí)需注意。

1.2.1 排序瓶頸優(yōu)化

與order by子句配合使用時(shí),雖然limit子句最終獲取的結(jié)果集可能很小,但需要先對所有的數(shù)據(jù)進(jìn)行排序,如果這個(gè)數(shù)據(jù)量很大,那么排序操作就會(huì)成為性能瓶頸。

如果你發(fā)現(xiàn)limit子句加上order by之后語句執(zhí)行很慢,可以嘗試通過在排序列上增加索引來消除這個(gè)排序操作。由于示例表很小,優(yōu)化器傾向于走全表掃描,這里找一張更大的表test1來演示,表中約有2萬多條數(shù)據(jù)。觀察添加索引前后的執(zhí)行計(jì)劃:

explain select * from test1 order by salary desc limit 3;
create index idx_salary on test1(salary);
explain select * from test1 order by salary desc limit 3;

在這里插入圖片描述

可以看到索引反向掃描替代了原來的排序操作,同時(shí)掃描的行數(shù)量從24032降低到了3。

二、limit分頁優(yōu)化

limit子句最常用場景就是數(shù)據(jù)分頁,通過變更偏移量來對數(shù)據(jù)進(jìn)行分頁展示。例如第一頁顯示100條數(shù)據(jù),limit子句就是limit 0,100。第二頁是limit 100,100,第三頁是limit 200,100…. 但是當(dāng)頁數(shù)非常大時(shí),limit m,n 中被丟棄的m條數(shù)據(jù)可能成為性能瓶頸。

由于前m條數(shù)據(jù)(偏移量)是最終需要的丟棄的,它們的內(nèi)容我們并不關(guān)心,因此優(yōu)化的思路就是"避免查詢前m條數(shù)據(jù)的內(nèi)容"。

2.1 延遲關(guān)聯(lián)

為了避免查詢偏移量m條數(shù)據(jù)的內(nèi)容,我們可以先通過索引獲取的n條數(shù)據(jù)的偏移量/主鍵(而不是對全量數(shù)據(jù)進(jìn)行排序),然后通過主鍵直接獲取n條數(shù)據(jù)的內(nèi)容。這種策略叫做"延遲關(guān)聯(lián)"。

例如查詢:

select * from test1 order by salary desc limit 10000,100;

通過延遲關(guān)聯(lián)可以改寫為:

select salary from test1
join ( select id from test1 order by salary desc limit 10000,100) d on d.id=test1.id;

如果salary列上有索引,那么獲取id是不需要回表的,通過索引就可以獲取n條數(shù)據(jù)的主鍵,隨后再與主表關(guān)聯(lián),通過主鍵取出這n條數(shù)據(jù)內(nèi)容。雖然SQL看起來稍微復(fù)雜了,但是它繞過了獲取前m條數(shù)據(jù)內(nèi)容這個(gè)步驟,當(dāng)m值比較大時(shí),性能提升是很明顯的。

2.2 轉(zhuǎn)換為位置查詢

這種策略是根據(jù)排序條件預(yù)先計(jì)算每行記錄的順序編號(hào)并加上索引,例如在表中新增一列position(或者單獨(dú)新增一張順序表也可以),保存的是每一行位置順序。這相當(dāng)于分頁排序已經(jīng)預(yù)先執(zhí)行了,而偏移操作就被轉(zhuǎn)換成了索引范圍掃描。

例如查詢:

select * from test1 order by salary desc limit 10000,100;

通過位置查詢可以改寫為:

select * from test1 where position between 10001 and 10100;

position列是根據(jù)order by salary desc條件預(yù)先維護(hù)好的每一列的順序編號(hào),此后每次分頁查詢都不需要計(jì)算偏移量,而是被轉(zhuǎn)換成了索引范圍掃描(Index Range Scan)。

2.3 記錄偏移位置

記錄偏移位置的方法,就是當(dāng)排序列存在順序的情況下,每次查詢后將其最后的值記錄下來,然后作為下一次SQL查詢的過濾條件。

假設(shè)首次查詢?nèi)缦拢╥d列單調(diào)遞增):

select * from test1 order by id limit 9900,100;

假設(shè)上面查詢返回結(jié)果集的最大id為123456,程序可以將這個(gè)值單獨(dú)記錄下來,那么SQL:

select * from test1 order by id limit 10000,100;

就可以改寫為:

select * from test1 where id>123456 order by id limit 100;

通過條件where id>123456就可以過濾掉前m條數(shù)據(jù),但這種方法的缺陷就是它只能一頁一頁的順序往后翻,不能跳轉(zhuǎn)翻頁,對比上面2種方法不夠靈活。

到此這篇關(guān)于MySQL limit子句用法及優(yōu)化小結(jié)的文章就介紹到這了,更多相關(guān)MySQL limit子句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL5.7.21解壓版安裝詳細(xì)教程圖解

    MySQL5.7.21解壓版安裝詳細(xì)教程圖解

    對于小編來說安裝系統(tǒng)軟件是常干的事情,今天小編抽空給大家整理了MySQL5.7.21解壓版安裝詳細(xì)教程圖解,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-09-09
  • 通過兩種方式增加從庫——不停止mysql服務(wù)

    通過兩種方式增加從庫——不停止mysql服務(wù)

    現(xiàn)在生產(chǎn)環(huán)境MySQL數(shù)據(jù)庫是一主一從,由于業(yè)務(wù)量訪問不斷增大,故再增加一臺(tái)從庫。前提是不能影響線上業(yè)務(wù)使用,也就是說不能重啟MySQL服務(wù),為了避免出現(xiàn)其他情況,選擇在網(wǎng)站訪問量低峰期時(shí)間段操作
    2015-11-11
  • SQL查詢至少連續(xù)七天下單的用戶

    SQL查詢至少連續(xù)七天下單的用戶

    這篇文章介紹了SQL查詢至少連續(xù)七天下單用戶的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • Mysql中實(shí)現(xiàn)修改主鍵自增值

    Mysql中實(shí)現(xiàn)修改主鍵自增值

    這篇文章主要介紹了Mysql中實(shí)現(xiàn)修改主鍵自增值方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • mysql之過濾分組的具體實(shí)現(xiàn)

    mysql之過濾分組的具體實(shí)現(xiàn)

    在MySQL中過濾分組數(shù)據(jù)通常使用GROUP BY結(jié)合HAVING子句和WHERE子句,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • 小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)

    小白安裝登錄mysql-8.0.19-winx64的教程圖解(新手必看)

    這篇文章主要介紹了安裝登錄mysql-8.0.19-winx64的教程圖解,非常適合新手學(xué)習(xí)參考,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • mysql 基礎(chǔ)教程之庫與表的詳解

    mysql 基礎(chǔ)教程之庫與表的詳解

    這篇文章主要介紹了mysql 基礎(chǔ)教程之庫與表的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • MySQL自動(dòng)停機(jī)的問題處理實(shí)戰(zhàn)記錄

    MySQL自動(dòng)停機(jī)的問題處理實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了關(guān)于MySQL自動(dòng)停機(jī)的問題處理,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • MySQL無法輸入中文字符問題的解決辦法

    MySQL無法輸入中文字符問題的解決辦法

    MySQL無法輸入中文的問題大多是由于字符集不匹配所導(dǎo)致的,下面這篇文章主要給大家介紹了關(guān)于MySQL無法輸入中文字符問題的解決辦法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Mysql binlog的查看方法

    Mysql binlog的查看方法

    MySQL的二進(jìn)制日志可以說是MySQL最重要的日志了,本文主要介紹了Mysql binlog的查看方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04

最新評(píng)論