使用多个连接条件

时间:2016-12-08 13:04:18

标签: mysql

我有两个像下面这样的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

的ID

最好有另一个类别类型的表,但我现在需要一个快速的解决方案。

我想获得产品总数的类别列表。我写了以下查询:

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分钟来处理我提到的数据量。我想减少执行时间。

最好的问候

1 个答案:

答案 0 :(得分:1)

据我所知,每一个" OR"要么在" ON"或"在哪里"部分成本非常昂贵。这听起来很愚蠢,但我建议你将3个单独的小选项与UNION ALL组合在一起。 我们在mysql和postgresql中都遇到了类似的问题,在某些情况下我们得到的资源超过了#34;我们还必须为bigquery做这件事。所以这是非常愚蠢的,你会有更多的工作,但它确实有效,并且它产生的结果更快,然后很多" OR" s。