mysql - 用于查找与一组类别匹配的产品的 SQL 查询

标签 mysql performance indexing

我有 3 个表:产品、类别和 pro_cat_link。一个产品可以通过表 pro_cat_link 链接到一个或多个类别。

我的查询必须回答以下问题:找到与一组类别匹配的所有产品。例如:找到所有“黄色、水果和甜味”的产品。

在 SO 中研究这个问题时,我只能找到我当前使用的解决方案: Complicated SQL Query--finding items matching multiple different foreign keys

就我而言,我的查询如下所示:

SELECT products.id, COUNT(DISTINCT categories.id) as countCat
FROM products
INNER JOIN pro_cat_link ON (pro_cat_link.product_id = products.id)
WHERE pro_cat_link.category_id IN (3,6,8,10)
GROUP BY product.id
ORDER BY product.date DESC
HAVING countCat = 4

换句话说,选择与其中一个类别 ID (3,6,8,10) 匹配的所有产品,并仅保留恰好有 4 个类别匹配的产品。

这很好用,但我遇到了性能问题,因为 COUNT()、GROUP BY、ORDER BY 使得适当的索引非常有限。谁能想出更好的方法来解决这个问题?

最佳答案

如果将信息存储在某处,则可以消除分组和计数的性能问题。您可以向 Products 添加一个名为 total_categories 的列,它会告诉您该产品参与了多少个类别。然后您可以只说 where total_categories = 4。如果产品经常更改它们的类别,这可能更难维护,因为您必须不断地正确更新此字段 - 然后您必须决定是否要在应用程序代码或触发器或存储过程中执行此操作...

通常我不认为将此类元数据直接存储在表中是个好主意,但如果性能真的那么差,则可能值得考虑。

关于mysql - 用于查找与一组类别匹配的产品的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11157772/

相关文章:

c++ - 一维或三维数组?

MongoDB 索引和 $or 运算符

c# - 索引超出范围异常与参数超出范围异常

mysql - 如何在 perl 中绑定(bind)表名的值?

mysql - 在 Laravel 5.6 中注册时出错

mysql - 查询两个表 - 但不尝试加入?

php - 显示多行 MySQL

python - 如何快速从集合中排除点

performance - Jmeter - 等待特定响应并收集总响应时间

sql - Azure SQL 数据库中的索引