mysql 索引優化

2021-09-26 07:51:54 字數 3651 閱讀 2741

最左字首原則:顧名思義是最左優先,以最左邊的為起點任何連續的索引都能匹配上,

注:如果第乙個欄位是範圍查詢需要單獨建乙個索引

注:在建立多列索引時,要根據業務需求,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...