前期準備:
建立聯合索引?
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進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...