台灣最大程式設計社群網站
線上人數
1587
 
會員總數:246083
討論主題:189658
歡迎您免費加入會員
討論區列表 >> PHP >> 資料統計 的製作方向
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
資料統計 的製作方向
價值 : 20 QP  點閱數:663 回應數:11
樓主

阿綠
初學者
2 7
165 17
發送站內信

想請問有經驗的大大們 我在製作一個數量統計的網頁 使用者會輸入數量
PHP + mysql
例如
使用者A 綠茶 100罐 1000元
使用者A 紅茶 50 罐 5000元
使用者c 綠茶 10 罐 100元
使用者d 咖啡 1 罐 50元


我現在的方法 適用SUM去找出 紅茶然後加總得到 綠茶 110罐 1100
但這樣資料一多就跑得好慢

所以想請問 這樣的方式有沒有問題 還是我需要再多做一個統計的欄位
例如 使用者A 輸入 綠茶 就把綠茶的數字抓出來 (原本的數量+使用者A輸入的數量)再存回去

但這樣 如果有人同時間數入 數量就有問題了

想請問這類型的 程式 製作方向 謝謝大大們

本篇文章發表於2014-02-27 10:38
1樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
很慢?
我先問一下
你的資料庫表單中有沒有主鍵欄位
例如流水編號的ID
本篇文章回覆於2014-02-27 14:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

阿綠
檢舉此回應
回 迷路大 有的是MYsql 自己配發的 不會重複的那個
本篇文章回覆於2014-02-27 16:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

迷路
捐贈 VP 給 迷路 檢舉此回應
有主鍵還很慢?
你的資料總筆數有多少
還有
你是一次跑一個品項的統計值
還是一次跑全部品項的統計值
如果是後者的話
可能要用子查詢來優化查詢式
Google的搜尋下關鍵字「SQL 子查詢」
在稍微複雜的資料庫操作中非常有用的技術
本篇文章回覆於2014-02-27 18:24
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

阿綠
檢舉此回應
回迷路大大

大概5萬筆資料 還會增加中 我一次大概會跑20-30個品項

AJAX LOAD 都跑好久出不來 ><

謝謝大大給的方向 來去研究一下

本篇文章回覆於2014-02-27 18:28
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
不錯的參考

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
你可以將你的sql碼寫出來。

我猜測你是用like的方式將資料統計。
這樣會造成全表搜尋。自然就會很慢

另外數值的+-。千萬不要用select後再update。
請直接下更新就好了 其set的語法用 num = num +1
這樣不管任何人同時操作的情況下。都不會有誤差值出現。

先確定你的表規劃。一般來說。如你上面的情況。
我會分成

使用者(user)|物品名稱(item)|數量(num)|金額(money)
並將使用者跟物品名稱加上索引
本篇文章回覆於2014-03-01 16:21
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

迷路
捐贈 VP 給 迷路 檢舉此回應
用AJAX啊
如果是學校作業或是自己學習研究上的問題
那就趁這個機會好好研究SQL優化
如果是工作上的問題
給個簡單化的處理建議
不要一次性跑20-30個品項
用迴圈分20-30次跑,1次跑1個品項
這樣可以縮減單次的時間,而且畫面也能一直有資料出來,不會讓使用者懷疑是當掉還是在跑
而且只跑1個品項就不需要用到group by只要用where就可以,SQL的處理會快一點點
本篇文章回覆於2014-03-03 10:14
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

阿綠
檢舉此回應
SORRY 這幾天不在家 這麼慢才回

感謝兩位大大的建議和教導 我還是研究一下SQL的優化方面 我把他想得太簡單了

看來是我的 SQL方面寫得太鳥了導致效率變低 因為一開始資料不多速度很快 但沒想到後來問題慢慢浮現 ><



想請問 星空大大 為什麼要建議 "使用者" 也加上索引



回 迷路大大 這應該算是個人的研究吧 小弟只有略懂略懂 PHP+SQL

剛好有機會應用在我的工作中 我就借機會練習 group by 我有用到 我會試者 用迴圈跑跑看

謝謝兩位大大的 教導 ^^
本篇文章回覆於2014-03-03 10:38
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
在你這個問題上。使用者是不需要加索引是沒錯。

但在正規統計來說。也有可能會需要用使用者來當條件。

正常來說。有重覆性的值且也可能會拿來當條件的欄位。我都會加上索引。
而且,盡量使用數值型的欄位。

但是加索引也是一門學問。
因為索引加的多,的確會有機會去增加你的搜尋速度。(注意!我只說有機會)
但也會連帶影響空間的使用跟寫入的時間變慢。

告訴你一些簡單的檢核方式。

你可以去看看sql命令下達時的運作資源。
一般來說,不太複雜的。都不會去產生暫存檔。
但如果你發現這個命令會去產生暫存檔的情況下。就得去查看是否有哪邊索引沒處理。
如要下達group這類的東西。一般最好用子表的模式。先將要的資料where出來後再來做group。

畢竟使用group的情況下,大多會重建暫存檔處理。

我就曾經碰上客戶,因為不會維修資料庫。把索引檔搞掛掉。還好資料還可以還原回來。但索引需要重建。
但那時那位客戶不知道索引設定消失了。偏偏他們又是那種百萬級的資料。
一運行起來,差點把機器搞掛。且也超慢的。
後來我才幫他處理好的。
本篇文章回覆於2014-03-04 00:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

阿綠
檢舉此回應
回 星空大大 沒錯我有用到好幾個 group order 我想這應該是我資料會慢的原因了
迷路大大有給我 "子查詢"這關鍵 正在研究
看來我把sql想得太簡單了 優化才是重點

謝謝您的指導 ^^
本篇文章回覆於2014-03-04 12:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

阿綠
檢舉此回應
對了星空大大 下面這段的意思是

另外數值的+-。千萬不要用select後再update。
請直接下更新就好了 其set的語法用 num = num +1

我找不到關鍵字 > .<

sql 的部分經過努力 速度 天差地遠啊 哈哈 大大們的建議果然有用 再次感謝

本篇文章回覆於2014-03-04 17:34
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
那個沒什麼關鍵字。只是一種活用的方法。
一般初約者很常用的方式就是先將數值給取出來後再+1再寫進去。

這樣如果是一個人測試的話。是沒什麼大問題的。
可是你這是要上線給多人使用。難保不會碰上同一時間內會有兩個以上的人取出數值。
這時後你再更新進去。就會發生數值錯誤的問題。

我用範例來說明好了。
你目前的資料庫數值是5
但甲取出這個5值後,加一筆 會變成6
但在同一時間內乙也取到5。所以他加1筆也是變成了6

但實際上你的數值因該是要加2變成7才對的。這樣就會發生數值錯誤的問題。
如更多人的情況下,這樣的問題會更明顯。

但如果是用
update db set num=num+1 的語法的情況下。
就不用擔心這些誤差的問題。
本篇文章回覆於2014-03-05 03:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

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