日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MySql ORDER BY 索引优化

發布時間:2024/9/30 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySql ORDER BY 索引优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上一篇:MySql 索引優化

MySql 支持兩種方式的排序,FileSort 和 Index ,Index 效率高,它指的是 MySql 掃描索引本身完成排序。FileSort 會對數據使用一個外部的索引排序,而不是按照表內的索引順序進行讀取。因此效率很低。在我們使用 ORDER BY 子句進行排序查找時,要使用 Index 的方式排序,避免 FileSort 方式排序。

我在 t_emp 表上建立了一個復合索引,其中包含 age 字段與 sex 字段。

+-------+------------+----------------+--------------+-------------+-----------+-------------+- | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | +-------+------------+----------------+--------------+-------------+-----------+-------------+- | t_emp | 0 | PRIMARY | 1 | id | A | 3 | | t_emp | 1 | idx_emp_ageSex | 1 | age | A | 3 | | t_emp | 1 | idx_emp_ageSex | 2 | sex | A | 3 | +-------+------------+----------------+--------------+-------------+-----------+-------------+-

接下來我們就使用 EXPLAIN 關鍵字查看 Extra 中的值,判斷 SQL 語句需不需要優化 (為了排版的問題,這里省略了 EXPLAIN 中的一些屬性,下同)。當我們使用 age 排序時,可以知道使用了我們建立的索引,并且 Extra 中的值為:Using index condition 。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY age; +-------+----------------+----------------+---------+------+------+----------+-----------------------+ | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +-------+----------------+----------------+---------+------+------+----------+-----------------------+ | range | idx_emp_ageSex | idx_emp_ageSex | 5 | NULL | 2 | 100.00 | Using index condition | +-------+----------------+----------------+---------+------+------+----------+-----------------------+

下面這段 SQL 我們使用 age 與 sex 排序,同樣使用了索引,Extra 中的值為:Using index condition 。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY age,sex; +-------+----------------+----------------+---------+------+------+----------+-----------------------+ | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +-------+----------------+----------------+---------+------+------+----------+-----------------------+ | range | idx_emp_ageSex | idx_emp_ageSex | 5 | NULL | 2 | 100.00 | Using index condition | +-------+----------------+----------------+---------+------+------+----------+-----------------------+

當我們按照 sex age 的順序進行排序時,雖然使用了索引,但是 Extra 中卻出現了 Using Filesort。這樣的排序查找方式是不好的。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY sex,age; +---------+------+------+----------+---------------------------------------+ | key_len | ref | rows | filtered | Extra | +---------+------+------+----------+---------------------------------------+ | 5 | NULL | 2 | 100.00 | Using index condition; Using filesort | +---------+------+------+----------+---------------------------------------+

從上面三條 SQL 的執行結果可以看出要想不使用 Using Filesort 排序,ORDER BY 語句要符合最佳左前綴原則。

</font size = 3> 我們再來看,當我們的 ORDER BY 語句不符合最佳左前綴法則時查詢的結果是什么樣的?下面的演示分別對 age 做固定查找與做范圍查找,我們可以看出當使用范圍查找時使用了 Filesort ,盡管在做固定查找時 ORDER BY 沒有符合最佳左前綴原則,但是也是只使用了 Using index。

mysql> EXPLAIN SELECT* FROM t_emp WHERE age = 20 ORDER BY sex; +------+----------------+----------------+---------+-------+------+----------+-----------------------+ | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +------+----------------+----------------+---------+-------+------+----------+-----------------------+ | ref | idx_emp_ageSex | idx_emp_ageSex | 5 | const | 1 | 100.00 | Using index condition | +------+----------------+----------------+---------+-------+------+----------+-----------------------+ mysql> EXPLAIN SELECT* FROM t_emp WHERE age>20 ORDER BY sex; +----------------+---------+------+------+----------+---------------------------------------+ | key | key_len | ref | rows | filtered | Extra | +----------------+---------+------+------+----------+---------------------------------------+ | idx_emp_ageSex | 5 | NULL | 2 | 100.00 | Using index condition; Using filesort | +----------------+---------+------+------+----------+---------------------------------------+

因此,使用 WHERE 子句與 ORDER BY 子句條件列組合滿足索引最佳左前綴法則也是可以提高查詢效率的。但是 WHERE 子句查找條件不能使范圍篩選。

下面我們就來看一看 Filesort 的兩種排序算法:
雙路排序:在 MySql 4.1 之前是使用雙路排序,雙路排序是指兩次掃描磁盤,最終得到數據。讀取行指針和 orderby 列,對它們進行排序,然后掃描已經排好序的列表,按照列表中的值重新獲取列表中讀取對應的數據輸出。可見雙路排序當操作一批數據時,會對磁盤進行兩次掃描,由于 I/O 資源是很消耗時間的,因此在 MySql4.1 之后,出現了一種改進的算法,就是單路排序。

單路排序:從此磁盤中查詢所需要的列,按照 orderby 列在 buffer 中對它們進行排序,然后掃描排序后的列表進行輸出,它的效率更快一些,避免了第二次讀取數據。并把隨機 I/O 變成了順序 I/O,但是它會使用更多的空間,因為它把每一行數據都保存在了內存中。

總結

以上是生活随笔為你收集整理的MySql ORDER BY 索引优化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 九九热精品视频在线观看 | 国产剧情在线视频 | m3u8成人免费视频 | 久久久久久久久久久久久久国产 | 亚洲精品v日韩精品 | 久久综合高清 | 色接久久 | 初尝黑人巨炮波多野结衣 | 国产女人被狂躁到高潮小说 | 香蕉成人av | 国产视频一区二区三区四区五区 | 18在线观看免费入口 | 国产床上视频 | 中文字幕亚洲乱码熟女1区2区 | 少妇色 | 婷婷亚洲精品 | 国产精久久一区二区三区 | 青青草视频在线免费观看 | 久久久综合色 | 草草视频在线观看 | 2023天天操 | 日韩Av无码精品 | 日精品| 又黄又爽一区二区三区 | 日本变态折磨凌虐bdsm在线 | 一区二区三区四区五区六区 | 欧美日韩中字 | 欧美在线日韩在线 | 亚洲 欧美 日韩系列 | 欧洲av一区二区 | 丝袜av在线播放 | 91精品国产亚洲 | 精品美女www爽爽爽视频 | 欧美亚一区二区三区 | 久久精品国产亚洲av麻豆图片 | www.麻豆av.com | 中文字幕在线第一页 | 国产黄色一区二区三区 | 亚洲激情社区 | 亚洲男人天堂2017 | 国产精品久线在线观看 | 国产成人精品a视频一区 | 性一交一乱一透一a级 | 午夜痒痒网| 长篇高h肉爽文丝袜 | 女优中文字幕 | 久久av一区二区三区亚洲 | 美女在线网站 | 日本不卡视频在线 | 99精品欧美一区二区三区综合在线 | 中文字幕在线观看欧美 | 日本三级片在线观看 | 亚洲一区二区三区免费观看 | 啪啪网页 | 青青操在线视频 | 欧美日韩精品一区二区在线播放 | 黄色av网站免费观看 | 东京久久久 | 无码人妻aⅴ一区二区三区玉蒲团 | 美日韩一区二区三区 | 91成人精品国产刺激国语对白 | 国产精品羞羞答答 | 亚洲国产精品国自产拍久久 | 97av视频 | 福利色播| 欧美三级韩国三级日本三斤在线观看 | 国产情侣呻吟对白高潮 | 五月婷婷综合色 | 国产91精品欧美 | 欧美干 | 五月综合激情日本mⅴ | 欧美片一区二区 | 精品一区不卡 | 精品国产免费av | 我们的2018在线观看免费高清 | 亚洲AV无码阿娇国产精品 | 中文字幕av无码一区二区三区 | 素人一区二区 | 中文字幕+乱码+中文 | 色老头在线一区二区三区 | 女人裸体又黄 | 怡红院毛片 | 国产精品爽 | 美女露出让男生揉的视频 | 久久久性 | 日本免费一区二区三区 | 欧美成人精品欧美一级 | 美女日批网站 | 欧美综合亚洲图片综合区 | 奇米影视色 | 人妻少妇被猛烈进入中文字幕 | 亚洲欧美一区二区三区久久 | 国产精品自拍在线 | 天天干天天舔天天射 | 麻豆视频在线观看免费网站黄 | 国产91在线视频观看 | 黄色网址视频在线观看 | 中文字幕人成乱码熟女香港 | 欧美在线精品一区 |