<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          切記!MySQL中ORDER BY與LIMIT 不要一起用,有大坑

          共 1705字,需瀏覽 4分鐘

           ·

          2021-02-10 22:25

          閱讀本文大概需要 2.8 分鐘。

          來自:占小狼

          1.? 現(xiàn)象與問題

          ORDER BY排序后,用LIMIT取前幾條,發(fā)現(xiàn)返回的結(jié)果集的順序與預(yù)期的不一樣。
          下面是我遇到的問題:
          可以看到,帶LIMIT與不帶LIMIT的結(jié)果與我預(yù)期的不一樣,而且“很不可思議”,真是百思不得其解。
          后來百度了一下,如果order by的列有相同的值時,mysql會隨機選取這些行,為了保證每次都返回的順序一致可以額外增加一個排序字段(比如:id),用兩個字段來盡可能減少重復(fù)的概率。
          于是,改成 order by status, id;
          問題雖然是解決了,但還是看看官方文檔上怎么說的吧!

          2.? LIMIT查詢優(yōu)化

          摘自“LIMIT查詢優(yōu)化”
          如果你只需要結(jié)果集中的指定數(shù)量的行,那么請在查詢中使用LIMIT子句,而不是抓取整個結(jié)果集并丟棄剩下那些你不要的數(shù)據(jù)。
          MySQL有時會優(yōu)化一個包含LIMIT子句并且沒有HAVING子句的查詢:
          • MySQL通常更愿意執(zhí)行全表掃描,但是如果你用LIMIT只查詢幾行記錄的話,MySQL在某些情況下可能會使用索引。
          • 如果你將LIMIT?row_count子句與ORDER BY子句組合在一起使用的話,MySQL會在找到排序結(jié)果的第一個row_count行后立即停止排序,而不是對整個結(jié)果進行排序。如果使用索引來完成排序,這將非常快。如果必須執(zhí)行文件排序,則在找到第一個row_count行之前,選擇所有與查詢匹配但不包括LIMIT子句的行,并對其中大部分或所有行進行排序。一旦找到第一個row_count之后,MySQL不會對結(jié)果集的任何剩余部分進行排序。這種行為的一種表現(xiàn)形式是,一個ORDER BY查詢帶或者不帶LIMIT可能返回行的順序是不一樣的。
          • 如果LIMIT?row_count與DISTINCT一起使用,一旦找到row_count惟一的行,MySQL就會停止。
          • LIMIT 0 可以快速返回一個空的結(jié)果集,這是用來檢測一個查詢是否有效的一種很有用的方法。
          • 如果服務(wù)器使用臨時表來解析查詢,它將使用LIMIT?row_count子句來計算需要多少空間。
          • 如果ORDER BY不走索引,而且后面還帶了LIMIT的話,那么優(yōu)化器可能可以避免用一個合并文件,并使用內(nèi)存中的filesort操作對內(nèi)存中的行進行排序。
          如果ORDER BY列有多行具有相同的值,服務(wù)器可以自由地以任何順序返回這些行,并且根據(jù)總體執(zhí)行計劃可能以不同的方式返回。換句話說,這些行的排序順序?qū)τ跓o序列是不確定的。
          影響執(zhí)行計劃的一個因素是LIMIT,因此對于一個ORDER BY查詢而言,帶與不帶LIMIT返回的行的順序可能是不一樣的。
          看下面的例子:
          包含LIMIT可能會影響每一個category行的順序。例如:
          如果你需要確保無論帶不帶LIMIT都要以相同的順序返回,那么你可以在ORDER BY中包含附加列,以使順序具有確定性。例如:

          3.? 小結(jié)

          1、如果你只需要結(jié)果集中的某幾行,那么建議使用limit。這樣這樣的話可以避免抓取全部結(jié)果集,然后再丟棄那些你不要的行。
          2、對于order by查詢,帶或者不帶limit可能返回行的順序是不一樣的。
          3、如果limit?row_count?與?order by?一起使用,那么在找到第一個row_count就停止排序,直接返回。
          4、如果order by列有相同的值,那么MySQL可以自由地以任何順序返回這些行。換言之,只要order by列的值不重復(fù),就可以保證返回的順序。
          5、可以在order by子句中包含附加列,以使順序具有確定性。

          推薦閱讀:

          完全整理 | 365篇高質(zhì)技術(shù)文章目錄整理

          算法之美 : 棧和隊列

          主宰這個世界的10大算法

          徹底理解cookie、session、token

          淺談什么是遞歸算法

          專注服務(wù)器后臺技術(shù)棧知識總結(jié)分享

          歡迎關(guān)注交流共同進步

          瀏覽 45
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本五十路熟女视频 | 日老逼 | 日韩一级片免费视频 | 北条麻妃办公室性爱在线观看 | 亚洲日韩黄色片 |