MySQL join 連表查詢索引問題

2022-06-20 09:42:13 字數 3585 閱讀 8209

首先先建立兩個臨時表,並加一條基礎資料進去

create

table

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表加個索引

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 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...