我有这个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种产品
所以,我手动创建了:
我需要他们全部附上。
数据库表是:
categories {id, ...}
product_models {id, category_id, ...}
products {id, product_model_id, category_id}
答案 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()