MySQL高階知識(五) 索引分析

2021-09-12 12:44:35 字數 2906 閱讀 3288

前言:前面已經學習了explain(執行計畫)的相關知識,這裡利用explain對索引進行優化分析。

首先建立三張表:tb_emp(職工表)、tb_dept(部門表)和tb_desc(描述表)

1)tb_emp表。

drop table if exists `tb_emp`;

create table `tb_emp` (

`id` int(11) not null auto_increment,

`username` varchar(20) not null,

`deptid` int(11) not null,

primary key (`id`)

) engine=innodb default charset=utf8mb4;

-- ----------------------------

insert into `tb_emp`(username,deptid) values ('tom', '1');

insert into `tb_emp`(username,deptid) values ('jack', '1');

insert into `tb_emp`(username,deptid) values ('mary', '2');

insert into `tb_emp`(username,deptid) values ('rose', '3');

2)tb_dept表。

drop table if exists `tb_dept`;

create table `tb_dept` (

`id` int(11) not null auto_increment,

`name` varchar(20) not null,

primary key (`id`)

) engine=innodb default charset=utf8mb4;

-- ----------------------------

insert into `tb_dept`(name) values ('綜合部');

insert into `tb_dept`(name) values ('研發');

insert into `tb_dept`(name) values ('測試');

insert into `tb_dept`(name) values ('總裁');

3)tb_desc表。

drop table if exists `tb_desc`;

create table `tb_desc` (

`id` int(11) not null auto_increment,

`empid` int(11) default null,

`deptid` int(11) default null,

primary key (`id`)

) engine=innodb default charset=utf8mb4;

-- ----------------------------

insert into `tb_desc`(empid,deptid) values (1, 1);

insert into `tb_desc`(empid,deptid) values (2, 1);

insert into `tb_desc`(empid,deptid) values (3, 2);

insert into `tb_desc`(empid,deptid) values (4, 3);

注:這裡強行將員工表與部門表不直接關聯,通過第三張表(描述表)進行關聯,主要為了進行join的分析。

#1.首先執行查詢。

#2.通過explain進行分析。

分析:從explain執行結果可以看出對兩表都是用了全表掃瞄(all),並且在tb_desc表中還使用了join連線快取,需要進行優化。但是如何優化?是在左表建立索引還是右表建立索引呢?因為左連線左表是全有,所以應該在右表建立索引。

#3.右表建立索引。

通過explain執行可以看到,在建立索引後,獲得了比較不錯的結果。(type=ref,extra=using index)。

結論:left join(左連線)情況下,應該在右表(tb_desc)建立索引。

通過上面left join的例子,我們直接交換兩表位置,並將left join改變成right join。

分析:與left join進行對比,可以得到如下結論:

#1.在left join下,首先執行tb_emp(左表),type=all,因為左連線情況下左表全有,因此我們在tb_desc(右表)建立索引,得到比較理想的效果。

#2.在right join下(我們交換了tb_emp和tb_desc的位置),執行順序:tb_emp(右表)→ tb_desc(左表)。右表type=all,因為右連線情況下右表全有,因此在左表(tb_desc,我們交換了位置)建立索引,效果肯定和left join一樣。

left join(左連線):右表建立索引。

right join(右連線):左表建立索引。

簡記:左右外連線,索引相反建(left:右表建,right:左表建)。

MySQL高階知識(五) 索引分析

首先建立三張表 tb emp 職工表 tb dept 部門表 和tb desc 描述表 1 tb emp表。drop table if exists tb emp create table tb emp id int 11 not null auto increment,username varch...

mysql高階索引分析,索引失效

一,索引分析 1,單錶 2,兩表 3,三表 join優化 優先優化nestedloop 巢狀迴圈鏈結 的內層迴圈 保證join語句中被驅動表上join條件字段已經被索引 當無法保證驅動表join條件欄位被索引且記憶體資源充足的前提下,不要太令色join buffer的設定 二,索引失效 1,全匹配最...

MySQL高階知識(三) 索引

mysql官方對索引的定義 索引 index 是幫助mysql高效獲取資料的資料結構。因此索引的本質就是資料結構。索引的目的在於提高查詢效率,可模擬字典 書籍的目錄等這種形式。可簡單理解為 排好序的快速查詢資料結構 在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式指...