[請益] 資料庫join後count速度問題

看板Soft_Job (軟體人)作者 (hippo泡)時間10年前 (2016/05/08 16:47), 10年前編輯推噓18(18027)
留言45則, 18人參與, 最新討論串1/2 (看更多)
抱歉又來請益個資料庫問題m_ _m 需要join 500萬 跟 3萬筆的表格 根據篩選條件後再根據後者的欄位做count 但現在下完query後都會卡住 請問該如何是好 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.136.97.130 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1462697249.A.497.html

05/08 16:53, , 1F
弱弱問一下,資料庫有建立索引嗎
05/08 16:53, 1F

05/08 16:53, , 2F
05/08 16:53, 2F

05/08 17:03, , 3F
能不能搬到cloud上面 scale up?
05/08 17:03, 3F
目前沒有cloud能用。。 ※ 編輯: stevekevin10 (114.136.97.130), 05/08/2016 17:03:49

05/08 17:11, , 4F
可以先用小筆測試資料來估計 500萬join3萬會是幾筆嗎
05/08 17:11, 4F

05/08 17:11, , 5F
500萬的能先下條件縮小範圍??
05/08 17:11, 5F

05/08 17:13, , 6F
該用hash join 看看
05/08 17:13, 6F
好 我試試看以前沒用過m_ _m

05/08 17:34, , 7F
3萬筆的那張表 , 先篩過再來join?
05/08 17:34, 7F
是要join完後再篩@@

05/08 17:37, , 8F
以前用過兩張數百萬筆的資料做join 結果性能悲劇
05/08 17:37, 8F

05/08 17:37, , 9F
為了解決這個問題把整套db放到ram disk
05/08 17:37, 9F

05/08 17:38, , 10F
結果還是跑了一整天沒有結果
05/08 17:38, 10F

05/08 17:38, , 11F
調了db各種參數還是沒用
05/08 17:38, 11F
QQ ※ 編輯: stevekevin10 (114.136.97.130), 05/08/2016 17:41:11

05/08 17:40, , 12F
後來我就異想天開 想說分批查詢試試 就把兩張表的資料用LIMI
05/08 17:40, 12F

05/08 17:40, , 13F
T 先控制住範圍
05/08 17:40, 13F

05/08 17:41, , 14F
然後分幾次查詢 大概一次查詢只花了半分鐘
05/08 17:41, 14F

05/08 17:41, , 15F
當天幹了要死XD
05/08 17:41, 15F

05/08 17:42, , 16F
可以檢查是不是有開多線程搜尋?
05/08 17:42, 16F

05/08 17:56, , 17F
Union不同條件的select
05/08 17:56, 17F

05/08 17:59, , 18F
可以用explain看看
05/08 17:59, 18F

05/08 18:00, , 19F
還是想看看query 也許會變成500萬*3萬個再篩選的結果
05/08 18:00, 19F

05/08 18:18, , 20F
原本查詢長什麼樣子 為什麼一定要join完再篩@@
05/08 18:18, 20F

05/08 21:19, , 21F
問的太龍統了,簡單說就是先處理500萬,再join
05/08 21:19, 21F

05/08 21:20, , 22F
為什麼一定要先join才能查!?
05/08 21:20, 22F

05/08 21:23, , 23F
太籠統了 sql貼出來才知道
05/08 21:23, 23F

05/08 21:28, , 24F
我的作法是 都不join 單獨讀取出500萬放陣列 單獨讀取
05/08 21:28, 24F

05/08 21:30, , 25F
3萬筆 放陣列 用key當元素 馬上就可以指到你要的資料
05/08 21:30, 25F

05/08 21:33, , 26F
這樣總共讀取出503萬筆資料 大概幾分鐘就可以跑完
05/08 21:33, 26F

05/08 21:39, , 27F
join會有乘積效應 所以我基本上都不會用join都改用陣
05/08 21:39, 27F

05/08 21:39, , 28F
列處理
05/08 21:39, 28F

05/08 21:56, , 29F
我猜你的資料庫啟動後沒有把資料讀到記憶體內
05/08 21:56, 29F

05/08 21:56, , 30F
而是用硬碟在跑才會這麼慢 然後你建的索引
05/08 21:56, 30F

05/08 21:56, , 31F
跟你 join 的欄位有一樣嗎
05/08 21:56, 31F

05/08 21:56, , 32F
把 schema 跟 SQL 都放上來比較好判斷
05/08 21:56, 32F

05/08 21:56, , 33F
500萬 * 3萬正常應該不至於會卡住
05/08 21:56, 33F

05/08 22:13, , 34F
要看3萬對應出來有幾筆 如果對應出來有1000筆
05/08 22:13, 34F

05/08 22:14, , 35F
500萬 * 1000筆 = 50億 2000筆就 100億...
05/08 22:14, 35F

05/08 22:16, , 36F
大哉問 你這樣問從頭到尾都有東西可以講 等於沒講
05/08 22:16, 36F

05/08 22:29, , 37F
希望index的欄位有在查詢的欄位中XDD
05/08 22:29, 37F

05/09 09:11, , 38F
即便放到ram裡面,可以思考看看這樣的資源成本是否過
05/09 09:11, 38F

05/09 09:11, , 39F
05/09 09:11, 39F

05/09 09:13, , 40F
效能不是只有速度而已,資源耗用多少會影響整個系統的
05/09 09:13, 40F

05/09 09:13, , 41F
吞吐量,這也是需要去思考的議題
05/09 09:13, 41F

05/09 09:15, , 42F
蠻多使用join的情景,都可以拆分成數個simple select,
05/09 09:15, 42F

05/09 09:15, , 43F
資料量大的狀況下, 速度反而更快,且資源耗用量更小
05/09 09:15, 43F

05/09 13:34, , 44F
啟動時沒讀 搜尋後也是會存進去 只是先後順序而已
05/09 13:34, 44F

05/10 19:30, , 45F
05/10 19:30, 45F
文章代碼(AID): #1NBlqXIN (Soft_Job)
文章代碼(AID): #1NBlqXIN (Soft_Job)