我想优化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) –