互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
來(lái)自:占小狼
1.? 現(xiàn)象與問(wèn)題
ORDER BY排序后,用LIMIT取前幾條,發(fā)現(xiàn)返回的結(jié)果集的順序與預(yù)期的不一樣。可以看到,帶LIMIT與不帶LIMIT的結(jié)果與我預(yù)期的不一樣,而且“很不可思議”,真是百思不得其解。后來(lái)百度了一下,如果order by的列有相同的值時(shí),mysql會(huì)隨機(jī)選取這些行,為了保證每次都返回的順序一致可以額外增加一個(gè)排序字段(比如:id),用兩個(gè)字段來(lái)盡可能減少重復(fù)的概率。于是,改成 order by status, id;問(wèn)題雖然是解決了,但還是看看官方文檔上怎么說(shuō)的吧!2.? LIMIT查詢優(yōu)化
如果你只需要結(jié)果集中的指定數(shù)量的行,那么請(qǐng)?jiān)诓樵冎惺褂肔IMIT子句,而不是抓取整個(gè)結(jié)果集并丟棄剩下那些你不要的數(shù)據(jù)。MySQL有時(shí)會(huì)優(yōu)化一個(gè)包含LIMIT子句并且沒(méi)有HAVING子句的查詢:- MySQL通常更愿意執(zhí)行全表掃描,但是如果你用LIMIT只查詢幾行記錄的話,MySQL在某些情況下可能會(huì)使用索引。
- 如果你將LIMIT?row_count子句與ORDER BY子句組合在一起使用的話,MySQL會(huì)在找到排序結(jié)果的第一個(gè)row_count行后立即停止排序,而不是對(duì)整個(gè)結(jié)果進(jìn)行排序。如果使用索引來(lái)完成排序,這將非??臁H绻仨殘?zhí)行文件排序,則在找到第一個(gè)row_count行之前,選擇所有與查詢匹配但不包括LIMIT子句的行,并對(duì)其中大部分或所有行進(jìn)行排序。一旦找到第一個(gè)row_count之后,MySQL不會(huì)對(duì)結(jié)果集的任何剩余部分進(jìn)行排序。這種行為的一種表現(xiàn)形式是,一個(gè)ORDER BY查詢帶或者不帶LIMIT可能返回行的順序是不一樣的。
- 如果LIMIT?row_count與DISTINCT一起使用,一旦找到row_count惟一的行,MySQL就會(huì)停止。
- LIMIT 0 可以快速返回一個(gè)空的結(jié)果集,這是用來(lái)檢測(cè)一個(gè)查詢是否有效的一種很有用的方法。
- 如果服務(wù)器使用臨時(shí)表來(lái)解析查詢,它將使用LIMIT?row_count子句來(lái)計(jì)算需要多少空間。
- 如果ORDER BY不走索引,而且后面還帶了LIMIT的話,那么優(yōu)化器可能可以避免用一個(gè)合并文件,并使用內(nèi)存中的filesort操作對(duì)內(nèi)存中的行進(jìn)行排序。
如果ORDER BY列有多行具有相同的值,服務(wù)器可以自由地以任何順序返回這些行,并且根據(jù)總體執(zhí)行計(jì)劃可能以不同的方式返回。換句話說(shuō),這些行的排序順序?qū)τ跓o(wú)序列是不確定的。影響執(zhí)行計(jì)劃的一個(gè)因素是LIMIT,因此對(duì)于一個(gè)ORDER BY查詢而言,帶與不帶LIMIT返回的行的順序可能是不一樣的。包含LIMIT可能會(huì)影響每一個(gè)category行的順序。例如:如果你需要確保無(wú)論帶不帶LIMIT都要以相同的順序返回,那么你可以在ORDER BY中包含附加列,以使順序具有確定性。例如:3.? 小結(jié)
1、如果你只需要結(jié)果集中的某幾行,那么建議使用limit。這樣這樣的話可以避免抓取全部結(jié)果集,然后再丟棄那些你不要的行。2、對(duì)于order by查詢,帶或者不帶limit可能返回行的順序是不一樣的。3、如果limit?row_count?與?order by?一起使用,那么在找到第一個(gè)row_count就停止排序,直接返回。4、如果order by列有相同的值,那么MySQL可以自由地以任何順序返回這些行。換言之,只要order by列的值不重復(fù),就可以保證返回的順序。5、可以在order by子句中包含附加列,以使順序具有確定性。推薦閱讀:
10 分鐘使用 Spring Boot + Vue + Antd + US3 搭建自己的圖床
從volatile說(shuō)到i++的線程安全問(wèn)題
5T技術(shù)資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機(jī),樹(shù)莓派,等等。在公眾號(hào)內(nèi)回復(fù)「2048」,即可免費(fèi)獲?。。?/span>微信掃描二維碼,關(guān)注我的公眾號(hào)
朕已閱?