我有一个非常大的图像数据库,我需要运行更新来增加图像上的视图计数。每小时都有超过一百万个唯一行要更新。现在,运行此查询大约需要一个小时才能让它运行得更快?
我正在创建一个内存表:
CREATE TABLE IF NOT EXISTS tmp_views_table (
key VARCHAR(7) NOT NULL,
views INT NOT NULL,
primary key ( `key` )
) ENGINE = MEMORY
然后我使用一个循环一次插入1000个视图,直到所有视图都插入到内存表中:
insert low_priority into tmp_views_table
values ('key', 'count'),('key', 'count'),('key', 'count'), etc...
然后我在实际的表上运行更新,如下所示:
update images, tmp_views_table
set images.views = images.views+tmp_views_table.views
where images.key = tmp_views_table.key
这个最后一次更新大约需要一个小时,内存表的运行速度非常快。
我可以通过更快的方式进行此更新吗?
答案 0 :(得分:1)
我想你在key
表的images
字段上有一个索引。您可以在内存表上没有索引的情况下尝试更新查询 - 在这种情况下,查询优化器应选择内存表的全表扫描。
我从未在UPDATE语句中使用过连接,因此我不知道它是否已被执行,但是JOIN可能需要太长时间。也许您可以发布该查询的EXPLAIN结果。
这是我在一个项目中用来做类似的事情 - 将实时数据插入/更新到临时表并将其合并到聚合表每天一次,所以可以尝试它是否会执行得更快。
INSERT INTO st_views_agg (pageid,pagetype,day,count) SELECT pageid,pagetype,DATE(`when`) AS day, COUNT(*) AS count FROM st_views_pending WHERE (pagetype=4) GROUP BY pageid,pagetype,day ON DUPLICATE KEY UPDATE count=count+VALUES(count);