0

我有这个 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 秒。在 tablem 中有 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}
4

2 回答 2

3

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

RAND函数在大型数据集上表现不佳。

在 mysql 中,开发人员尝试以不同的方式实现这一点,查看这些帖子:
我如何优化 MySQL 的 ORDER BY RAND() 函数?

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");

希望这会有所帮助。

于 2013-05-10T16:07:35.543 回答
1

“问题”是 ORDER BY rand()

于 2013-05-10T15:21:08.813 回答