最近看過很多網上一些關於mysql的技術文章,對於索引這一塊,各持己見,在這裡,我總結了一下自己的實戰經驗。
什麼是索引?通俗的話就是乙個目錄,就好像一本書,在頁頭列出所有章節目錄,讀者想看自己感興趣的知識點,可通過檢視章節目錄快速定位。但是在mysql中,索引的型別
有多種,常用的型別normal,unique,主鍵索引等等,而索引方法在mysql中常用的有btree(二叉樹),二叉樹查詢通常採用二分查詢法,什麼是二分查詢法?
就好比如一棵樹,有根節點,左節點,右節點,葉子節點,每個節點實際上都是乙個位址,該話語比較抽象。當一棵樹形成後,使用者想查詢6,mysql底層則會根據6去跟二叉樹的根
節點比較,如果比根節點要小,則去根節點的左節點查詢,否則去根節點的右節點查詢,這樣做的好處是,減少查詢次數。如果不採用二叉樹,可想而知,要查詢一條資料,則會查詢整棵樹,可想而知
效能是有多差,在這裡不再寫太多的話語,還是言歸正傳,大致列出如下常見的場景。
經驗一:什麼情況下索引會失效?
場景a:乙個資料庫a的字符集為utf8mb4,另乙個資料庫b的字符集為utf8,如果兩個庫中涉及到關聯表,如a庫user表,b庫order表,兩個表的關聯字段型別長度一致,當user表與order表進行內連線inner join時,on的條件為user.id = order.user_id時,索引失效。
場景b:乙個資料庫a的字符集為utf8,另乙個資料庫b的字符集為utf8,如果兩個庫中涉及到關聯表,如a庫user表,b庫order表,兩個表的關聯字段型別長度,主要型別或長度有一方不一致時,當user表與order表進行內連線inner join時,on的條件為user.id = order.user_id時,索引失效。
場景c:user表中user_name欄位,假設該欄位建立了普通索引。當在開發**時編寫的sql採用like關鍵字模糊查詢時,如 select * from user where user_name like '%huang%'
或者select * from user where user_name like '%huang' 索引失效。
場景d:order表中order_type欄位,型別為字串,假設該欄位建立了普通索引。當在開發**時編寫的sql如 select * from order where order_type = 1;
索引失效,正確的做法為select * from order where order_type = '1';
經驗二:in會不會走索引?
有乙個場景是,我要獲取**訂單(總資料兩千萬),**訂單(總資料兩千萬),秒殺訂單(總資料一千萬)的型別。按照網上的文章,in走索引,如果in的取值範圍小,索引是正常走,
但是in的取值範圍大,索引失效。
經驗三:or會不會走索引?
select 1 from card where card_no ='44178999811989221x' or user_id='00592560354-80393027097-78244247549-39135306455-88936868384';
card作為證件表,表中存在card_no以及user_id欄位,假設card_no為普通索引,user_id沒有索引,則上面的sql會導致索引失效。
假設card_no沒有索引,user_id為普通索引,一樣會導致該sql在執行過程中導致索引失效。
假設card_no為普通索引,user_id為普通索引,則sql在執行過程中生效。
經驗四:組合索引什麼情況下會走索引??
場景a:order表中存在order_type欄位以及order_status欄位,並且為這兩個字段建立組合索引,
select * from order where order_status = 1;索引失效
select * from order where order_type = 1;索引生效
select * from order where order_type = 1 and order_status = 1; 索引生效
組合索引的生效場景,如上是把order_type,order_status建立成乙個組合組合索引,那麼可以看成是【order_type】,【order_type、order_status】
相當於一串數字1,2,3,4,組合成不同的結果,【1,2】,【1,2,3】,【1,2,3,4】等情況才會讓索引生效,其餘一律失效。
經驗五:索引是不是滿足條件都會走?
不一定,mysql執行引擎如果覺得使用者執行的sql,當mysql覺得該執行sql可能不走索引的效率反而比你執行索引的速度要快的時候,則也會放棄走索引。
mysql 雜湊索引 MySQL索引之雜湊索引
雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...
mysql主鍵索引 MySQL索引之主鍵索引
在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...
mysql聚集索引 MySQL索引之聚集索引介紹
在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...