首頁 > 後端開發 > php教程 > mysql統計500w+的日表資料的解?

mysql統計500w+的日表資料的解?

WBOY
發布: 2016-08-18 09:15:56
原創
1367 人瀏覽過

<code>请教:
现在有每天的日表数据(一天生成一张), 每张表数据大概在500w左右。
需要从每天的日表数据中统计:根据appid统计ip数,同时ip需要去重。 
大概的sql是:</code>
登入後複製
登入後複製

select appid, count(distinct(ip)) from log0812_tb where iptype = 4 group by appid;

<code>然后将统计的appid 和 ip数,放入到另一张统计表中。 

1、直接执行sql的话,肯定超时了(系统仅配置了400ms读取时间)。
2、如果将数据都取出到内存中再做操作,内存又不足了,给的内存只有50M。。。(不为难程序员的需求不是好公司)
 
请问,还有优化的解决方案吗?
谢谢 </code>
登入後複製
登入後複製

回覆內容:

<code>请教:
现在有每天的日表数据(一天生成一张), 每张表数据大概在500w左右。
需要从每天的日表数据中统计:根据appid统计ip数,同时ip需要去重。 
大概的sql是:</code>
登入後複製
登入後複製

select appid, count(distinct(ip)) from log0812_tb where iptype = 4 group by appid;

<code>然后将统计的appid 和 ip数,放入到另一张统计表中。 

1、直接执行sql的话,肯定超时了(系统仅配置了400ms读取时间)。
2、如果将数据都取出到内存中再做操作,内存又不足了,给的内存只有50M。。。(不为难程序员的需求不是好公司)
 
请问,还有优化的解决方案吗?
谢谢 </code>
登入後複製
登入後複製

先說下表上可能的最佳化:

  1. 做一個組合索引(appid, ip)

  2. ip存整數,不要存字串

如果依然超時,那麼試著把資料讀到內存,但你的內存只有50M,那麼可以嘗試用HyperLogLog,消耗的內存是極小的,但統計出來的數據會略有偏差,2%左右

最後,這種日誌資料最好不要放sql,可以選擇一些nosql例如hbase, mongodb都能很好的完成你這個需求

@manong
謝謝,你說的這兩種最佳化方案都不錯。

我建了 typeid、appid、ip的聯合索引, 這樣這條語句時走索引查詢,沒回表,時間控制在了1.5s以下,有效果。

至於HyperLogLog演算法這種,我只是大概查了下,沒有去實踐用,不過也謝謝推薦哈。

我用的另外的方法處理:計劃任務去分批處理這500w+的數據, 兩次取的數據去重後,做array_diff比較出第二次不同的數據,再sum下得出總的count數。 這樣時間也可以控制在1s以下。 這裡有個技巧是將第一次比較的array轉換為string後存入array中, 第二次比較時再string轉array,會省很多內存,因為試了下,嵌套數組的話,要比長字符串value的數組耗記憶體。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板