使用另一个的count(*)值更新大表

时间:2013-08-30 11:24:33

标签: mysql

我有两张桌子。 Items有字段id,title,number。其他表(列表)中的相关字段(列表)是一个逗号分隔值,即来自项目的ID。我希望items.number与相关ID出现在列表中的次数相同。例如,此查询可以正常工作以实现此目的......

update items set number = (select count(*) from lists where list like concat('%',items.id,'%')) where title > 'Z'

但是,如果我想要更新整个项目(或者甚至只是以'Y'开头的标题,比如说,从Z开始只有200个以上),我会收到错误 - 要么'MySQL服务器已经离开'或'查询执行被中断'。我认为这是因为查询要求太高。如果没有服务器进行拆分,有没有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

嗯,糟糕的表现是你为设计不佳的数据结构付出的代价。这是您的查询:

update items
    set number = (select count(*)
                  from lists
                  where list like concat('%',items.id,'%')
                 )
     where title > 'Z';

list like语句建议您将项目ID存储为列表顺便提一下,您应该在语句中包含分隔符,这样就不会出现与匹配'10,11,12'匹配的不匹配:< / p>

where concat(',', list, ',') like concat('%,', items.id, ',%')

(假设逗号为分隔符)或:

where find_in_set(items.id, list) > 0;

那就是说,我想不出一种方法来加速这部分查询。正确的解决方案是拥有一个名为ListItems的关联表,每个列表和列表中的项目有一行。然后,您可以使用equi-joins和索引来加速查询。