mysql连接查询问题

标签 mysql performance join indexing

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

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

手头的任务是让不同的搜索词返回具有不同颜色代码的特定产品。为此,我添加了一个名为 colour_code_alias 的新表,它只有一个 colour_code 字段(对应于产品表中的 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 子句中的 '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') );

最佳答案

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

另一种想法是通过用原始数据填充别名表来完全避免 OR 部分......像这样:

'ABC','ABC'

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

编辑:

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

关于mysql连接查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15834228/

相关文章:

获取 map 的 Python、MySQL 和游标

mysql - 如何在对称配置中避免从属端数据库中的 sym_ 表?

c++ - 为什么++i 在性能方面永远不同于 i+=1

java - JPA/HIbernate : Joining 2 Entities Multiple Times

sql - SQL查询失败磁盘空间不足

mysql - MYSQL中未经身份验证的用户是什么意思?

php - 这是在我的 CMS 和前端处理特殊字符的正确方法吗?

java - Android : sending data to a WebView with loadUrl or retrieving it from the WebView with a JavascriptInterface? 中什么更快

java - 将子查询拆分为单独的查询效率更高吗?

mysql - 连接 MySQL 中两个联合的结果集