2016-09-21 94 views
1

我有此UPDATE查询改变的记录的状态(状态= 1)在videos表对于具有的10个记录在thumbnail表计数,其中thubmnails.status为1所有id_videoUPDATE查询是很慢的

由于缩略图表的大尺寸,查询的工作原理非常缓慢。有关如何提高查询速度的任何建议?

UPDATE videos 
SET videos.status = 1 
WHERE videos.id_video IN (SELECT thumbnails.id_video 
          FROM thumbnails 
          WHERE thumbnails.status = 1 
          GROUP BY thumbnails.id_video 
          HAVING Count(thumbnails.id_thumbnail) = 10) 
     AND videos.status = 2; 

索引对于id_video设置两个表中& id_thumbnail的缩略图表。并且还索引status列。

+1

如何在'thumbnails.status'和'videos.status'上添加索引 –

+0

如果这不起作用,请将“explain select ...”的输出与表定义一起添加到您的问题中。 –

+0

对不起,我忘了提及,有'thumbnails.status'和'videos.status'上的索引。更新后。 – user2980769

回答

1

我通过使查询更加去除IN子句简单

UPDATE videos v 
SET v.status = 1 
WHERE v.status = 2 AND (
    SELECT COUNT(t.id_thumbnail) 
    FROM thumbnails t 
    WHERE t.id_video = v.id_video AND t.status = 1 
) = 10; 

视频v记录当它们具有状态2并且比它们具有10个缩略图t并且具有视频标识为v和状态1时更新。

0

什么如果转换IN第一个JOIN条件像

UPDATE videos v 
JOIN (SELECT thumbnails.id_video 
          FROM thumbnails 
          WHERE thumbnails.status = 1 
          GROUP BY thumbnails.id_video 
          HAVING Count(thumbnails.id_thumbnail) = 10) xxx 
ON v.id_video = xxx.id_video 
SET v.status = 1 
WHERE v.status = 2; 
0

您也可以尝试使用exists代替IN:

UPDATE videos 
SET videos.status = 1 
WHERE videos.status = 2 
AND EXISTS (SELECT thumbnails.id_video 
      FROM thumbnails 
      WHERE thumbnails.status = 1 
      GROUP BY thumbnails.id_video 
      HAVING Count(thumbnails.id_thumbnail) = 10 
      AND thumbnails.id_video = videos.id_video);