--------LIMIT基本理解--------mysql
MySQL的Limit子句
Limit子句能夠被用於強制 SELECT 語句返回指定的記錄數。Limit接受一個或兩個數字參數。參數必須是一個整數常量。若是給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。
sql
舉例說明:數據庫
//初始記錄行的偏移量是 0(而不是 1):ide
mysql> select * from table limit 5,10; 性能
詳解:檢索記錄行6-15,從第五行下面第六行開始,由於計算機開始數字是0,不是1,第六行開始往下顯示10行,到第15行。
//爲了檢索從某一個偏移量到記錄集的結束全部的記錄行,能夠指定第二個參數爲 -1:
spa
mysql> select * from table limit 95,-1; 排序
詳解:檢索記錄行 96-last索引
//若是隻給定一個參數,它表示返回最大的記錄行數目。換句話說,LIMIT n 等價於 LIMIT 0,n:
產品
mysql> select * from table limit 5; //檢索前 5 個記錄行it
實例說明:如何查找一個表排序後的倒數第3條數據。
select * from table_name order by column_name desc limit 2,1;
//其實能夠理解爲,找逆序排序後的第3條數據。
其實有2中形式,一種是limit後面帶一個值,另外一種是帶2個值。
下面以products產品表爲例,進行說明:
1.select prod_name from products limit 5; //將返回從第1行開始的前5條數據。
2.select prod_name from products limit 5,5; //表示返回從行5開始的5行數據。第一個數爲開始位置,第二個數爲要檢索的行數。
因此,帶一個值的limit老是從第一行開始,給出的數爲返回的行數。帶兩個值的limit能夠指定從行號爲第一個的位置開始的行數。
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來查詢語句,而且偏移量特別大的狀況
作如下實驗:
語句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
附錄相關語句:
OFFSET語句
爲了與 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個數據
這兩個都是能完成須要,可是他們之間是有區別的:
①是從數據庫中第三條開始查詢,取一條數據,即第三條數據讀取,一二條跳過
②是從數據庫中的第二條數據開始查詢兩條數據,即第二條和第三條。
Top子句
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