最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL排序優(yōu)化詳細解析

 更新時間:2024年01月11日 09:22:07   作者:智由靜生  
這篇文章主要介紹了MySQL排序優(yōu)化詳細解析,MySQL有兩種方式生成有序的結果:1.通過排序操作;2.按索引順序掃描,如果EXPLAIN出來的type列的值為"index",則說明使用了索引掃描來做排序,需要的朋友可以參考下

MySQL排序優(yōu)化

MySQL有兩種方式生成有序的結果:

1.通過排序操作;

2.按索引順序掃描。如果EXPLAIN出來的type列的值為“index”,則說明使用了索引掃描來做排序。(但如果不為“index”,也不能說明沒有使用索引掃描來做排序。)

一、使用索引生成排序

MySQL可以使用同一個索引既滿足排序(ORDER BY),又用于查詢(WHERE)操作的。因此如果可以,設計索引的時候盡可能考慮同時滿足兩種任務。

索引掃描本身是很快的,但如果索引不能覆蓋查詢所需的全部列,那就不得不每掃描一條索引記錄就回表查詢一次對應的行。這基本都是隨機I/O,因此按索引順序讀取數(shù)據(jù)的速度通常要比順序全表掃描慢。索引覆蓋還有個額外的紅利,就是主鍵。即使索引列中不包含主鍵,但因為二級索引的葉子節(jié)點包含了主鍵的值,所以也能用于對主鍵做覆蓋查詢。

只有當索引的列順序和ORDER BY子句的順序完全一致,并且所有列的排序方向都一樣,MySQL才能使用索引對結果進行排序。如果查詢關聯(lián)多張表,則只有當ORDER BY子句引用的字段全部為第一張表時,才能使用索引做排序。

ORDER BY子句使用索引的限制和where查詢是一樣的,都需要滿足左前綴要求。但有一種情況ORDER BY子句可以不滿足左前綴要求。如果where子句或者join子句中對相關列指定了常量,就可以彌補索引的不足。

例如,有一張租賃表rental在列 (rental_data, inventory_id, customer_id) 上有索引??梢允褂迷撍饕秊橐韵虏樵冏雠判颉XPLAIN中可以看到沒有出現(xiàn)文件排序 (filesort)。

即使ORDER BY子句不滿足索引的最左前綴的要求,也可以用于查詢排序,這是因為索引的第一列被指定為一個常數(shù)。這個查詢在不同版本的MySQL中可能會有不同的表現(xiàn)。因為select列中的staff_id不在排序索引中,而且不是主鍵,沒有實現(xiàn)索引覆蓋,因此按索引順序讀取數(shù)據(jù)的速度通常要比順序全表掃描慢,有些版本的MySQL可能會通過計算成本選擇文件排序 (filesort)。如果只有rental_id列就沒問題了,前面說過主鍵有額外的“紅利”。

下面是一些不能使用索引做排序的例子:

--排序方向與索引列不一致
WHERE rental_date='1999-05-05'
ORDER BY inventory_id DESC,customer_id ASC
--排序字段包含一個不在索引中的字段
WHERE rental_date='1999-05-05'
ORDER BY inventory_id ,staff_id
--排序不滿足最左法則
WHERE rental_date='1999-05-05'
ORDER BY customer_id 
--rental_date使用了范圍查詢,后續(xù)索引列失效
WHERE rental_date>'1999-05-05'
ORDER BY inventory_id,customer_id 
#inventory_id 使用了in多個等值條件查詢,in對于排序認為是一種范圍查詢
WHERE rental_date='1999-05-05' AND inventory_id in (xx,xx)
ORDER BY customer_id 

下面的例子理論上是可以使用索引進行關聯(lián)排序的,但由于優(yōu)化器在優(yōu)化時將film_actor表當作關聯(lián)的第二張表,所以實際無法使用索引排序。

應該盡可能使用更多的索引列。索引只能使用索引的最左前綴,當遇到第一個范圍查詢,就會停止使用后面的索引列。MYSQL無法再使用范圍列后面的其他字段進行排序了,但對于“多個等值條件查詢”則沒有限制,所以可以考慮把范圍查詢語句改寫成IN列表的形式。但是IN在where條件中不算范圍查詢,但對于order by不適用,對于排序認為是一種范圍查詢。在前面舉的不能使用索引做排序的例子的最后一個就說明了這個問題。

如果排序查詢中有LIMIT,那么LIMIT也會在排序之后應用,所以即使需要返回較少的數(shù)據(jù),需要排序的數(shù)據(jù)量仍然非常大(雖然MySQL后續(xù)版本做了優(yōu)化,根據(jù)實際情況拋棄不滿足條件的結果,然后再排序)。所以此時如果能使用索引排序是最好的選擇。

如果服務器能夠按需要順序讀取數(shù)據(jù),那么就不再需要額外的排序操作,并且group by查詢也無需再做排序和將行按組進行聚合計算了。

二、文件排序

當不能使用索引生成排序結果時,需要進行文件排序(filesort),如果數(shù)據(jù)量小則在內存中進行,如果數(shù)據(jù)量大則需要使用磁盤,這兩種情況都叫文件排序(filesort)。如果需要排序的數(shù)據(jù)量小于“排序緩沖區(qū)”,就使用內存“快速排序”。如果內存不夠,就先將數(shù)據(jù)分塊,對每個獨立的塊使用“快速排序”,并將各個塊的排序結果存放正在磁盤上,然后將各個塊進行合并(mergge),最后返回排序結果。

在關聯(lián)查詢的時候如果需要排序,MySQL會分兩種情況處理這樣的文件排序。如果ORDER BY子句的所有列都來自關聯(lián)的第一張表,那么MySQL在關聯(lián)處理第一個表的時候就進行文件排序。如果是這樣,那么在MySQL的EXPLAIN結果中可以看到Extra字段會有“Using filesort”。除此以外的所有情況,MySQL都會先將關聯(lián)的結果存放到一個臨時表中,然后在所有關聯(lián)都結束后,再進行文件排序。這種情況下,在MySQL的EXPLAIN結果中的Extra字段可以看到“Using temporary; Using filesort”。

所以盡量使ORDER BY子句的所有列都來自關聯(lián)的第一張表。

到此這篇關于MySQL排序優(yōu)化詳細解析的文章就介紹到這了,更多相關MySQL排序優(yōu)化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析mysql索引

    淺析mysql索引

    數(shù)據(jù)庫索引是一種數(shù)據(jù)結構,目的是提高表的操作速度,下面通過本文給大家分享mysql索引的相關知識,感興趣的朋友一起看看吧
    2017-10-10
  • MySQL處理重復數(shù)據(jù)完整代碼實例

    MySQL處理重復數(shù)據(jù)完整代碼實例

    在數(shù)據(jù)庫管理中,查找重復值是一項常見需求,下面這篇文章主要介紹了MySQL處理重復數(shù)據(jù)的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • mysql 字符串長度計算實現(xiàn)代碼(gb2312+utf8)

    mysql 字符串長度計算實現(xiàn)代碼(gb2312+utf8)

    PHP對中文字符串的處理一直困擾于剛剛接觸PHP開發(fā)的新手程序員。下面簡要的剖析一下PHP對中文字符串長度的處
    2011-12-12
  • 企業(yè)級使用LAMP源碼安裝教程

    企業(yè)級使用LAMP源碼安裝教程

    這篇文章主要介紹了企業(yè)級使用LAMP源碼的安裝教程,本文附含源碼示例,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝升職加薪
    2021-09-09
  • MySQL?主機被封問題解析(原因、解除方法與預防策略)

    MySQL?主機被封問題解析(原因、解除方法與預防策略)

    本文詳細介紹了MySQL主機被封的原因、解除方法和預防策略,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友跟隨小編一起學習吧
    2026-01-01
  • 深入解析MySQL多表JOIN的9大性能優(yōu)化策略

    深入解析MySQL多表JOIN的9大性能優(yōu)化策略

    在實際開發(fā)中,MySQL多表JOIN場景主要源于兩類場景,歷史遺留系統(tǒng)和數(shù)據(jù)庫遷移,但這類操作潛藏多重風險,下面小編就來和大家聊聊如何進行優(yōu)化吧
    2025-06-06
  • MySQL8.2.0安裝教程分享

    MySQL8.2.0安裝教程分享

    這篇文章詳細介紹了如何在Windows系統(tǒng)上安裝MySQL數(shù)據(jù)庫軟件,包括下載、安裝、配置和設置環(huán)境變量的步驟
    2025-02-02
  • MySQL之InnoDB存儲引擎中的索引用法及說明

    MySQL之InnoDB存儲引擎中的索引用法及說明

    這篇文章主要介紹了MySQL之InnoDB存儲引擎中的索引用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • mysql慢查詢優(yōu)化之從理論和實踐說明limit的優(yōu)點

    mysql慢查詢優(yōu)化之從理論和實踐說明limit的優(yōu)點

    今天小編就為大家分享一篇關于mysql慢查詢優(yōu)化之從理論和實踐說明limit的優(yōu)點,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 深入談談MySQL中的自增主鍵

    深入談談MySQL中的自增主鍵

    這篇文章主要給大家介紹了關于MySQL中自增主鍵的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02

最新評論

尼木县| 万州区| 黔南| 林周县| 东安县| 建宁县| 二手房| 吴堡县| 喀喇沁旗| 西吉县| 余干县| 黔西县| 漯河市| 商丘市| 酉阳| 东城区| 东宁县| 清徐县| 汝城县| 新乡县| 崇阳县| 石狮市| 宜春市| 信丰县| 孝义市| 惠来县| 宜兴市| 丹东市| 梧州市| 图们市| 成武县| 万全县| 南城县| 汉源县| 彰化县| 龙泉市| 义马市| 会东县| 车险| 五常市| 保定市|