數據庫用法之limit,order by


數據庫limit用法及其優化

1.語法:

  *** limit [offset,] rows

  一般是用於select語句中用以從結果集中拿出特定的一部分數據。

  offset是偏移量,表示我們現在需要的數據是跳過多少行數據之后的,可以忽略;rows表示我們現在要拿多少行數據。

2.栗子:

  ①select * from mytbl limit 10000,100

    上邊SQL語句表示從表mytbl中拿數據,跳過10000行之后,拿100行

  ②select * from mytbl limit 0,100

    表示從表mytbl拿數據,跳過0行之后,拿取100行

  ③select * from mytbl limit 100

    這條SQL跟②的效果是完全一樣的,表示拿前100條數據

 ④為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last

 

 

3.用處:

  我目前用到的地方是數據庫查詢分頁,比如前台要展示數據庫中數據,需要后台實現分頁,傳入數據要有“頁碼page”跟“每頁數據條數nums”。

  對應SQL大概是這樣子:select * from mytbl order by id limit (page-1)*nums,nums

 

4.問題發現:

  在數據量不大或者是大數據量的前幾頁的時候,性能還算不壞,但是大數據量頁碼稍微大一點性能便下降比較嚴重。

 

5.問題分析:

  原因出在Limit的偏移量offset上,比如limit 100000,10雖然最后只返回10條數據,但是偏移量卻高達100000,數據庫的操作其實是拿到100010數據,然后返回最后10條。

  那么解決思路就是,我能不能跳過100000條數據然后讀取10條,而不是讀取100010條數據然后返回10條數據。

 

6.問題解決實現:

  原SQL語句如下:select *from mytbl order by id limit 100000,10

  改進后的SQL語句如下:

  select *from

  mytbl

  where id>= 

  (

    select id from mytbl order by id limit 100000,1

  )

  limit 10

 注:假設id是主鍵索引,那么里層走的是索引,外層也是走的索引,所以性能大大提高

 

order by 用法

    首先,order by是用來寫在where之后,給多個字段來排序的一個DQL查詢語句。

    其次,order by寫法:

    1.  select 字段列表/* from 表名 where 條件 order by 字段名1 asc/desc, 字段名2 asc/desc,.......

    2.  select 字段列表/* from 表名 where 條件 order by 字段序號 asc/desc, 字段序號 asc/desc,....... (此時字段序號要從1開始)

    3.  select 字段列表/* from 表名 where 條件 order by 字段別名1 asc/desc, 字段別名2 asc/desc,.......(這里類似於第一種,無非就是把字段名加了個別名來代替而已。)

    然后,order by的方式:

    1.asc 升序,可以省略,是數據庫默認的排序方式

    2.desc 降序,跟升序相反。

    最后要注意order by的原則,寫在最前面的字段,他的優先級最高,也就是寫法中第一個的字段名1的優先級最高,優先執行他的內容。

 

下面舉個栗子吧!

這里我有幾個表

首先以sclass的降序查找student表中的記錄

寫法為:

select * from student t order by t.sclass desc;

輸出為:

可以看到是以sclass的降序排列的。

再來:以Cno升序、Degree降序查詢Score表的所有記錄。

寫法為:

select * from score s order by s.cno, s.degree desc;

輸出為:

可以看到是優先以cno的升序來排列的,在cno相同的里面再以degree的降序來排列的。

 所以總結一下,order by的用法就是用來做排序,寫在where之后,簡單明了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM