我有一个 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
Products 表有大约 30,000 条记录,votes 表有大约 90,000 条记录。
现在的问题是它需要很多时间(随机在 18 到 30 秒之间)。由于表中的记录数不是那么多,我想知道为什么要花费这么长的时间。
注意到的一件事是,当我第二次运行查询时,它会在几毫秒内获取结果,我认为这是一个不那么复杂的查询的理想时间。
同样,我对编程的数据库方面还很陌生。
我不确定查询中是否有任何问题,或者是表结构效率不高(至少无法快速获取记录)。
最佳答案
首先,您的查询很好,但我倾向于采用不同的格式:
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
表,在投票进入时跟踪投票)添加一个触发器。然后查询就会运行。另一种方法是定期汇总数据,类似于使用触发器但使用作业代替。
关于php - MySQL查询根据投票加入2个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21803460/