我想優化MySQL查詢。我正在嘗試使用每15分鐘針對特定商店的物品價格的移動平均值更新表格列。優化MySQL查詢 - 使用索引
我的表具有下面的結構
╔═════╦═════════════════════╦════════════╦══════╦════════════════╗
║ ID ║ DATETIME ║ NAME ║Price ║ 15_MIN_AVERAGE ║
╠═════╬═════════════════════╬════════════╬══════╬════════════════╣
║ 1 ║ 2000-01-01 00:00:05 ║ WALMART ║ 1 ║ ║
║ 2 ║ 2000-01-01 00:00:05 ║ BESTBUY ║ 6 ║ ║
║ 3 ║ 2000-01-01 00:00:05 ║ RADIOSHACK ║ 2 ║ ║
║ 4 ║ 2000-01-01 00:00:10 ║ WALMART ║ 6 ║ ║
║ 5 ║ 2000-01-01 00:00:10 ║ BESTBUY ║ 2 ║ ║
║ 6 ║ 2000-01-01 00:00:10 ║ RADIOSHACK ║ 8 ║ ║
║ 7 ║ 2000-01-01 00:00:15 ║ WALMART ║ 10 ║ ║
║ 8 ║ 2000-01-01 00:00:15 ║ BESTBUY ║ 2 ║ ║
║ 9 ║ 2000-01-01 00:00:15 ║ RADIOSHACK ║ 3 ║ ║
║ 10 ║ 2000-01-01 00:00:20 ║ WALMART ║ 6 ║ ║
║ 11 ║ 2000-01-01 00:00:20 ║ BESTBUY ║ 4 ║ ║
║ 12 ║ 2000-01-01 00:00:20 ║ RADIOSHACK ║ 5 ║ ║
║ 13 ║ 2000-01-01 00:00:25 ║ WALMART ║ 1 ║ ║
║ 14 ║ 2000-01-01 00:00:25 ║ BESTBUY ║ 0 ║ ║
║ 15 ║ 2000-01-01 00:00:25 ║ RADIOSHACK ║ 5 ║ ║
║ 16 ║ 2000-01-01 00:00:30 ║ WALMART ║ 1 ║ ║
║ 17 ║ 2000-01-01 00:00:30 ║ BESTBUY ║ 6 ║ ║
║ 18 ║ 2000-01-01 00:00:30 ║ RADIOSHACK ║ 2 ║ ║
║ 19 ║ 2000-01-01 00:00:35 ║ WALMART ║ 6 ║ ║
║ 20 ║ 2000-01-01 00:00:35 ║ BESTBUY ║ 2 ║ ║
║ 21 ║ 2000-01-01 00:00:35 ║ RADIOSHACK ║ 8 ║ ║
║ 22 ║ 2000-01-01 00:00:40 ║ WALMART ║ 10 ║ ║
║ 23 ║ 2000-01-01 00:00:40 ║ BESTBUY ║ 2 ║ ║
║ 24 ║ 2000-01-01 00:00:40 ║ RADIOSHACK ║ 3 ║ ║
║ 25 ║ 2000-01-01 00:00:45 ║ WALMART ║ 6 ║ ║
║ 26 ║ 2000-01-01 00:00:45 ║ BESTBUY ║ 4 ║ ║
║ 27 ║ 2000-01-01 00:00:45 ║ RADIOSHACK ║ 5 ║ ║
║ 28 ║ 2000-01-01 00:00:48 ║ WALMART ║ 1 ║ ║
║ 29 ║ 2000-01-01 00:00:48 ║ BESTBUY ║ 0 ║ ║
║ 30 ║ 2000-01-01 00:00:48 ║ RADIOSHACK ║ 5 ║ ║
║ 31 ║ 2000-01-01 00:00:50 ║ WALMART ║ 6 ║ ║
║ 32 ║ 2000-01-01 00:00:50 ║ BESTBUY ║ 4 ║ ║
║ 33 ║ 2000-01-01 00:00:50 ║ RADIOSHACK ║ 5 ║ ║
║ 34 ║ 2000-01-01 00:00:55 ║ WALMART ║ 1 ║ ║
║ 35 ║ 2000-01-01 00:00:55 ║ BESTBUY ║ 0 ║ ║
║ 36 ║ 2000-01-01 00:00:55 ║ RADIOSHACK ║ 5 ║ ║
║ 37 ║ 2000-01-01 00:01:00 ║ WALMART ║ 1 ║ ║
║ 38 ║ 2000-01-01 00:01:00 ║ BESTBUY ║ 0 ║ ║
║ 39 ║ 2000-01-01 00:01:00 ║ RADIOSHACK ║ 5 ║ ║
╚═════╩═════════════════════╩════════════╩══════╩════════════════╝
我的查詢是:
UPDATE my_table AS t
INNER JOIN
(select ID,
(select avg(price) from my_table as t2
where
t2.datetime between subtime(t1.datetime, '00:14:59') and t1.datetime AND
t2.name = t1.name
) as average
from my_table as t1
where
minute(datetime) in (0,15,30,45)) as sel
ON t.ID = sel.ID
SET 15_MIN_AVERAGE = average
我對柱DATETIME(這是類型DATETIME的)的指標,但我想使用的功能,例如因爲where子句中的minute()和subtime()基本上使索引無效。
我的表有大約160萬條記錄(大約一個記錄每5分鐘)。目前,運行此查詢需要很長時間(超過一個小時),這是不可接受的。
你有什麼建議來優化呢?
非常感謝!
嗯,你是對的索引。 MySQL索引[** TIPS **](http://mysql.rjweb.org/doc.php/index_cookbook_mysql) –