聯合索引:
通俗理解:
利用索引中的附加列,您可以縮小搜尋的範圍,但使用乙個具有兩列的索引 不同於使用兩個單獨的索引。復合索引的結構與**簿類似,人名由姓和名構成,**簿首先按姓氏對進行排序,然後按名字對有相同姓氏的人進行排序。如果您知道姓,**簿將非常有用;如果您知道姓和名,**簿則更為有用,但如果您只知道名不姓,**簿將沒有用處。
所以說建立復合索引時,應該仔細考慮列的順序。對索引中的所有列執行搜尋或僅對前幾列執行搜尋時,復合索引非常有用;僅對後面的任意列執行搜尋時,復合索引則沒有用處。
最左字首原則:
顧名思義是最左優先,以最左邊的為起點任何連續的索引都能匹配上,
注:如果第乙個欄位是範圍查詢需要單獨建乙個索引
注:在建立聯合索引時,要根據業務需求,where條件子句中使用最頻繁的一列放在最左邊。這樣的話擴充套件性較好,比如 userid 經常需要作為查詢條件,而 mobile 不常常用,則需要把 userid 放在聯合索引的第一位置,即最左邊
重點:多個單列索引在多條件查詢時只會生效第乙個索引!所以多條件聯合查詢時最好建聯合索引!
同時存在聯合索引和單列索引(欄位有重複的),這個時候查詢mysql會怎麼用索引呢?
這個涉及到mysql本身的查詢優化器策略了,當乙個表有多條索引可走時, mysql 根據查詢語句的成本來選擇走哪條索引;
聯合索引本質:
當建立(a,b,c)聯合索引時,相當於建立了(a)單列索引,(a,b)聯合索引以及(a,b,c)聯合索引
想要索引生效的話,只能使用 a和a,b和a,b,c三種組合;當然,經過測試,a,c組合也可以,但實際上只用到了a的索引,c並沒有用到!
聯合索引比對每個列分別建索引更有優勢,因為索引建立得越多就越佔磁碟空間,在更新資料的時候速度會更慢。另外建立多列索引時,順序也是需要注意的,應該將嚴格的索引放在前面,這樣篩選的力度會更大,效率更高。
索引也能用於分組和排序,分組要先排序,在計算平均值等等。所以在分組和排序中,如果字段順序可以按照索引的字段順序,即可利用索引的有序特性。
有人說where查詢是按照從左到右的順序,所以篩選力度大的條件盡量放前面。網上很多都是這種說法,但是據我研究,mysql執行優化器會對其進行優化,當不考慮索引時,where條件順序對效率沒有影響,真正有影響的是是否用到了索引!
但是優化器需要做的事情,我們寫**的時候直接按聯合索引的順序寫好,這也是一種規範吧。
能用聯合索引就用聯合索引,單條件查詢時,使用單個索引;不管單條索引還是聯合索引,最好不要有大量重複資料,不然會引起聚簇索引與費聚簇索引之間的來回切換,消耗資料庫效能,效率低;
還有1.不要索引資料量不大的表,對於小表來講,表掃瞄的成本並不高。
2:不要設定過多的索引,在沒有聚集索引的表中,最大可以設定249個非聚集索引,過多的索引首先會帶來更大的磁碟空間,而且在資料發生修改時,對索引的維護是特別消耗效能的。
先總結到這兒,以後有內容再補充
Mysql 建立聯合索引注意事項
當乙個表有多條索引可走時,mysql 根據查詢語句的成本來選擇走哪條索引,聯合索引的話,它往往計算的是第乙個字段 最左邊那個 這樣往往會走錯索引.如 索引index 1 create time,category id index 2 category id 如果每天的資料都特別多,而且有很多cate...
索引使用注意事項
1.索引不會包含有 null 值的列只要列中包含有 null 值都將不會被包含在索引中,復合索引中只要有一列含有 null 值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓字段的預設值為 null 應該用 0 乙個特殊的值或者乙個空串代替空值。2.復合索引 比如有一條語句是這樣的...
使用索引注意事項
新增dept 資料 create procedure insert dept in start int 10 in max num int 10 begin declare i int default 0 set autocommit 0 repeat set i i 1 insert into d...