[英]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更快的替代方法。
如果我是你,我将先在有限的查询上进行限制,然后再进行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.