正確理解Mysql的列索引和多列索引

2021-06-25 07:09:25 字數 3595 閱讀 5404

1、如果表有乙個多列索引,優化器可以使用最左面的索引字首來找出行。

select * from tbl_name where col1=val1;

select * from tbl_name where col1=val1 and col2=val2;

select * from tbl_name where col2=val2;

select * from tbl_name where col2=val2 and col3=val3;

如果 (col1,col2,col3)有乙個索引,只有前2個查詢使用索引。第3個和第4個查詢確實包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左邊的字首。

2、如果like的引數是乙個不以萬用字元開頭的常量字串,索引也可以用於like比較。例如,下面的select語句使用索引:

select * from tbl_name where key_col like 'patrick%';

select * from tbl_name where key_col like 'pat%_ck%';

3、如果在字段前加了函式,則索引會被抑制,

4、空值不在索引中儲存,所以

select field3,field4 from tb where field2 is[not] null不使用索引。

5、不等式如

select field3,field4 from tb where field2!='tom'不使用索引。

相似地,

select field3,field4 from tb where field2 not in('m','p')不使用索引。

6、

索引值過大(如在乙個char(40)的字段上建索引),會造成大量的i/o開銷(甚至會超過表掃瞄的i/o開銷)。因此,盡量使用整數索引。 sp_estspace可以計算表和索引的開銷。

對於多列索引,order by的順序必須和索引的字段順序一致。

7、char型別的字段不建索引比int型別的字段不建索引更糟糕。建索引後效能只稍差一點。

8、避免使用or條件,因為or不使用索引。

explain檢查

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all

一般來說,得保證查詢至少達到range級別,最好能達到ref,否則就可能會出現效能問題。

mysql資料庫提供兩種型別的索引,如果沒正確設定,索引的利用效率會大打折扣卻完全不知問題出在這。

[c-sharp]view plain

copy

create table test (  

id         int not null,  

last_name  char(30) not null,  

first_name char(30) not null,  

primary key (id),  

index name (last_name,first_name)  

);  

以上建立的其實是乙個多列索引,建立列索引的**如下:

[c-sharp]view plain

copy

create table test (  

id         int not null,  

last_name  char(30) not null,  

first_name char(30) not null,  

primary key (id),  

index name (last_name),  

index_2 name (first_name)  

);  

乙個多列索引可以認為是包含通過合併(concatenate)索引列值建立的值的乙個排序陣列。 當查詢語句的條件中包含last_name 和 first_name時,例如:

[c-sharp]view plain

copy

select * from test where last_name=

'kun'

and first_name=

'li'

;  

sql會先過濾出last_name符合條件的記錄,在其基礎上在過濾first_name符合條件的記錄。那如果我們分別在last_name和first_name上建立兩個列索引,mysql的處理方式就不一樣了,它會選擇乙個最嚴格的索引來進行檢索,可以理解為檢索能力最強的那個索引來檢索,另外乙個利用不上了,這樣效果就不如多列索引了。

但是多列索引的利用也是需要條件的,以下形式的查詢語句能夠利用上多列索引:

[c-sharp]view plain

copy

select * from test where last_name=

'widenius'

;  select * from test where last_name='widenius'

and first_name=

'michael'

;  select * from test where last_name='widenius'

and (first_name=

'michael'

or first_name=

'monty'

);  

select * from test where last_name='widenius'

and first_name >=

'm'and first_name < 

'n';  

以下形式的查詢語句利用不上多列索引:

[c-sharp]view plain

copy

select * from test where first_name=

'michael'

;  select * from test where last_name='widenius'

or first_name=

'michael'

;  

多列建索引比對每個列分別建索引更有優勢,因為索引建立得越多就越佔磁碟空間,在更新資料的時候速度會更慢。

另外建立多列索引時,順序也是需要注意的,應該將嚴格的索引放在前面,這樣篩選的力度會更大,效率更高。

正確理解Mysql中的列索引和多列索引

mysql資料庫提供兩種型別的索引,如果沒正確設定,索引的利用效率會大打折扣卻完全不知問題出在這。create table test id int not null,last name char 30 not null,f程式設計客棧irst name char 30 not null,primar...

復合索引的正確理解

復合索引的結構 參考 mysql技術內幕 innodb儲存引擎 第2版 復合索引的結構 首先正確的認識復合索引的結構,非葉子節點上是存在索引值的 例如以a b欄位建立復合索引,那排列如下 通過葉子節點,就能拿到資料 1,1 1,2 2,1 2,4 3,1 3,2 索引使用數量 參考 對於c1 c2 ...

mysql多列索引 MySQL的多列索引

什麼是索引?索引用來快速地尋找那些具有特定值的記錄,所有mysql索引都以b 樹的形式儲存。如果沒有索引,執行查詢時mysql必須從第乙個記錄開始掃瞄整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。如果作為搜尋條件的列上已經建立了索引,mysql無需掃瞄任何記錄...