以下查询正在重载我的系统。这似乎是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完成的。
答案 0 :(得分:0)
在查询中使用RAND()
具有严重的性能影响,避免它会大大加快您的查询速度。
此外,由于你使用的是php,使用shuffle()
w / php随机排序可能是一个明显更快的替代mysql。
答案 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