索引欄 mysql之聯合索引

2021-10-14 18:56:23 字數 2621 閱讀 5814

前期準備:

建立聯合索引?

create table `test` (

`id` bigint(16) not null auto_increment,

`aaa` varchar(16) not null,

`bbb` varchar(16) not null,

`ccc` int(11) not null,

primary key (`id`)

) engine=innodb default charset=utf8

如果表已經建好了,那麼修改表:

create index `sindex` on `test` (`aaa`,`bbb`,`ccc`);
這種方式報錯

alert table test add index `sindex` (`aaa`,`bbb`,`ccc`)
修改表的儲存引擎:

alter table tablename engine = myisam;

alter table tablename engine = innodb;

其中最重要的字段為:id、type、key、rows、extra

id:

1、id相同:執行順序由上至下

2、id不同:如果是子查詢,id的序號會遞增,id值越大優先順序越高,越先被執行

3、id相同又不同(兩種情況同時存在):id如果相同,可以認為是一組,從上往下順序執行;在所有組中,id值越大,優先順序越高,越先執行

type:

訪問型別,sql查詢優化中乙個很重要的指標,結果值從好到壞依次是:

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

key:

查詢中如果使用了覆蓋索引,則該索引僅出現在key列表中

rows:

根據表統計資訊及索引選用情況,大致估算出找到所需的記錄所需要讀取的行數

extra:

1、using filesort :

mysql對資料使用乙個外部的索引排序,而不是按照表內的索引進行排序讀取。也就是說mysql無法利用索引完成的排序操作成為「檔案排序」

2、using temporary:

使用臨時表儲存中間結果,也就是說mysql在對查詢結果排序時使用了臨時表,常見於order by 和 group by

3、using index:

表示相應的select操作中使用了覆蓋索引(covering index),避免了訪問表的資料行,效率高

如果同時出現using where,表明索引被用來執行索引鍵值的查詢(參考上圖)

如果沒用同時出現using where,表明索引用來讀取資料而非執行查詢動作

覆蓋索引(covering index):也叫索引覆蓋。就是select列表中的字段,只用從索引中就能獲取,不必根據索引再次讀取資料檔案,換句話說查詢列要被所建的索引覆蓋。

下方的控制台主要關注兩個欄,type和extra

當extra出現道using filesort和using temproary這兩個時,表示無法使用索引版,必須盡快做優化。

當type出現all時,表示走的是全表掃瞄沒有走索引,效率低下,這時需要對sql進行調優。

當type出現ref或者index時,表示走的是索引,index是標準不重複的索引,ref表示雖然使用了索引,但是索引列中有重複的值,但是就算有權重複值,也只是在重複值的

範圍內小範圍掃瞄,不造成重大的效能影響。

測試語句是否使用了索引:

網上說聯合索引 test_col1_col2_col3 實際建立了(col1)、(col1,col2)、(col,col2,col3)三個索引。但是

我蒙蔽了,在我實際的測試中,aaa bbb ccc 這三個條件不管刪除那個,怎麼組合where條件查詢 type:index extral:using where; using index 難道說都用到索引了嘛?

sql1:explain select * from test where aaa=1 and bbb=1;

用到了索引

聯合索引設定

MYSQL索引之聯合索引詳解

比較簡單的是單列索引 b tree 遇到多條件查詢時,不可避免會使用到多列索引。聯合索引又叫復合索引。b tree結構如下 每乙個磁碟塊在mysql中是乙個頁,頁大小是固定的,mysql innodb的預設的頁大小是16k,每個索引會分配在頁上的數量是由字段的大小決定。當字段值的長度越長,每一頁上的...

mysql聯合索引詳解 mysql 聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...

mysql聯合索引技術 mysql 聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...