最近學了mysql的索引原理,針對常見的幾個面試問題進行了實驗分析
新建乙個表
create
table
ifnot
exists
`test`
(`www`
intunsigned
auto_increment
,`***`
intnot
null
,`yyy`
intnot
null
,`zzz`
intnot
null
,primary
key(
`www`))
engine
=innodb
default
charset
=utf8;
insert
into
`test`
(***, yyy, zzz)
values(5
,5,5
);
新建索引
關於explain的分析,我們可以通過type這一列來看到結果
依次從好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,all,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到乙個索引
a:system:表中只有一行資料或者是空表,且只能用於myisam和memory表。如果是innodb引擎表,type列在這個情況通常都是all或者index
b:const:使用唯一索引或者主鍵,返回記錄一定是1行記錄的等值where條件時,通常type是const。其他資料庫也叫做唯一索引掃瞄
c:eq_ref:出現在要連線過個表的查詢計畫中,驅動表只返回一行資料,且這行資料是第二個表的主鍵或者唯一索引,且必須為not null,唯一索引和主鍵是多列時,只有所有的列都用作比較時才會出現eq_ref
d:ref:不像eq_ref那樣要求連線順序,也沒有主鍵和唯一索引的要求,只要使用相等條件檢索時就可能出現,常見與輔助索引的等值查詢。或者多列主鍵、唯一索引中,使用第乙個列之外的列作為等值查詢也會出現,總之,返回資料不唯一的等值查詢就可能出現。
e:fulltext:全文索引檢索,要注意,全文索引的優先順序很高,若全文索引和普通索引同時存在時,mysql不管代價,優先選擇使用全文索引
f:ref_or_null:與ref方法類似,只是增加了null值的比較。實際用的不多。
g:unique_subquery:用於where中的in形式子查詢,子查詢返回不重複值唯一值
h:index_subquery:用於in形式子查詢使用到了輔助索引或者in常數列表,子查詢可能返回重複值,可以使用索引將子查詢去重。
i:range:索引範圍掃瞄,常見於使用》,
j:index_merge:表示查詢使用了兩個以上的索引,最後取交集或者並集,常見and ,or的條件使用了不同的索引,官方排序這個在ref_or_null之後,但是實際上由於要讀取所個索引,效能可能大部分時間都不如range
k:index:索引全表掃瞄,把索引從頭到尾掃一遍,常見於使用索引列就可以處理不需要讀取資料檔案的查詢、可以使用索引排序或者分組的查詢。
l:all:這個就是全表掃瞄資料檔案,然後再在server層進行過濾返回符合要求的記錄。
mysql,explain執行計畫組合索引測試
create table users id int 11 not null,name varchar 255 default null,age int 11 default null,manager id int 11 default null,primary key id key idex nam...
MySQL Explain關鍵字與索引優化建議
用到的資料表如下 drop table if exists actor create table actor id int 11 not null,name varchar 45 default null,update time datetime default null,primary key i...
mysql 索引 增刪查
一 建立 建立單個索引的語法 create index 索引名 on 表名 欄位名 索引名一般是 表名 欄位名 給id建立索引 create index t1 id on t1 id 建立聯合索引的語法 create index 索引名 on 表名 欄位名1,欄位名2 二 刪除 可利用alter t...