【问题标题】:Mysql join query issueMysql连接查询问题
【发布时间】:2013-03-27 21:16:11
【问题描述】:

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

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

手头的任务是让不同的搜索词返回具有不同颜色代码的特定产品。为此,我添加了一个名为 colour_code_alias 的新表,该表仅包含一个 colour_code 字段,该字段对应于 product 表中的 colour_code 字段,以及一个返回此结果的 alias 字段。请参阅下表示例。

**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 子句中的 'or cca.alias = "XYZ"' 时,将使用产品表中的 colour_code 索引。

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

感谢任何帮助。

谢谢, 马丁。

就像我所做的一样。我已经删除了左连接并在 where 子句中添加了一个选择查询。查询如下所示:

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

【问题讨论】:

  • cca.alias 是否已编入索引?
  • 是的...我已经使用 3 个索引对其进行了测试.. colour_code、别名和复合 colour_code_alias 索引。

标签: mysql performance join indexing


【解决方案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')

【讨论】:

  • 嗨,谢谢你的建议。它似乎返回了 id,但我正在简化我的问题,如果我说我需要产品的所有列,这会改变。我更新了查询并将 where 子句更改为包括:where product.colour_code = 'ABC 'or product.colour_code IN(select colour_code from colour_code_alias where alias = 'XYZ') 似乎好一点,但还是有点慢
  • 将 IN 更改为 = ....这似乎是您表上的索引问题....将 product.colour_code 和 colour_code_alias.alias 声明为索引
  • 感谢您的建议。我已经将我的 IN 更改为“=”,它似乎运行得更快了。我已经在这两个表/字段上设置了索引。解释查询仍然没有显示 product.colour_code 的键。
  • 尝试用实际的结构和索引重建你的表......使用 mysql 转储并在你的数据库上重新创建表......重建你的索引并消除磁盘​​上的数据碎片.
  • 我无法重建产品表,因为我无法更改它。当我说查询运行缓慢时,我已经将它降低到大约 1 秒,而查询没有被缓存,所以我想暂时还可以。当我有机会时,我会重新审视它。感谢大家的帮助!
【解决方案2】:

您肯定应该有关于 product.colour_code 和别名的索引。

另一种想法是完全避免 OR 部分,方法是用原始的别名表填充别名表......类似于:

'ABC','ABC'

这样你就有一个地方可以查看。

编辑:

再想一想 - 使用数字键而不是字符串 - 这也会更有效。 (但如果你不能换桌子可能会很困难)

【讨论】:

  • 我已经在产品和别名表上设置了索引 ok.. 嗯.. 我可以尝试将原始索引添加到别名表中。 - 虽然,如果产品表有新产品,在我用新的颜色代码填充别名表之前,它是不可搜索的。
  • 我不能像你说的那样使用数字键,我不能改变桌子。多个产品的 colour_code 也可以相同。
猜你喜欢
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多