mysql建立聯合索引 mysql之聯合索引

2021-10-17 16:11:47 字數 2252 閱讀 9528

mysql之聯合索引測試:

前期準備:

建立聯合索引?

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;

explain:

其中最重要的字段為: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列表中的字段,只用從索引中就能獲取,不必根據索引再次讀取資料檔案,換句話說查詢列要被所建的索引覆蓋。

explain:

下方的控制台主要關注兩個欄,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;

用到了索引

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

聯合索引設定

aaa bbb

bbb aaa

bbb

MySql建立聯合索引

首先建立乙個表 create table t1 id int primary key,username varchar 20 password varchar 20 建立單個索引的語法 create index 索引名 on 表名 欄位名 索引名一般是 表名 欄位名 給id建立索引 create i...

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進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...