設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
查看: 3282|回復(fù): 6
打印 上一主題 下一主題

【MySQL】關(guān)于主從表分組合計需注意的事項

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2019-3-29 15:36:29 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
之前并沒特別留意MySQL的優(yōu)化問題,結(jié)果一不小心就翻車了,總結(jié)一下,供大家參考。
背景是這樣的:主表【crm_callout_job】大約150條記錄,明細(xì)表【crm_callout_task_his】約500萬記錄,一開始我就想當(dāng)然地寫了以下語句:
  1. select a.job_id,a.job_name,a.transfer_name,a.total_task_count,a.his_task_count,
  2. sum(case when b.callout_status=2 then 1 else 0 end) call_total from crm_callout_job a left join
  3. crm_callout_task_his b on a.job_id=b.job_id group by
  4. a.job_id,a.job_name,a.transfer_name,a.total_task_count,a.his_task_count
復(fù)制代碼

對于Access或者SQL server,一般來說,沒什么問題。但對MySQL來說,結(jié)果如下(不說了,看圖吧,事實上還沒跑完的。請原諒我的耐性比較差):

另外,不要以為把子查詢子句嵌套到字段中會帶給你驚喜。結(jié)果如下(同樣也沒跑完,不過我感覺兩者效率應(yīng)該不會差太大):

正確的做法也許可以參考這個:

總結(jié)如下:

1、不要使用子查詢把合計表插入到字段中。
2、不要直接使用“LEFT JOIN A ON A.ID=B.NEW_ID”。
3、應(yīng)該將明細(xì)表進(jìn)行合計,再與主表進(jìn)行關(guān)聯(lián)。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊

x
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 分享淘帖 訂閱訂閱
2#
發(fā)表于 2019-3-29 15:39:38 | 只看該作者
樓主總結(jié)到位,小白還在摸索,任重道遠(yuǎn)

點擊這里給我發(fā)消息

3#
發(fā)表于 2019-3-29 16:00:16 | 只看該作者
數(shù)據(jù)嵌套多子查詢就是噩夢,并不是MySQL的問題,SQLSERVER,access應(yīng)該是一樣的。

點擊這里給我發(fā)消息

4#
發(fā)表于 2019-3-29 16:05:32 | 只看該作者
感覺連接后分組字段多,的確是比分組后連接要慢很多。

點擊這里給我發(fā)消息

5#
發(fā)表于 2019-3-29 17:04:53 | 只看該作者
感謝分享!
回復(fù)

使用道具 舉報

6#
發(fā)表于 2019-5-15 13:55:41 | 只看該作者
我不喜歡子查詢,我情愿多做一個查詢,然后通過查詢連接查詢,這樣出錯也好排查。
7#
 樓主| 發(fā)表于 2019-5-18 17:46:38 | 只看該作者
accben 發(fā)表于 2019-5-15 13:55
我不喜歡子查詢,我情愿多做一個查詢,然后通過查詢連接查詢,這樣出錯也好排查。

MySQL、SQL server等和Access不一樣,不太方便寫查詢【對應(yīng)的名稱為“視圖”】,所以通常是一步到位的select(即便這樣不方便維護(hù))。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-17 06:07 , Processed in 0.125039 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表