MySQL查询速度慢
我有一个应用程序,可以分析人们在facebook上喜欢的东西,并将它们与他们在过去几十年中可能喜欢的东西进行匹配 作为改进现有匹配的一部分,我将每个用户喜欢的facebook ID的散列存储起来,以保持匿名。人们可以多次输入,因此它会多次存储他们喜欢的内容,从而使结果有点偏差 因此,我的用户_likes表如下所示:MySQL查询速度慢,mysql,Mysql,我有一个应用程序,可以分析人们在facebook上喜欢的东西,并将它们与他们在过去几十年中可能喜欢的东西进行匹配 作为改进现有匹配的一部分,我将每个用户喜欢的facebook ID的散列存储起来,以保持匿名。人们可以多次输入,因此它会多次存储他们喜欢的内容,从而使结果有点偏差 因此,我的用户_likes表如下所示: id | page_id | user_id_hash ---------------------------------- | | SEL
id | page_id | user_id_hash
----------------------------------
| |
SELECT page_id, COUNT(distinct user_id_hash)
from user_likes ul
GROUP BY page_id LIMIT 0,30;
我目前有大约82万张唱片
当前,如果我执行查询:
SELECT page_id, COUNT(*) from user_likes
GROUP BY page_id LIMIT 0,30
这大约需要8秒钟,并且给了我一个不正确的计数,因为它可以计算多次输入的人
我的问题是:
1如何加快查询速度?
2如何才能获得更准确的计数?您可以通过以下语句来获得更准确的计数:
id | page_id | user_id_hash
----------------------------------
| |
SELECT page_id, COUNT(distinct user_id_hash)
from user_likes ul
GROUP BY page_id LIMIT 0,30;
在MySQL中加速是很棘手的,因为GroupBy。你可以试试下面的方法。在用户(如页面id、用户id)哈希上创建索引。然后试试这个:
select p.page_id,
(select count(distinct user_id_hash)
from user_likes ul
where ul.page_id = p.page_id
)
from (select distinct page_id
from user_likes ul
) p
这个查询背后的想法是避免GROUPBY,这是MySQL中实现较差的操作符。内部查询应该使用索引来获取唯一页面ID的列表。select中的子查询应使用相同的索引进行计数。使用基于索引的操作,计数应该会更快。尝试执行以下操作:ALTER TABLE user_likes ADD index page_id page_id-这将索引列page_id。我认为这会加快查询速度,对吗?我试着这么做,但得到了一个mysql错误:要想在1My bad行的“KEY page_id”附近使用正确的语法,请再试一次。我把语法弄错了。ALTER TABLE user_喜欢添加索引页_id页_id谢谢。我假设我可以按countdistinct user\u id\u hash DESC追加一个订单?而且,我想知道在什么阶段我会遇到记录数量的问题?才一天,我就有82万张唱片。。。这将运行两个月。@ahren。我不知道。如果您正在处理来自Facebook的数据,请确保您拥有支持它的硬件。