sql復合索引的探索


首先擺出道我在牛客里看到的題目

mysql數據庫,game_order表表結構如下,下面哪些sql能使用到索引()?

 

  1. select * from game_order where plat_game_id=5 and plat_id=134
  2. select * from game_order where plat_id=134 and
    plat_game_id=5 and plat_order_id=’100’
  3. select * from game_order where plat_order_id=’100’
  4. select * from game_order where plat_game_id=5 and
    plat_order_id=’100’ and plat_id=134
  5. select * from game_order where plat_game_id=5 and plat_order_id=’100’

正確答案:2345

 

這里就涉及到了復合索引的最左優先原則

最左優先就是說組合索引的第一個字段必須出現在查詢組句中,這個索引才會被用到。比如假設有一個3列索引(col1,col2,col3),那么MySQL只會會建立三個索引(col1),(col1,col2),(col1,col2,col3)。所以這道題目

根據最左匹配原則,where語句必須要有plat_order_id才能調用索引(如果沒有plat_order_id字段那么一個索引也調用不到),如果同時出現plat_order_id與plat_game_id則會調用兩者的組合索引,如果同時出現三者則調用三者的組合索引。

 

既然說到了索引,擴展一下回顧一下索引(單一,復合)的使用及注意事項

索引(Index)是幫助數據庫高效獲取數據的數據結構。索引是在基於數據庫表創建的,它包含一個表中某些列的值以及記錄對應的地址,並且把這些值存儲在一個數據結構中,在進行數據庫查詢時使用索引,可以加速數據的查詢。因為索引是有序排列的。最常見的就是使用哈希表、B+樹作為索引。

單一索引和復合索引

單一索引是指索引列為一列的情況,即新建索引的語句只實施在一列上; 復合索引(組合索引)在多個列上建立索引; 復合索引在數據庫操作期間所需的開銷更小,可以代替多個單一索引; 同時有兩個概念叫做窄索引和寬索引,窄索引是指索引列為1-2列的索引,寬索引也就是索引列超過2列的索引;設計索引的一個重要原則就是能用窄索引不用寬索引,因為窄索引往往比組合索引更有效;

關於復合索引的最左優先實現原理簡單來說就是

我們知道B+樹是非常適合索引的結構,所以

一棵樹 
如果是單列,就按這列數據進行排序
如果是多列,就按多列數據排序,例如有(1,1) (2,2) (2,1) (1,2)
那在索引中的葉子節點的數據順序就是(1,1)(1,2)(2,1)(2,2)
這也是為什么查詢復合索引的前綴是可以用到索引的原因

如果還是不太明白現附上鏈接:

https://blog.csdn.net/weixin_30531261/article/details/79312676

擴展知識:https://blog.csdn.net/qq_37779709/article/details/80981292

最后放上一張經典的易記憶的圖片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM