MySQL的Limit詳解

2021-03-02 IT哈哈

問題:資料庫查詢語句,如何只返回一部分數據?

TOP 子句用於規定要返回的記錄的數目。對於擁有數千條記錄的大型表來說,TOP 子句是非常有用的。

在SQL Server資料庫中語法為:

SELECT TOP number|percent column_name(s) FROM table_name

但是並非所有的資料庫系統都支持 TOP 子句,比如Oracle和MySQL,它們有等價的語法。

在Oracle資料庫中語法為:

SELECT column_name(s) FROM table_name WHERE ROWNUM <= number

在MySQL資料庫中語法為:

SELECT column_name(s) FROM table_name LIMIT number

Limit子句可以被用於強制 SELECT 語句返回指定的記錄數。Limit接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。


mysql> SELECT * FROM table LIMIT 5,10; 

mysql> SELECT * FROM table LIMIT 95,-1; 

mysql> SELECT * FROM table LIMIT 5;     

常說的Limit的執行效率高,是對於一種特定條件下來說的:即資料庫的數量很大,但是只需要查詢一部分數據的情況。

高效率的原理是:避免全表掃描,提高查詢效率。

比如:每個用戶的email是唯一的,如果用戶使用email作為用戶名登陸的話,就需要查詢出email對應的一條記錄。

SELECT * FROM t_user WHERE email=?;

上面的語句實現了查詢email對應的一條用戶信息,但是由於email這一列沒有加索引,會導致全表掃描,效率會很低。

SELECT * FROM t_user WHERE email=? LIMIT 1;

加上LIMIT 1,只要找到了對應的一條記錄,就不會繼續向下掃描了,效率會大大提高。

在一種情況下,使用limit效率低,那就是:只使用limit來查詢語句,並且偏移量特別大的情況

做以下實驗:
語句1:

select * from table limit 150000,1000;

語句2:

select * from table while id>=150000 limit 1000;


語句1為0.2077秒;語句2為0.0063秒
兩條語句的時間比是:語句1/語句2=32.968
 
比較以上的數據時,我們可以發現採用where...limit....性能基本穩定,受偏移量和行數的影響不大,而單純採用limit的話,受偏移量的影響很大,當偏移量大到一定後性能開始大幅下降。不過在數據量不大的情況下,兩者的區別不大。

所以應當先使用where等查詢語句,配合limit使用,效率才高

ps:在sql語句中,limt關鍵字是最後才用到的。以下條件的出現順序一般是:where->group by->having-order by->limit

為了與 PostgreSQL 兼容,MySQL 也支持句法: LIMIT # OFFSET #。

經常用到在資料庫中查詢中間幾條數據的需求,比如下面的sql語句:

① selete * from testtable limit 2,1;
② selete * from testtable limit 2 offset 1;

注意:
   1.資料庫數據計算是從0開始的
    2.offset X是跳過X個數據,limit Y是選取Y個數據
    3.limit  X,Y  中X表示跳過X個數據,讀取Y個數據

這兩個都是能完成需要,但是他們之間是有區別的:
    ①是從資料庫中第三條開始查詢,取一條數據,即第三條數據讀取,一二條跳過
    ②是從資料庫中的第二條數據開始查詢兩條數據,即第二條和第三條。

https://www.cnblogs.com/acm-bingzi/p/msqlLimit.html

相關焦點

  • PHP mysql中limit用法詳解(代碼示例)
    php $link = mysqli_connect("localhost", "root", "", "Mydb");    if ($link == = false) {     die("ERROR: Could not connect. ".mysqli_connect_error()); }
  • 玩轉Mysql系列 - 第7篇:詳解排序和分頁(order by & limit),及存在的坑
    本章內容 詳解排序查詢詳解limitlimit存在的坑分頁查詢中的坑排序查詢(order by) 電商中:我們想查看今天所有成交的訂單,按照交易額從高到低排序,此時我們可以使用資料庫中的排序功能來完成。
  • Mysql Limit 字句優化
    PRIMARY KEY(id),index(col1))ENGINE=InnoDBmysql root@localhost:test_db> select * from tbl6 limit 8000,10;# resultSet...
  • mysql limit高級用法示例
    mysql limit效率: select `id`,`title
  • Mysql的limit用法與幾種分頁形式
    1、Mysql的limit用法
  • MySQL 用 limit 為什麼會影響性能?
    灌入大量數據,共500萬:mysql> select count(*) from test;++| count(*) |++| 5242882 |++1 row in set (4.25 sec)我們知道,當limit offset rows中的offset很大時,會出現效率問題:
  • MySQL 用 limit 會影響性能?
    灌入大量數據,共500萬:mysql> select count(*) from test;++| count(*) |++| 5242882 |++1 row in set (4.25 sec)我們知道,當limit offset rows中的offset很大時,會出現效率問題:
  • MySQL大數據下Limit使用
    優化的話你可以想方法減小offset,如以下:  Select * From ibmng Where id >=(    Select id From ibmng Order By id limit 1000000,1  ) limit 10  大家一定會看到問題, limit 1000000,1 同樣offset不是一樣大嗎,肯定不能優化
  • MySQL的Limit 性能差?真的不能再用了?
    灌入大量數據,共500萬:mysql> select count(*) from test;++| count(*) |++| 5242882 |++1 row in set (4.25 sec)我們知道,當limit offset rows中的offset很大時,會出現效率問題:
  • MySQL慢查詢參數min_examined_row_limit
    對於慢查詢日誌,比較重要的幾個參數如下:slow_query_log=1long_query_time=0.5slow_query_log_file=/mysql/data/mysql_slow.logslow_query_log表示是否開啟慢查詢long_query_time表示慢查詢閾值,SQL執行時間超過該值,則會記錄到慢查詢日誌中。
  • MySQL的limit用法和分頁查詢的性能分析及優化
    不用擔心,mysql已經為我們提供了這樣一個功能。mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15 //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1:mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.
  • 信我一次邪,mysql的limit不要這樣用
    如果是mysql資料庫的話,做分頁查詢大家就離不開使用limit了。比如我們要對表「coder」中的數據做分頁查詢,每頁20條數據。那程序生成的查詢第一頁的數據的sql會是下面這樣。而查詢第二頁時,生成的查詢sql語句就是下面這樣。
  • 一文詳解MySQL權限
    * from columns_priv where user=『root』 and host=『localhost』; ##無記錄mysql> select * from procs_priv where user=『root』 and host=『localhost』;MySQL權限詳解(1)All/All
  • 【219期】面試官:談談MySQL的limit用法、邏輯分頁和物理分頁
    物理分頁為什麼用limit在講解limit之間,我們先說說分頁的事情。分頁有邏輯分頁和物理分頁,就像刪除有邏輯刪除和物理刪除。邏輯刪除就是改變資料庫的狀態,物理刪除就是直接刪除資料庫的記錄,而邏輯刪除只是改變該資料庫的狀態。
  • 小心避坑:MySQL分頁時使用 limit+order by 會出現數據重複問題
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫1、問題描述在MySQL中我們通常會採用limit來進行翻頁查詢,比如limit(0,10)表示列出第一頁的10條數據,limit(10,10)表示列出第二頁。
  • Mysql 手工注入【常規union查詢篇】
    mysql> select concat(username,' | ',passwd,' | ',email) from admin limit 0,1;mysql> select concat(username,' | ',passwd,null,' | ',email) from admin limit 0,1;同樣是連接多個字符串,但可以在開頭指定分隔符
  • MySQL分頁優化解析
    似乎討論分頁的人很少,難道大家都沉迷於limit m,n?在有索引的情況下,limit m,n速度足夠,可是在複雜條件搜索時,where somthing order by somefield+somefieldmysql會搜遍資料庫,找出「所有」符合條件的記錄,然後取出m,n條記錄。
  • MySQL資料庫實例管理器命令行選項詳解
    首頁 > 語言 > 關鍵詞 > 資料庫最新資訊 > 正文 MySQL資料庫實例管理器命令行選項詳解
  • SQL 查詢優化之 WHERE 和 LIMIT 使用索引的奧秘
    看起來匪夷所思,其實搞清楚mysql查詢的原理之後,其實很簡單。我們來看這2條sql查詢,都用到了where order by limit。當有limit存在時,查詢的順序就有可能發生變化,這時並不是從資料庫中先通過where過濾再排序再limit。因為如果這樣的話,從500萬數據中通過where過濾就不會是5s了。
  • 「MySQL」limit 用法
    limit 適用於MySQLlimit使用場景:可以強制select語句返回指定的記錄,limit可以有1-2個參數,必須是整數常量。