欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

SQL關(guān)聯(lián)查詢直接join和子查詢的區(qū)別

運(yùn)營(yíng)組的同事最近提出一個(gè)需求,希望可以統(tǒng)計(jì)出用系統(tǒng)用戶及訂單情況,于是乎我們很想當(dāng)然的寫出了一個(gè)統(tǒng)計(jì)SQL,用戶表user和行程表直接join,并且針對(duì)行程做了group,但SQL執(zhí)行速度出奇的慢。

10年積累的成都網(wǎng)站建設(shè)、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有雜多免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

explain select  users.`mobile_num`, concat(users.`lastName` ,users.`firstName`) as userName, users.`company`,
  (case `users`.`idPhotoCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `idPhotoCheckStatus`,
  (case `users`.`driverLicenseCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `driverLicenseCheckStatus`,
  (case `users`.`companyCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `companyCheckStatus`,
  (case `users`.`unionCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `unionCheckStatus`,
  count(passenger_trip.id) as ptrip_num
from users
left join passenger_trip on passenger_trip.userId = users.id  and passenger_trip.status != 'cancel'
left join driver_trip on driver_trip.`userId`=users.`id` and driver_trip.`status` != 'cancel'
where company != '本公司名' and company != '本公司昵稱'

當(dāng)時(shí)的第一反應(yīng)是數(shù)據(jù)庫(kù)掛住了,因?yàn)橛脩舯淼臄?shù)據(jù)量10W左右,行程表的數(shù)據(jù)也是10W左右,不可能這么慢!通過(guò)explain查看分析計(jì)劃,并且查看過(guò)關(guān)聯(lián)字段的索引情況,發(fā)現(xiàn)這是一個(gè)最常見的關(guān)聯(lián)查詢,當(dāng)然是通過(guò)join實(shí)現(xiàn)。

SQL關(guān)聯(lián)查詢  直接join 和子查詢的區(qū)別

轉(zhuǎn)而一想,10W*10W,經(jīng)過(guò)笛卡爾集之后,這不是百億級(jí)的數(shù)據(jù)篩選嗎?!于是換了一種寫法進(jìn)行嘗試。

explain select  users.`mobile_num`, concat(users.`lastName` ,users.`firstName`) as userName, users.`company`,
  (case `users`.`idPhotoCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `idPhotoCheckStatus`,
  (case `users`.`driverLicenseCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `driverLicenseCheckStatus`,
  (case `users`.`companyCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `companyCheckStatus`,
  (case `users`.`unionCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `unionCheckStatus`,
  (select count(passenger_trip.id) from  passenger_trip where  passenger_trip.userId = users.id  and passenger_trip.status != 'cancel') as ptrip_num,
  (select count(driver_trip.id) from  driver_trip where  driver_trip.userId = users.id  and driver_trip.status != 'cancel') as dtrip_num
from users
where company != '本公司名' and company != '公司昵稱'

這樣的效果居然比直接join快了N倍,執(zhí)行速度從未知到10秒內(nèi)返回,查看執(zhí)行計(jì)劃:

SQL關(guān)聯(lián)查詢  直接join 和子查詢的區(qū)別

進(jìn)一步調(diào)整SQL進(jìn)行嘗試:

explain select  users.`mobile_num`, concat(users.`lastName` ,users.`firstName`) as userName, users.`company`,
  (case `users`.`idPhotoCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `idPhotoCheckStatus`,
  (case `users`.`driverLicenseCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `driverLicenseCheckStatus`,
  (case `users`.`companyCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `companyCheckStatus`,
  (case `users`.`unionCheckStatus` when '2' then '已認(rèn)證' when '3' then '已駁回' else '待認(rèn)證' end) as `unionCheckStatus`,
 ptrip_num, dtrip_num
from users 
 left  join 
 (select count(passenger_trip.id)  as ptrip_num, passenger_trip.`userId` from  passenger_trip where  passenger_trip.status != 'cancel' group by passenger_trip.`userId` ) as ptrip
 on ptrip.userId = users.id
 left join 
 (select count(driver_trip.id)  as dtrip_num, driver_trip.`userId` from  driver_trip where  driver_trip.status != 'cancel' group by driver_trip.`userId` ) as dtrip
 on dtrip.userId = users.id
where company != '本公司名' and company != '公司昵稱'

居然5秒內(nèi)返回,這才是正常的預(yù)期,10W級(jí)的數(shù)據(jù)篩選,應(yīng)該是幾秒內(nèi)返回的!

SQL關(guān)聯(lián)查詢  直接join 和子查詢的區(qū)別

出現(xiàn)這種差別的原因,其實(shí)很簡(jiǎn)單,SQL語(yǔ)句執(zhí)行的時(shí)候是有一定順序的。

  1. from先選擇一個(gè)表,構(gòu)成一個(gè)結(jié)果集。
  2. where對(duì)結(jié)果集進(jìn)行篩選,篩選出需要的信息形成新的結(jié)果集。
  3. group by對(duì)新的結(jié)果集分組。
  4. having篩選出想要的分組。
  5. select選擇列。
  6. order by當(dāng)所有的條件都弄完了。最后排序。

第一種寫法,直接join的結(jié)果,就是在100億條數(shù)據(jù)中進(jìn)行篩選;
后面兩種則是優(yōu)先執(zhí)行子查詢,完成10W級(jí)別的查詢,再進(jìn)行一次主表10W級(jí)的關(guān)聯(lián)查詢,所以數(shù)量級(jí)明顯少于第一種寫法。

文章名稱:SQL關(guān)聯(lián)查詢直接join和子查詢的區(qū)別
URL網(wǎng)址:http://www.chinadenli.net/article12/pidjgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站面包屑導(dǎo)航服務(wù)器托管營(yíng)銷型網(wǎng)站建設(shè)外貿(mào)網(wǎng)站建設(shè)網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)