首先先建立兩個臨時表,並加一條基礎資料進去
createtable
user
( id
int auto_increment comment '
自增主鍵
'primary
key,
name
varchar(30) null comment '
使用者名稱',
create_time
datetime
notnull comment '
註冊時間',
last_login_time
datetime
null comment '
最後登入時間
') comment
'測試表';
create
table
article
( id
int auto_increment comment '
自增主鍵
'primary
key,
user_id
intnot
null comment '
使用者id',
name
varchar(30) null comment '
帖子名稱',
topic
varchar(30) null comment '',
content
varchar(500) null comment '
帖子內容',
create_time
datetime
notnull 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()*
100as
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()*
100as
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 from1in
4 s 681 ms (execution: 1 s 312 ms, fetching: 3 s 369 ms)
給article表加個索引
createindex
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 from1in
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表加了索引,效果同上
參考:資料一
資料二
mysql join連線查詢
hash join 雜湊連線 sort merge join 合併排序連線 join的連線方式的的選擇 阿里sql軍規 強制 超過三個表禁止join。需要join的字段,資料型別必須絕對一致 多表關聯查詢時,保證被關聯的字段需要有索引。說明 即使雙表join也要注意表索引,sql效能。nested ...
MySqljoin查詢筆記
一 內連線查詢 inner join 關鍵字 inner join on 語句 select from a table a inner join b table b on a.a id b.b id 說明 組合兩個表中的記錄,返回關聯字段相符的記錄,也就是返回兩個表的交集 陰影 部分。案例解釋 在b...
mysql的連表查詢 MySQL 連表查詢
連表查詢 連表查詢通常分為內連線和外連線。內連線就是使用inner join進行連表查詢 而外連線又分為三種連線方式,分別是左連線 left join 右連線 right join 全連線 full join 下來我們一起來看一下這幾種連線方式的區別及基礎用法。內連線inner join inner...