轉(zhuǎn)載, MySQL limit使用詳解

Top子句

  TOP 子句用于規(guī)定要返回的記錄的數(shù)目。對于擁有數(shù)千條記錄的大型表來說,TOP 子句是非常有用的。

  在SQL Server數(shù)據(jù)庫中語法為:

SELECT?TOP number|percent?column_name(s) FROM table_name

  但是并非所有的數(shù)據(jù)庫系統(tǒng)都支持 TOP 子句,比如Oracle和MySQL,它們有等價的語法。

  在Oracle數(shù)據(jù)庫中語法為:

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

  在MySQL數(shù)據(jù)庫中語法為:

SELECT column_name(s) FROM table_name?LIMIT number


MySQL的Limit子句

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

//初始記錄行的偏移量是 0(而不是 1):

mysql> SELECT * FROM table LIMIT 5,10;?//檢索記錄行6-15

//為了檢索從某一個偏移量到記錄集的結(jié)束所有的記錄行,可以指定第二個參數(shù)為 -1:

mysql> SELECT * FROM table LIMIT 95,-1;?// 檢索記錄行 96-last

//如果只給定一個參數(shù),它表示返回最大的記錄行數(shù)目。換句話說,LIMIT n 等價于 LIMIT 0,n:

mysql> SELECT * FROM table LIMIT 5;?//檢索前 5 個記錄行


Limit的效率高?

  常說的Limit的執(zhí)行效率高,是對于一種特定條件下來說的:即數(shù)據(jù)庫的數(shù)量很大,但是只需要查詢一部分數(shù)據(jù)的情況。

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

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

  SELECT * FROM t_user WHERE email=?;

  上面的語句實現(xiàn)了查詢email對應(yīng)的一條用戶信息,但是由于email這一列沒有加索引,會導(dǎo)致全表掃描,效率會很低。

  SELECT * FROM t_user WHERE email=? LIMIT 1;

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


Limit的效率低?

  在一種情況下,使用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


  比較以上的數(shù)據(jù)時,我們可以發(fā)現(xiàn)采用where...limit....性能基本穩(wěn)定,受偏移量和行數(shù)的影響不大,而單純采用limit的話,受偏移量的影響很大,當(dāng)偏移量大到一定后性能開始大幅下降。不過在數(shù)據(jù)量不大的情況下,兩者的區(qū)別不大。

  所以應(yīng)當(dāng)先使用where等查詢語句,配合limit使用,效率才高

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

附錄:OFFSET

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

  經(jīng)常用到在數(shù)據(jù)庫中查詢中間幾條數(shù)據(jù)的需求

  比如下面的sql語句:

   ?、?selete * from testtable limit 2,1;

   ?、?selete * from testtable limit 2 offset 1;

  注意:

    1.數(shù)據(jù)庫數(shù)據(jù)計算是從0開始的

    2.offset X是跳過X個數(shù)據(jù),limit Y是選取Y個數(shù)據(jù)

    3.limit? X,Y? 中X表示跳過X個數(shù)據(jù),讀取Y個數(shù)據(jù)

  這兩個都是能完成需要,但是他們之間是有區(qū)別的:

   ?、偈菑臄?shù)據(jù)庫中第三條開始查詢,取一條數(shù)據(jù),即第三條數(shù)據(jù)讀取,一二條跳過

   ?、谑菑臄?shù)據(jù)庫中的第二條數(shù)據(jù)開始查詢兩條數(shù)據(jù),即第二條和第三條。


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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • (1) 蘇小小剛走到宿舍大門口,突然折返往校門口的方向走去。她此刻就想在韓晨的公寓待著,雖然他不在。 韓晨早就給了...
  • “世事洞明皆學(xué)問,人情練達即文章。 紙上得來終覺淺,絕知此事要躬行?!?這幾天我們公司有對夫妻吵架,我們都在倉庫里...
    A把時間當(dāng)做朋友閱讀 230評論 0 1
  • 陌生的城市啊,熟悉的角落里,有時候盼著相遇,有時候卻終究要離去。 又一年的高考結(jié)束了,時間過的可...
    a螺旋的微笑閱讀 321評論 0 0
  • 文//燭光 春風(fēng)夏雨不寒天,草長鶯飛緊相連。 最是悠閑來日長,慣看燕語柳如煙。 五月四日
    5937閱讀 186評論 0 3
  • 農(nóng)村的夜里漆黑一片 婆婆拿來一些雞蛋打了在碗里 也在幫忙 隱約看到院子里有人 就像小時候家里院子里進了賊的影子 休...
    何英_be10閱讀 144評論 0 0

友情鏈接更多精彩內(nèi)容