我有两个像下面这样的mysql表:
table_category
-----------------
id | name | type
1 | A | Cloth
2 | B | Fashion
3 | C | Electronics
4 | D | Electronics
table_product
------------------
id | cat_cloth | cat_fashion | cat_electronics
1 | 1 | 2 | 3
1 | NULL | 2 | 4
此处cat_cloth, cat_fashion, cat_electronics
是来自table_category
最好有另一个类别类型的表,但我现在需要一个快速的解决方案。
我想获得产品总数的类别列表。我写了以下查询:
SELECT table_category.*, table_product.id, COUNT(table_product.id) as count
FROM table_category
LEFT JOIN table_product` ON table_category.id = table_product.cat_cloth
OR table_category.id = table_product.cat_fashion
OR table_category.id = table_product.cat_electronis
GROUP BY table_product.id
ORDER BY table_product.id ASC
问题:我写的sql有效,但我有超过14K类别和50K产品,而且sql工作得非常慢。我为cat_ * id添加了索引但没有改进。我的问题如何优化此查询?
我发现查询需要3-4分钟来处理我提到的数据量。我想减少执行时间。
最好的问候
答案 0 :(得分:1)
据我所知,每一个" OR"要么在" ON"或"在哪里"部分成本非常昂贵。这听起来很愚蠢,但我建议你将3个单独的小选项与UNION ALL组合在一起。 我们在mysql和postgresql中都遇到了类似的问题,在某些情况下我们得到的资源超过了#34;我们还必须为bigquery做这件事。所以这是非常愚蠢的,你会有更多的工作,但它确实有效,并且它产生的结果更快,然后很多" OR" s。