繁体   English   中英

MySQL中查询时间慢

[英]Slow Query Time in 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

我试图阅读的另一篇文章是如何优化MySQL的ORDER BY RAND()函数? ,但似乎无法弄清楚如何使其适应此查询。 请注意,这是用PHP完成的。

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

另外,由于您使用的是php,因此使用shuffle() w / php随机排序可能是比mysql更快的替代方法。

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

如果我是你,我将先在有限的查询上进行限制,然后再进行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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM