MySQL查询优化大表

时间:2012-01-05 18:34:19

标签: mysql optimization query-optimization

我有一个非常大的图像数据库,我需要运行更新来增加图像上的视图计数。每小时都有超过一百万个唯一行要更新。现在,运行此查询大约需要一个小时才能让它运行得更快?

我正在创建一个内存表:

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

这个最后一次更新大约需要一个小时,内存表的运行速度非常快。

我可以通过更快的方式进行此更新吗?

1 个答案:

答案 0 :(得分:1)

你正在使用Innodb,对吗?尝试对mysql和innodb引擎进行一般调整,以便更快地更改数据。

我想你在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);