我有一个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秒之间)。由于表中的记录数不是那么高,我想知道为什么需要这么长的时间。
有一点需要注意的是,当我第二次运行查询时,它会在几毫秒内获取结果,我认为这是不太复杂的查询的理想时间。
同样,我对编程的数据库方面还很陌生。
我不确定查询中是否有任何错误,或者表结构是否有效(至少快速获取记录)。
答案 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
表,它会在进入时跟踪投票。然后查询将会飞。另一种方法是定期汇总数据,类似于使用触发器而是使用作业。