MySQL查询根据投票加入2个表

时间:2014-02-15 20:48:49

标签: php mysql sql inner-join

我有一个Web应用程序,我使用2个表,一个用于存储产品信息,另一个用于存储每个产品的投票。

现在我想根据产品的票数显示产品。下面是表格结构

产品:

PRODUCT_ID  TITLE
1           product1
2           product2
3           product3
4           product4

投票:

PRODUCT_ID  USER_ID
1           1
1           1
2           2
3           2

我期待结果以投票的降序显示产品

PRODUCT_ID  TITLE           VOTES
1           product1        2
2           product2        1
3           product3        1

目前我正在使用像这样的查询

SELECT p.product_id, p.title, count(*) AS total FROM products p 
INNER JOIN votes v ON v.product_id = p.product_id  GROUP BY p.product_id 
ORDER BY count(*) DESC LIMIT 110

产品表有大约30,000条记录,而投票表大约有90,000条记录。

现在问题是需要花费很多时间(随机介于18到30秒之间)。由于表中的记录数不是那么高,我想知道为什么需要这么长的时间。

有一点需要注意的是,当我第二次运行查询时,它会在几毫秒内获取结果,我认为这是不太复杂的查询的理想时间。

同样,我对编程的数据库方面还很陌生。

我不确定查询中是否有任何错误,或者表结构是否有效(至少快速获取记录)。

1 个答案:

答案 0 :(得分:1)

首先,您的查询没问题,但我倾向于采用不同的格式:

SELECT p.product_id, p.title, count(*) AS total
FROM products p INNER JOIN
     votes v
     ON v.product_id = p.product_id 
GROUP BY p.product_id 
ORDER BY count(*) DESC
LIMIT 110;

正如另一个答案所提到的,votes(product_id)上的索引肯定有助于查询,如果你还没有。即使join性能得到改善,您仍然需要聚合的开销。并且,在MySQL中可能会有很多开销。

如果你期待更多的选票 - 进入数百万 - 那么你可能不得不采取另一种方法。一种方法是向某个表添加一个触发器(也许是products表,它会在进入时跟踪投票。然后查询将会飞。另一种方法是定期汇总数据,类似于使用触发器而是使用作业。