Mysql

優化表和查詢,按日期或日期-小時聚合

  • January 28, 2014

我有一個表格,用於儲存來自不同站點的站點的感測器數據(目前為 1 億行)。就我而言,站點可能有很多站點。創建表語句如下:

CREATE TABLE sensor_data (
site INT NOT NULL,
station INT NOT NULL,
time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
reading1 FLOAT DEFAULT NULL,
reading2 FLOAT DEFAULT NULL,
reading3 FLOAT DEFAULT NULL,
reading4 FLOAT DEFAULT NULL,
reading5 FLOAT DEFAULT NULL,
reading6 FLOAT DEFAULT NULL,
reading7 FLOAT DEFAULT NULL,
reading8 FLOAT DEFAULT NULL,
reading9 FLOAT DEFAULT NULL,
reading10 FLOAT DEFAULT NULL,
reading11 FLOAT DEFAULT NULL,
reading12 FLOAT DEFAULT NULL,
reading13 FLOAT DEFAULT NULL,
reading14 FLOAT DEFAULT NULL,
reading15 FLOAT DEFAULT NULL,
reading16 FLOAT DEFAULT NULL,
reading17 FLOAT DEFAULT NULL,
reading18 FLOAT DEFAULT NULL,
reading19 FLOAT DEFAULT NULL,
reading20 FLOAT DEFAULT NULL,
KEY Index_sst (site, station, time)
) ENGINE=InnoDB;

我需要查詢使用者定義的時間間隔內按天或天小時聚合的特定站點的讀數。查詢如下:

查詢 1

SELECT AVG(reading1), DATE_FORMAT(time, '%Y-%m-%d 00:00:00') AS daily 
FROM sensor_data
WHERE site=1 AND station=1 AND time>='2010-00-00 00:00:00' 
GROUP BY daily 
ORDER BY daily;

查詢 2

SELECT AVG(reading1), DATE_FORMAT(time, '%Y-%m-%d %H:00:00') AS hourly
FROM sensor_data
WHERE site=1 AND station=1 AND time>='2010-00-00 00:00:00' 
GROUP BY hourly
ORDER BY hourly;

這些查詢不使用索引,而是使用臨時表和文件排序。

我應該如何擺脫這些查詢的長執行時間?添加單獨的日期列和索引 site-station-date 似乎可以改進Query 1,但不知道Query 2。我想知道在這種情況下最佳方式如何。

SQL小提琴

創建一個新列,用daily值更新它,然後將此列添加到索引中。這是一個範例。這只是為了消除無法使用索引的列上函式的情況。請耐心等待,在 100 M 行上需要一段時間。

SQL小提琴

引用自:https://dba.stackexchange.com/questions/57708