Mysql连接查询问题

时间:2013-04-05 12:39:05

标签: mysql performance join indexing

我目前遇到SQL查询问题。我有一个包含colour_code字段的产品表。我不能改变产品表,因为它是从外部来源获取的。

在网站上,用户可以通过colour_code搜索产品,并返回此颜色的所有可用产品。

手头的任务是让不同的搜索词返回具有不同颜色代码的特定产品。为此,我添加了一个名为colour_code_alias的新表,它只有一个colour_code字段,该字段对应于product表中的colour_code字段和一个将返回此结果的别名字段。见下面的表格示例。

**Product_tb**
id, colour_code
1, "ABC"

**colour_code_alias_td**
colour_code,alias
"ABC","XYZ"

因此,如果用户搜索XYZ,则应返回ID为1的产品。如果他们搜索“ABC”,则还应返回ID为1的产品。

我的问题是查询执行时间太长,因为它没有使用索引。我的简化查询如下:

Select * from product
left join colour_code_alias cca on cca.colour_code = product.colour_code
where (product.colour_code = 'XYZ' or cca.alias = "XYZ")

当我使用说明时,它显示它不使用此查询的键。 当我在where子句中删除'或cca.alias =“XYZ”'时,正在使用product表中的colour_code索引。

我正在寻求帮助以提高此类查询的性能,我应该如何索引此类查询,甚至应该重写它?

感谢任何帮助。

谢谢, 马丁。

就像我已经完成的事情一样。我已经删除了左连接并在where子句中添加了一个select查询。查询如下所示:

Select * from product
where (product.colour_code = 'XYZ' or product.colour_code = (select colour_code from colour_code_alias where alias = 'XYZ') );

2 个答案:

答案 0 :(得分:1)

你应该在product.colour_code和别名上有一个索引。

另一个想法是完全通过使用原始表填充别名表来避免OR部分...类似于:

'ABC','ABC'
这样你就有了一个可以看的地方。

修改

还有一个想法 - 使用数字键而不是字符串 - 这也会更有效率。 (但如果你不能改变表格可能会很困难)

答案 1 :(得分:1)

您可以尝试此查询:

select *,
(select id from product where colour_code = cod.colour_code ) as id_prod
from 
colour_code_alias cod
where (cod.colour_code = 'ABC' or cod.alias = 'XYZ')