MySQL查詢優化 用子查詢代替非主鍵連線查詢

2021-07-04 11:28:39 字數 2367 閱讀 2537

一對多的兩張表,一般是一張表的外來鍵關聯到另乙個表的主鍵。但也有不一般的情況,也就是兩個表並非通過其中乙個表的主鍵關聯。

例如:[sql]view plain

copy

create

table

t_team  

(  tid int

primary

key,  

tname varchar

(100)  

);  

create

table

t_people  

(  pid int

primary

key,  

pname varchar

(100),  

team_name varchar

(100)  

);  

team表和people表是一對多的關係,team的tname是唯一的,people的pname也是唯一的,people表中外鍵team_name和team表的tname關聯,並不是和主鍵id關聯。

(ps:先不說這樣的設計合不合理,但如果真的攤上這事兒…..很多表的設計是每個表有乙個id和uuid,id作為主鍵,uuid作關聯,和上面情況類似)

現在要查詢pname是"xxg"的people和team資訊:

select * from t_team t,t_people p where t.tname=p.team_name and p.pname='xxg' limit 1;

或select * from t_team t inner join t_people p on t.tname=p.team_name where p.pname='xxg' limit 1;

執行一下,可以查詢出結果,但是如果資料量大的情況下,效率很低,執行很慢。

對於這種連線查詢,用子查詢來代替,查詢結果相同,但會效率更高:

select * from (select * from t_people where pname='xxg' limit 1) p, t_team t where t.tname=p.team_name limit 1;

子查詢中過濾了大量的資料(僅保留一條),再將結果來連線查詢,效率會大大提高。

(ps:另外,使用limit 1也可以提高查詢效率,詳細: )

本人通過3條sql測試兩種查詢方式的效率:

準備1萬條team資料,準備100萬條people資料。

造資料的儲存過程:

[sql]view plain

copy

begin

declare

i int

;  start transaction

;  set

i=0;  

while i<10000 do  

insert

into

t_team 

values

(i+1,concat(

'team'

,i+1));  

seti=i+1;  

endwhile;  

seti=0;  

while i<1000000 do  

insert

into

t_people 

values

(i+1,concat(

'people'

,i+1),concat(

'team'

,i%10000+1));  

seti=i+1;  

endwhile;  

commit

;  end

sql語句執行效率:

連線查詢

select * from t_team t,t_people p where t.tname=p.team_nameand p.pname='people20000' limit 1;

time:12.594 s

連線查詢

select * from t_team t inner join t_peoplep on t.tname=p.team_name where p.pname='people20000' limit 1;

time:12.360 s

子查詢select * from (select * from t_people wherepname='people20000' limit 1) p, t_team t where t.tname=p.team_name limit 1;

time:0.016 s

SQL優化 使用關聯查詢代替子查詢

sql優化 使用關聯查詢代替子查詢 測試例子 子查詢 selecta.select workflowname from workflowbase whereid workflowid workflowname from zping.com a where a.operator 402882ed111...

Mysql採用子查詢優化查詢語句,提高查詢效率

摘要 mysql的優化方式有很多,這裡我先介紹一種,就是在使用連線查詢中的優化。案例 比如我要查詢100萬條資料中id小於100的資料,a表和b表有相同的字段id,那麼id就可以成為連線查詢的條件。如下所示 select from a join b on a.id b.id where id 100...

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...