mysql索引 實戰 mysql索引 實戰篇

2021-10-20 23:26:25 字數 3000 閱讀 4660

索引主要用於快速的檢索資料,對於一萬條以上的資料不使用索引查詢是災難性的。從不同的維度上有不同的索引定義:如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 也有人把聚集索引稱為聚簇索引。當然了,聚集索...