为什么添加RAND()导致MySQL超载?

时间:2010-01-05 20:59:38

标签: sql mysql random sql-order-by

好的,我有这个查询,它给了我DISTINCT product_series,以及表中的所有其他字段:

SELECT  pi.*
FROM    (
        SELECT  DISTINCT product_series 
        FROM    cart_product 
        ) pd
JOIN    cart_product  pi
ON      pi.product_id =
        (
        SELECT  product_id
        FROM    cart_product po
        WHERE   product_brand = "everlon" 
                AND product_type = "'.$type.'" 
                AND product_available = "yes"
                AND product_price_contact = "no"
                AND product_series != ""
                AND po.product_series = pd.product_series
        ORDER BY product_price
        LIMIT 1
        ) ORDER BY product_price

这很好用。我也按价格订购,所以我可以得到每个系列的起始价格。好的。

然而今天我的老板告诉我,从这个查询中显示的所有产品都是metal_type 白金并且他想要显示随机金属类型。所以我在ORDER BY价格后面的订单中添加了RAND(),这样我仍然会得到最低的价格,但是价格最低的随机金属..这里是新的查询:

SELECT  pi.*
FROM    (
        SELECT  DISTINCT product_series 
        FROM    cart_product 
        ) pd
JOIN    cart_product  pi
ON      pi.product_id =
        (
        SELECT  product_id
        FROM    cart_product po
        WHERE   product_brand = "everlon" 
                AND product_type = "'.$type.'" 
                AND product_available = "yes"
                AND product_price_contact = "no"
                AND product_series != ""
                AND po.product_series = pd.product_series
        ORDER BY product_price, RAND()
        LIMIT 1
        ) ORDER BY product_price, RAND()

当我运行此查询时,MySQL完全关闭并告诉我连接太多我接到主机管理员打来的电话,问我到底做了什么。

我不相信可能只是从查询中添加了RAND(),我认为这必须是巧合。一切都修好后我等了几个小时再次运行查询。马上......同样的问题。

那是怎么回事?因为我不知道。我的查询有问题吗?

感谢!!!!

5 个答案:

答案 0 :(得分:1)

这是一篇博文,很好地解释了这个问题,并提供了解决方法:

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

这是针对MySQL ORDER BY RAND()的类似警告,我认为其原因基本相同:

http://www.webtrenches.com/post.cfm/avoid-rand-in-mysql

答案 1 :(得分:1)

ORDER BY使用RAND()不是一个好主意,因为它不会随着数据的增加而扩展。您可以在我对this question的回答中看到有关它的更多信息,包括您可以调整的两个备选方案。

答案 2 :(得分:0)

根据您网站中的产品数量,该功能调用将在每条记录中执行一次,这可能会大大降低查询速度..

Too Many Connections错误可能是由于此查询在尝试计算这些数字时阻止其他人。

找另一种方式。 ;)

答案 3 :(得分:0)

相反,您可以使用您正在使用的编程语言而不是MySQL端生成随机数,因为每行都会调用rand()

答案 4 :(得分:0)

如果您知道有多少记录,可以选择这样的随机记录(这是Perl):

$handle->Sql("SELECT COUNT(0) AS nor FROM table");
$handle->FetchRow();
$nor = $handle->Data('nor');
$rand = int(rand()*$nor)+1;
$handle->Sql("SELECT * FROM table LIMIT $rand,1");
$handle->FetchRow();
.
.
.