0

我有一个应用程序,可以分析人们在 Facebook 上的喜好,并将它们与他们在过去几十年中可能喜欢的东西进行匹配。

作为优化我们拥有的匹配的一部分,我存储了每个用户的喜好(使用他们的 Facebook ID 的哈希值,以保持匿名)。人们可以多次输入,因此它会多次存储他们的喜欢,从而使结果有些偏差。

所以我的user_likes桌子是这样的:

id  |  page_id   |  user_id_hash
----------------------------------
    |            |

我目前有大约 820,000 条记录。

目前,如果我进行查询:

SELECT page_id, COUNT(*) from user_likes
GROUP BY page_id LIMIT 0,30

这大约需要 8 秒,并且给了我一个错误的计数,因为它可以计算多次输入的人。

我的问题是:

1)我怎样才能加快这个查询?
2)如何获得更准确的计数?

4

1 回答 1

2

您可以通过这样的查询来获得更准确的计数:

SELECT page_id, COUNT(distinct user_id_hash)
from user_likes ul
GROUP BY page_id LIMIT 0,30;

在 MySQL 中加速它是棘手的,因为group by. 您可以尝试以下方法。在 上创建索引user_likes(page_id, user_id_hash)。然后试试这个:

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

这个查询背后的想法是避免group by——在 MySQL 中实现不佳的运算符。内部查询应该使用索引来获取唯一page_id的列表。选择中的子查询应使用相同的索引进行计数。使用基于索引的操作,计数应该更快。

于 2013-09-10T02:38:07.700 回答