mysql使用group by實現組內排序實戰
一、前言
如題所示,這個問題很早之前就聽過了,之前我也是一直以為in查詢是用不到索引的。後來陸陸續續看到很多部落格,有的說in查詢可以用索引,有的說不能用索引,所以博主就越發好奇起來。到底能不能用索引,絕對有個正確的答案,而不是這樣的模稜兩可。
二、in查詢的一些總結
首先呢,博主自己測試自己寫的一條sql
,是包含in查詢的。檢視執行計劃explain
,發現是用到了索引的。(這裡因為筆記是一個月前記錄的,並未儲存截圖,不過留下的都是一些結論。)
總結下來:
1、在mysql 5.7.17版本,in查詢可以用到索引
+-----------+
| version() |
+-----------+
| 5.7.17 |
+-----------+
2、查詢的值型別是int,列的型別是vachar,這樣會導致索引失效。
3、資料量太大(200w)且in條件多,這個應該Mysql的最佳化器自己選擇判斷的,當資料量很大的時候,in 查詢走索引也許不是最好的。(PS:這部分要考慮mysql自帶的最佳化器的判斷,關於mysql的最佳化器的執行原理,那是相當複雜,簡而言之就是各種條件判斷,選出mysql自認為的最優解。)
三、那麼對於加入聯合索引的欄位,in查詢會有效嗎?
首先: 對於聯合索引,我們要明確一個概念,對於聯合索引,執行順序時從左到右依次匹配,相當於 order by id,name
等。第一個欄位一定有序,如果使用第二個欄位的索引,必須先使用第一個欄位,而且必須保證第二個欄位有序。
其次: 最左字首匹配原則,非常重要的原則,mysql
會一直向右匹配直到遇到範圍查詢(>、<、between、like
)就停止匹配,比如a ="1" and b="2" and c > "3" and d = "4"
如果建立(a,b,c,d)
順序的索引,d
是用不到索引的,因為c
欄位進行了範圍查詢,聯合索引失效。如果建立(a,b,d,c)
的索引則都可以用到,a,b,d
的順序可以任意調整。
這裡強烈推薦一篇部落格: (美團技術團隊的一篇文章)
經過博主測試,結果和上面的概念一樣,如果in查詢是在符合最左原則的前提下,是可以正常使用的索引的。但是如果in查詢的前面有範圍查詢,那麼聯合索引失效,自然我們的in查詢也就用不到索引了
行吧,關於in
查詢,博主自己做的總結大概就是這個樣子的。當然這些結論未必全都正確,如果以後博主發現有什麼不對的地方,也會及時修改部落格的,防止誤人子弟。有大神看到,也請不吝賜教。
後續還會針對mysql的聯合索引,覆蓋索引,最佳化器等寫幾篇部落格。都是之前總結好的,造孽啊,這樣重溫一次也是相當花時間的。。。
end
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2823239/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL實現分組排序MySql排序
- Java利用Comparator實現分組排序Java排序
- 使用 Swift 實現堆排序Swift排序
- mysql group_concat 實現把分組欄位寫成一行的方法MySql
- 使用ProxySQL實現MySQL Group Replication的故障轉移、讀寫分離(一)MySql
- 組內排名的實現方法
- 使用 Swift 實現歸併排序Swift排序
- ForkJoin和氣泡排序組合實現的歸併排序排序
- python根據字典內的值實現排序Python排序
- MySQL 是如何實現資料的排序的?MySql排序
- mysql~GROUP_CONCAT實現關係表的行轉列MySql
- FPGA排序模組與verilog實現【含原始碼!!!】FPGA排序原始碼
- JDBC+MySQL入門實戰(實現CURD的例子)JDBCMySql
- 07#Web 實戰:實現 GitHub 個人主頁專案拖拽排序WebGithub排序
- 使用frp實現內網穿透FRP內網穿透
- Flowable實戰(七)使用者和組
- MySQL實戰 | 為什麼要使用索引?MySql索引
- MySQL8.0——Resource Group(資源組)MySql
- 與你探索classnames模組內部實現
- [實戰演練]python3使用requests模組爬取頁面內容Python
- 使用Guava的ComparisonChain實現自定義的排序GuavaAI排序
- 使用javascript實現排序二叉樹(2)JavaScript排序二叉樹
- 使用javascript實現排序二叉樹(1)JavaScript排序二叉樹
- react中使用dnd-kit實現拖拽排序React排序
- 微服務實戰 – docker-compose實現mysql+springboot+angular微服務DockerMySqlSpring BootAngular
- java實現快速排序Java排序
- Swift實現快速排序Swift排序
- js 實現堆排序JS排序
- GO 實現快速排序Go排序
- 快速排序(java實現)排序Java
- 快速排序 java實現排序Java
- 推送開發實戰:APP如何實現跟隨使用者不同場景,實現不同的內容推薦APP
- php實現 歸併排序,快速排序PHP排序
- 從零實現Vue的元件庫(十五)- Checkbox-Group 實現Vue元件
- MySQL全面瓦解23:MySQL索引實現和使用MySql索引
- 使用Spring Boot實現模組化Spring Boot
- Nginx使用Lua模組實現WAFNginx
- 如何使用 frp 實現內網穿透FRP內網穿透