MySQL中查询时间慢

时间:2014-11-12 21:46:03

标签: mysql

以下查询正在重载我的系统。这似乎是rand()的一个问题。我已经看到其他帖子处理类似的问题,但不能让他们解决这个问题。它正在10M +行表上运行。我知道rand()的顺序是问题,但在阅读之后,似乎存在自动增量(items.ID)增加2而不是1的问题。

SELECT stores.phone, stores.storeID, stores.name, stores.ZIP,
       stores.state,stores.city, storeID, GEOCODES.lon, GEOCODES.lat
FROM items
LEFT JOIN stores on stores.storeID = items.store_ID
LEFT JOIN GEOCODES on GEOCODES.address = CONCAT(stores.address1,', ',stores.ZIP)
WHERE stores.phone IS NOT NULL
GROUP BY items.store_ID
ORDER BY RAND( ) 
LIMIT 200

我试图关注的另一篇文章是How can i optimize MySQL's ORDER BY RAND() function?,但似乎无法弄清楚如何使其适应此查询。请注意,这是用PHP完成的。

2 个答案:

答案 0 :(得分:0)

在查询中使用RAND()具有严重的性能影响,避免它会大大加快您的查询速度。

此外,由于你使用的是php,使用shuffle() w / php随机排序可能是一个明显更快的替代mysql。

请参阅:http://php.net/manual/en/function.shuffle.php

答案 1 :(得分:0)

如果我是你,我会首先限制,然后在有限的查询上ORDER BY RAND()那样你就不会把所有内容都拉出来并随机化它...我已经用这个确切的方法来指数地加速我的查询

SELECT *
FROM
(   SELECT stores.phone, stores.storeID, stores.name, stores.ZIP,
           stores.state,stores.city, storeID, GEOCODES.lon, GEOCODES.lat
    FROM items
    LEFT JOIN stores on stores.storeID = items.store_ID
    LEFT JOIN GEOCODES on GEOCODES.address = CONCAT(stores.address1,', ',stores.ZIP)
    WHERE stores.phone IS NOT NULL
    GROUP BY items.store_ID
    LIMIT 200
) t
ORDER BY RAND( ) 

一些证据:

CREATE table digits as (-- a digit table with 1 million rows)   
    1000000 row(s) affected Records: 1000000  Duplicates: 0  Warnings: 0    
    1.869 sec

SELECT * FROM digits ORDER BY RAND() LIMIT 200  
    200 row(s) returned 
    0.465 sec / 0.000 sec

SELECT * FROM (SELECT * FROM digits LIMIT 200)t ORDER BY RAND()    
    200 row(s) returned 
    0.000 sec / 0.000 sec