最左字首原則:顧名思義是最左優先,以最左邊的為起點任何連續的索引都能匹配上,
注:如果第乙個欄位是範圍查詢需要單獨建乙個索引
注:在建立多列索引時,要根據業務需求,where子句中使用最頻繁的一列放在最左邊。
當建立(a,b,c)復合索引時,想要索引生效的話,只能使用 a和a,b和a,b,c三種組合
例項:以下是常見的幾個查詢:
mysql>
select
`a`,
`b`,
`c`from a where
`a`=
'aa'
;mysql>
select
`a`,
`b`,
`c`from a where
`b`=
'bb'
and`c`
='cc'
;mysql>
select
`a`,
`b`,
`c`from a where
`a`=
'aa'
and`c`
='cc'
;
請問:想要索引最大化的使用需要至少建幾個索引
答:需要建立兩個復合索引:a,c、b,c
原理:採用b+樹結構,如果是復合索引,比如 a,b,c
是先對a進行建立索引的結果下,再對b進行建立索引, 然後在以上的結果下,對c進行建立索引
因此,只有a, ab, abc ,這三種情況下是有序的,會走索引,
如果光看b, 是無序的。
大多數mysql儲存引擎預設索引型別
樹進行搜尋即可,所以查詢速度快很多。
因為b+ tree的有序性,所以用於查詢,還可以用於排序和分組。
復合索引(最左字首查詢);不能跨列,不能無序
索引是在儲存引擎層實現的
不同儲存引擎具有不同的索引型別和實現。
innodb 的 b+tree
主索引的葉子節點 data 域記錄著完整的資料記錄(聚簇索引)
輔助索引進行查詢時,需要先查找到主鍵值,然後再到主索引中進行查詢。
輔助索引(只記錄主鍵的值)的葉子節點的 data 域記錄著主鍵的值,先使用輔助節點找到主鍵值,然後到主索引;
雜湊索引能以 o(1) 時間進行查詢,但是失去了有序性:
查詢條件使用 match against,而不是普通的 where。
列不能作為表示式的一部分,不能作為函式引數;
select actor_id from actor_id +1=
5;
多列索引
在需要使用多個列作為條件進行查詢時,使用多列索引比使用多個單列索引效能更好;
select film_id, actor_ id from sakila.film_actor where actor_id =
1and film_id =
1;
索引列的順序
讓選擇性最強的索引列放在前面。讓唯一索引,或選擇性比較強(重複的索引值比較少)在前面;
select
count
(distinct staff_id)
/count(*
)as staff_id_selectivity,
count
(distinct customer_id)
/count(*
)as customer_id_selectivity,
count(*
)from payment;
staff_id_selectivity: 0.0001
customer_id_selectivity: 0.0373
count(*): 16049
字首索引
對於 blob、text 和 varchar 型別的列,必須使用字首索引,只索引開始的部分字元。
字首長度的選取需要根據索引選擇性來確定。
覆蓋索引
索引包含所有需要查詢的字段的值。
具有以下優點:
使用條件:
定義主鍵的資料列一定要建立索引。
定義有外來鍵的資料列一定要建立索引。
對於經常查詢的資料列最好建立索引。
對於需要在指定範圍內的快速或頻繁查詢的資料列;
經常用在where子句中的資料列。
經常出現在關鍵字order by、group by、distinct後面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字後面的字段順序一致,否則索引不會被使用。
對於那些查詢中很少涉及的列,重複值比較多的列不要建立索引。
select
*from student s where s.stuname in
(「張三」,「李四」,「王五」)
and s.age>
18and s.***=『男』;
思路:
1.肯定要建立二級聯合索引:index(stuname,age,***)
2.這裡要優化一下sql語句中的in,改用union all
優化後的sql:
select
*from student s where s.stuname=「張三」 and s.age>
18and s.***=『男』
union
allselect
*from student s where s.stuname=「李四」 and s.age>
18and s.***=『男』
union
allselect
*from student s where s.stuname=「王五」 and s.age>
18and s.***=『男』 ;
兩個引數至少有乙個是 null 時,比較的結果也是 null,例外是使用 <=> 對兩個 null 做比較時會返回 1,這兩種情況都不需要做型別轉換。
兩個引數都是字串,會按照字串來比較,不做型別轉換
兩個引數都是整數,按照整數來比較,不做型別轉換
十六進製制的值和非數字做比較時,會被當做二進位制串
有乙個引數是 timestamp 或 datetime,並且另外乙個引數是常量,常量會被轉換為 timestamp
有乙個引數是 decimal 型別,如果另外乙個引數是 decimal 或者整數,會將整數轉換為 decimal 後進行比較,如果另外乙個引數是浮點數,則會把 decimal 轉換為浮點數進行比較
所有其他情況下,兩個引數都會被轉換為浮點數再進行比較。(這裡所說的浮點數一般預設為double型別)
所有其他情況下,兩個引數都會被轉換為浮點數再進行比較。(這裡所說的浮點數一般預設為double型別)
舉例:
select * from t_user where username=
123;
1、索引失效
無法使用到索引查詢,因為mysql會在引擎層進行型別隱式轉換(convert_implicit),會先把username隱式轉換成浮點數,然後再跟你的123進行比較,然而你的索引是建在username上的,並不是在轉換後的username上的,所以進行轉換後的username相當於沒有索引。會全表掃瞄,換做大表中,無法使用索引,你懂得。
mysql 優化 聚集索引 mysql 索引優化
一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...
mysql索引優化原則 MySQL 索引優化原則
索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...
mysql索引優化原則 MySQL索引優化
mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...