MySQL join 連表查詢索引問題


首先先創建兩個臨時表,並加一條基礎數據進去

create table user
(
  id              int auto_increment comment '自增主鍵' primary key,
  name            varchar(30) null comment '用戶名稱',
  create_time     datetime    not null  comment '注冊時間',
  last_login_time datetime    null  comment '最后登錄時間'
)  comment '測試表';
create table article
(
  id          int auto_increment  comment '自增主鍵'    primary key,
  user_id     int          not null  comment '用戶id',
  name        varchar(30)  null  comment '帖子名稱',
  topic       varchar(30)  null  comment '帖子關鍵詞',
  content     varchar(500) null  comment '帖子內容',
  create_time datetime     not null  comment '創建時間'
)  comment '測試表2';*/insert into article values(1,1, 'name_1', 'topic_1', 'content_1', '2019-01-01 00:00:00');
insert into user values(1,'user_1', '2019-01-01 00:00:00', '2019-03-01 12:00:00');

 

為了能模擬大查詢的情況,給每個表插入一些數據,user要有萬級數據量,article要有百萬級數據量,下面的sql每執行一次,數據量翻倍,謹慎執行!

set @i=1;
set @time=1;
insert into user(name, create_time, last_login_time)
select
       concat('user_',@i:=@i+1),
       date_add(create_time,interval +@time*cast(rand()*100 as signed) SECOND),
       null
from user;
select count(1) from user;

set @i=1;
set @time=1;
insert into article(user_id, name, topic, content, create_time)
select
       round(rand()*(select max(id) from user)),
       concat('name_',@i:=@i+1),
       concat('topic_',@i:=@i+1),
       concat('content_',@i:=@i+1),
       date_add(create_time,interval +@time*cast(rand()*100 as signed) SECOND)
from article;
select count(1) from article;

 

看下查詢的SQL語句

select sql_no_cache  * from user left join article on(user.id = article.user_id)
where  user.name like 'user_4%';

沒有使用緩存,user表的id是主鍵,article表除主鍵外沒有任何索引,這種情況下,百萬級數據查詢情況如下

sql> select sql_no_cache  * from user left join article on(user.id = article.user_id)
     where  user.name like 'user_4%'
[2020-05-17 13:24:45] 500 rows retrieved starting from 1 in 4 s 681 ms (execution: 1 s 312 ms, fetching: 3 s 369 ms)

 

給article表加個索引

CREATE INDEX user_id ON article (user_id);

 

再執行一下看下效果

sql> select sql_no_cache  * from user left join article on(user.id = article.user_id)
     where  user.name like 'user_4%'
[2020-05-17 13:27:22] 500 rows retrieved starting from 1 in 142 ms (execution: 112 ms, fetching: 30 ms)

 

可以看出,加了索引后,時間縮短了97%

結論:

A表與B表使用Join聯合查詢的時候,針對on里面的字段加與不加索引的效率(假設on的條件是A.id=B.aid):

1、兩個字段都不加索引,效率極低

2、A表的字段加了索引,B表的字段沒有加索引,效果同上

3、A表B表的字段都加了索引,效果很明顯

4、A表不加索引,B表加了索引,效果同上

 

參考:

資料一

資料二

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM