一對多的兩張表,一般是一張表的外來鍵關聯到另乙個表的主鍵。但也有不一般的情況,也就是兩個表並非通過其中乙個表的主鍵關聯。
例如:[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資料庫伺服器的引數調...