索引主要用於快速的檢索資料,對於一萬條以上的資料不使用索引查詢是災難性的。從不同的維度上有不同的索引定義:如b-tree索引,hash索引,位圖索引,鏈結索引,聚集索引,非聚集索引,覆蓋索引....等等。本文主要討論mysql innodb和mysian 下的b-tree索引,第一部分主要討論常用sql語句中索引的使用,包括普通的條件查詢,count,order by,group by等。
一、準備工作。
首先建立一張測試表,建表語句如下:
1 create table buyer_seller_detail( //建立買家賣家瀏覽表
2 id int not null primary key auto_increment, //自增id
3 uid int not null, //買家id
4 seller_id int not null, //賣家id
5 pv int not null, //瀏覽量
6 fee int not null, //成交金額
7 pg_time int not null, //停留時間
8 pg_type int not null)engine=innodb default charset=gbk; //頁面型別
為了方便測試,建立乙個儲存過程插入資料:
1 dilimiter $ //由於預設的語句結束符是;,寫儲存過程時應該將其改為其他的符號。
2 create procedure insertdata(in bs_num int,in bs_data_num int)
3 begin
4 declare sid int;
5 declare uid int;
6 declare pt int;
7 declare i int default 0;
8 declare j int;
9 declare k int;
10 declare count int default 0;
11 while i
12 set uid=rand()*10000000;
13 set sid=rand()*1000000;
14 set pt=mod((rand()*100),3);
15 set j = mod(bs_data_num,rand()*10);
16 set k = 0;
17 while k <= j do
18 insert into buyer_seller_detail(uid,seller_id,pv,fee,pg_time,pg_type) values(uid,sid,rand()*10000,rand()*1000,rand()*1000,pt);
19 set k=k+1;
20 set count=count+1;
21 if mod(count,1000)=0 then commit;
22 end if;
23 end while;
24 set i=i+1;
25 end while;
26 end;
建立資料,索引
1 delimiter ;
2 set autocommit=0;
3 call insertdata(1000000,100);
4 set autocommit=1;
5 alter table buyer_seller_detail add index uid_sid_pt(uid,seller_id,pg_type);
6 alter table buyer_seller_detail add index pt(pg_type);
資料準備好之後,就開始測試我們的sql。
二、使用索引的查詢
使用索引查詢之前,先介紹一下explain命令,這個命令的格式為explain [extended] select ....,使用了extended之後,可以使用show warnings檢視優化資訊。
執行可以看到以下資訊:
其中比較有用的就是type,從這個引數可以看出查詢是否走了索引,效能由高到低為效率從高到低const、eq_reg、ref、range、index和all,通常情況下輔助索引的匹配通常是ref型別。
key表示mysql實際使用的索引,如果沒有使用,則為null。
key_len表示使用的索引的長度。
rows表示選出來的行數。
extra是乙個額外的引數,通常可以用來觀察order by ,group by等語句的執行。
開啟profiling開關,用於觀察sql的執**況:
1 set profiling=1;
ok,下面開始我們的sql索引實戰。
1.全列匹配
1 explain select * from buyer_seller_detail where uid=29034508 and seller_id=4636 and pg_type=1;
從圖中我們可以看出查詢使用了索引type=ref,key=uid_sid_pt,key_len=12,最後乙個引數說明了該查詢使用了全部的索引字段。
2.最左字首
看如下的sql
mysql 雜湊索引 MySQL索引之雜湊索引
雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...
mysql主鍵索引 MySQL索引之主鍵索引
在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...
mysql聚集索引 MySQL索引之聚集索引介紹
在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...