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排序
- SQL 分組排序group bySQL排序
- RxSwift(偽)實戰 組內分享Swift
- mysql實戰--MYSQL中的SQL分組方法MySql
- 組內排名的實現方法
- Java利用Comparator實現分組排序Java排序
- MySQL的Group By分組MySql
- 使用 Swift 實現堆排序Swift排序
- 如何在mysql中實現自然排序MySql排序
- ForkJoin和氣泡排序組合實現的歸併排序排序
- MYSQL-實現ORACLE- row_number() over(partition by ) 分組排序功能.MySqlOracle排序
- mysql group_concat 實現把分組欄位寫成一行的方法MySql
- 使用 Swift 實現歸併排序Swift排序
- 使用ProxySQL實現MySQL Group Replication的故障轉移、讀寫分離(一)MySql
- Flowable實戰(七)使用者和組
- 八大排序演算法實戰:思想與實現排序演算法
- MySQL 是如何實現資料的排序的?MySql排序
- mysql 5.6 binlog組提交實現原理MySql
- python根據字典內的值實現排序Python排序
- 實現堆排序排序
- 07#Web 實戰:實現 GitHub 個人主頁專案拖拽排序WebGithub排序
- JDBC+MySQL入門實戰(實現CURD的例子)JDBCMySql
- MySQL8.0——Resource Group(資源組)MySql
- Oracle和MySQL分組查詢GROUP BYOracleMySql
- mysql~GROUP_CONCAT實現關係表的行轉列MySql
- 如何在分組報表中實現組內資料補空行及組內頁碼
- MySQL實戰 | 為什麼要使用索引?MySql索引
- 推送開發實戰:APP如何實現跟隨使用者不同場景,實現不同的內容推薦APP
- GO 實現快速排序Go排序
- js 實現堆排序JS排序
- 快速排序 java實現排序Java
- Swift實現快速排序Swift排序
- java實現快速排序Java排序
- 快速排序(java實現)排序Java
- 堆排序(php實現)排序PHP
- 希爾排序java實現排序Java
- 快速排序的實現排序
- map/reduce實現 排序排序