台灣最大程式設計社群網站
線上人數
1167
 
會員總數:241117
討論主題:186792
歡迎您免費加入會員
討論區列表 >> MySQL >> 資料庫要跑很久
[ 變換順序 ]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
資料庫要跑很久
價值 : 20 QP  點閱數:501 回應數:30

樓主

Sanji
門外漢
0 23
335 62
發送站內信

我有兩個資料表 in30 和 in20
兩個資料表裡面的資料加起來不到40000筆
為什麼以下的語法會要跑到20幾分鐘
我把兩個資料分開去執行
就跑很快
是關聯的原因嗎?


搜尋相關Tags的文章: [ SQL ] , [ 資料庫phpmyadmin ] ,
本篇文章發表於2017-09-23 17:46
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小魚
檢舉此回應
可以試試看
1.不要篩選.*,把欄位一個一個列出來
2.不要用FROM IN30 a, IN20 b,改成用 FROM IN30 a INNER JOIN IN20 b ON a.uid = b.uid WHERE b.data_sts = 'Y' ... ...
本篇文章回覆於2017-09-23 19:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

Sanji
檢舉此回應
可是我改了之後 我連跑一個資料欄也要跑到2分鐘


本篇文章回覆於2017-09-24 00:39
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

Sanji
檢舉此回應
目前的狀況
我可以顯示出第一頁(也就是20筆資料)
也算的出總資料數
但是我只要換到下一頁 就一片空白
這不曉得是哪裡出了問題
本篇文章回覆於2017-09-24 01:00
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小魚
檢舉此回應
1.我沒有這樣使用過GROUP BY,我猜也許是GROUP BY的問題
2.會一片空白應該是你SQL語法的問題,你要去攔截你的SQL語法,看看哪個地方有問題
SQL相關語法可以參考 這一篇
本篇文章回覆於2017-09-24 08:08
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

小魚
檢舉此回應
我用類似的語法跑起來是還蠻快的,
不過可能是我資料量比較少的關係吧...
本篇文章回覆於2017-09-24 08:13
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
回應

小魚
檢舉此回應
話說回來,
2分鐘比20幾分鐘好多了吧,
你再加上後面的語法試試看,
有LIMIT應該會比較快
本篇文章回覆於2017-09-24 08:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

Sanji
檢舉此回應
我改了group by
現在變成1分半就可跑完
而且也跑的出來第二頁只是要等比較久(大概10秒左右)
但是第三頁跟之前第二頁一樣
是一片空白
還有辦法再讓它跑更快嗎
本篇文章回覆於2017-09-24 14:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

小魚
檢舉此回應
結果你的全部的語法是什麼?
跑1,2分鐘感覺還是有點慢。
本篇文章回覆於2017-09-24 17:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

Sanji
檢舉此回應
主要要跑很久的語法就是兩個
一個是

還有一個是


以下是用explain 觀察的 這兩行語法各跑一樣的行數
其中b table跑了12324行
a table跑了22908行

本篇文章回覆於2017-09-24 23:33
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

Sanji
檢舉此回應
補充一下
第一個語法是在跑所有的資料
第二個語法是跑要顯示在目前網頁上的資料
本篇文章回覆於2017-09-24 23:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
作者回應

Sanji
檢舉此回應
還有我發現
它每一頁都要跑一段時間
當我重新再進來的時候
便跑很快
感覺很像跟buffer之類有關?
本篇文章回覆於2017-09-24 23:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
回應

小魚
檢舉此回應
每行都跑一定會比較慢的,
不過有什麼理由一定要全部跑完呢?
通常是不會這樣做的。

我不知道這樣group by 的意義為何,
其他欄位的資料會不一樣嗎,
還是針對同樣b.invoice_id的其他欄位資料都會一樣?

SQL會將有用過的SQL語法暫存在記憶體,
如果又呼叫了會馬上從記憶體撈資料,
所以速度會變快很多。
本篇文章回覆於2017-09-25 00:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
作者回應

Sanji
檢舉此回應
因為in20是屬於主檔 而in30是屬於明細檔的部分
所以如果不用group by 的話
會找到很多筆重複的uid
本篇文章回覆於2017-09-25 02:50
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
回應

小魚
檢舉此回應
既然是明細為什麼只列出一筆,
還是你要的是最新的那一筆?
本篇文章回覆於2017-09-25 08:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
作者回應

Sanji
檢舉此回應
我是要印出主檔
明細的部分可以藉由點擊主檔
進入到另一個PHP檔
看到該檔的明細
本篇文章回覆於2017-09-25 11:58
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
[ 變換順序 ]   

回覆
如要回應,請先登入.