![](/img/trans.png)
[英]What is best approach to creating SQL tables to easily query in the long run?
[英]What's my best approach re: creating calculated tables based on scraped data
我的vps上每天都有幾個Spider來抓取數據,並將數據存儲在MySQL中。
我需要基於來自各種數據源的數據構建一個非常復雜的時間序列模型。
在這里,我遇到了一個問題:
我需要根據我的抓取數據創建一個新的計算表。 該模型非常復雜,因為它涉及歷史原始數據和計算數據。 我打算編寫一個python腳本來執行此操作,但是效率似乎不夠。
然后,我意識到我可以在MySQL中創建一個視圖並以嵌套sql查詢的格式編寫模型。 就是說,我希望視圖能夠實現(MySQL現在不支持該視圖),並且可以在每天輸入新數據時刷新視圖。
我知道有一個名為flex ***的第三方插件,但我在網上搜索,安裝和維護似乎並不容易。
我最好的方法是什么?
謝謝您的幫助。
================================================== =======================
為了澄清起見,我制作的時間序列模型非常復雜,它涉及:
因此,它取決於原始數據和先前計算的數據。
時間戳記解決方案並不能真正解決問題的復雜性。
我只是不確定最好的方法。
拋開是否應該使用專用的時間序列工具(例如rrdtool或carbon) ,mysql提供了實現半實體化視圖所需的功能,例如,按日期合並的給定數據批處理:
SELECT DATE(event_time), SUM(number_of_events) AS events,
, SUM(metric) AS total
, SUM(metric)/SUM(number_of_events) AS average
FROM (
SELECT pc.date AS event_time, events AS number_of_events
, total AS metric
FROM pre_consolidated pc
UNION
SELECT rd.timestamp, 1
, rd.metric
FROM raw_data rd
WHERE rd.timestamp>@LAST_CONSOLIDATED_TIMESTAMP
)
GROUP BY DATE(event_time)
(請注意,盡管您可以將其創建為視圖並訪問它,但IME,MySQL並不是最擅長優化涉及視圖的查詢,並且使用與上述等效的模板作為構建查詢的模板可能會更好)
維護@LAST_CONSOLIDATED_TIMESTAMP准確記錄的最靈活的方法是在raw_data表中添加一個狀態列(以避免鎖定和使用事務以確保一致性),並在事件的時間戳上添加索引,然后定期:
UPDATE raw_data
SET state='PROCESSING'
WHERE timestamp>=@LAST_CONSOLIDATED_TIMESTAMP
AND state IS NULL;
INSERT INTO pre_consolidated (date, events, total)
SELECT DATE(rd.timestamp), COUNT(*), SUM(rd.metric)
FROM raw_data
WHERE timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state='PROCESSING'
GROUP BY DATE(rd.timestamp);
SELECT @NEXT_CONSOLIDATED_TIMESTAMP := MAX(timestamp)
FROM raw_data
WHERE timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state='PROCESSING';
UPDATE raw_data
SET state='CONSOLIDATED'
WHERE timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state='PROCESSING';
SELECT @LAST_CONSOLIDATED_TIMESTAMP := @NEXT_CONSOLIDATED_TIMESTAMP;
(您應該考慮一種在DBMS會話之間保留LAST_CONSOLIDATED_TIMESTAMP的方法)
因此,基本查詢(以允許多個事件具有相同的時間戳記)應為:
SELECT DATE(event_time), SUM(number_of_events) AS events,
, SUM(metric) AS total
, SUM(metric)/SUM(number_of_events) AS average
FROM (
SELECT pc.date AS event_time, events AS number_of_events
, total AS metric
FROM pre_consolidated pc
UNION
SELECT rd.timestamp, 1
, rd.metric
FROM raw_data rd
WHERE rd.timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state IS NULL
)
GROUP BY DATE(event_time)
只要您合理地頻繁應用合並,將狀態變量添加到時間戳索引可能會減慢更新的整體性能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.