执行MySql更新非常慢

时间:2013-05-10 15:16:27

标签: mysql performance sql-update

我有这个SQL:

UPDATE products pr
SET pr.product_model_id = (SELECT id FROM product_models pm WHERE pm.category_id = 1 ORDER BY rand() LIMIT 1)
  limit 200;

对于这200条记录,mysql-server花了15秒多的时间。在表格中有220,000条记录。

为什么会这样?

编辑:


我有这些表是空的,但我需要填写随机信息进行测试 真实的估计表明我会: 80类别
40,000型号 而且,大约有500,000种产品

所以,我手动创建了:

  • 所有类别。
  • 200个模型(并使用sql将它们复制到20k)。
  • 200件产品(并将其复制到250k)

我需要他们全部附上。
数据库表是:

categories {id, ...}
product_models {id, category_id, ...}
products {id, product_model_id, category_id}

2 个答案:

答案 0 :(得分:3)

虽然问题似乎有点奇怪,但这里是对问题的快速思考。

RAND 功能在大型数据集上效果不佳。

在mysql中,开发人员尝试以不同的方式实现这一点,请查看这些帖子:
How can i optimize MySQL's ORDER BY RAND() function?

http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

其中一个快速方法是(在php中):

    //get the total number of row 
    $result= mysql_query("SELECT count(*) as count 
    FROM product_models pm WHERE pm.category_id = 1 ");
    $row = mysql_fetch_array($result);
    $total=$row['count'];

    //create random value from 1 to the total of rows 
    $randomvalue =rand(1,$total);


    //get the random row

    $result= mysql_query("UPDATE products pr
    SET pr.product_model_id = 
    (SELECT id FROM product_models pm 
    WHERE pm.category_id = 1 
    LIMIT $randomvalue,1)
      limit 200");

希望这会有所帮助。

答案 1 :(得分:1)

'问题'是ORDER BY rand()