1. 程式人生 > >LIMIT&限制查詢結果的數量&ORDER BY&排序&分頁

LIMIT&限制查詢結果的數量&ORDER BY&排序&分頁

limit:限制查詢結果的數量。

舉例:
1.查詢資料表tb_login,按照id編號進行升序排序,顯示前3條記錄:
SELECT * FROM tb_login ORDER BY id ASC LIMIT 3;
(ORDER BY用來對查詢結果進行排序,分為ASC與DESC,預設ASC(對於NULL值,ASC時出現在最前面,DESC時出現在最後面。))

2.使用關鍵字LIMIT還可以從查詢結果的中間部分取值。首先要定義兩個引數,引數1是要開始讀取的第一條記錄的編號(在查詢結果中,第一個結果的記錄編號是0,而不是1),引數2是要查詢的記錄個數(如果查詢從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為-1)。
舉例:查詢tb_login表中,按照id編號進行升序排列,從編號1開始,查詢兩條記錄:
SELECT * FROM tb_login ORDER BY id ASC LIMIT 1, 2;
--------------------------------------------------------------
以上語句,在表資料很少的時候,看不出什麼效能問題,倘若達到千萬級,進行分頁,如:
SELECT * FROM A ORDER BY id LIMIT 10000000, 10;
雖然都是隻查詢10條記錄,但是這個效能就讓人受不了了。此時可以有如下優化方式:
SELECT * FROM A WHERE id >= (SELECT id FROM A LIMIT 10000000, 1) LIMIT 10;
確實這樣快了很多,不過前提是,id欄位建立了索引。也許這個還不是最優的,還可以這樣寫:
SELECT * FROM A WHERE id BETWEEN 10000000 AND 10000010;(個人理解:查詢的範圍更小了)
(在BETWEEN之前還有NOT作為可選項)
-----------------------------------------------------------------------
LIMIT效率高:
常說的LIMIT的執行效率高,是對於一種特定條件下來說的:即資料庫的數量很大,但是隻需要查詢一部分資料的情況。
高效率的原理:避免全表掃描,提高查詢效率。
舉例:每個使用者的email是唯一的,如果使用者使用email作為使用者名稱登入的話,就需要查詢出email對應的一條記錄:
SELECT * FROM t_user WHERE email = ?;
上面的語句實現了查詢email對應的一條使用者資訊,但是由於email這一列沒有加索引,會導致全表掃描,效率會很低;
SELECT * FROM t_user WHERE email = ? LIMIT 1;
加上LIMIT 1,只要找到了對應的一條記錄,就不會繼續向下掃描了,效率會大大提高。
LIMIT效率低:
在一種情況下,使用LIMIT效率低,那就是:只使用LIMIT來查詢語句,並且偏移量特別大。
具體的,採用WHERE...LIMIT...時效能基本穩定,受偏移量和行數影響不大;而單純採用LIMIT的話,受偏移量影響很大,當偏移量大到一定程度後效能開始大幅下降。不過在資料量不大的情況下,兩者的區別不大。
所以應該先使用WHERE等查詢語句,然後配合LIMIT使用,效率才高。
注:SQL語句中,LIMIT關鍵字是最後才用到的。基本順序為,FROM...WHERE...ORDER BY...LIMIT...