我怎样才能优化这个mysql查询?我使用 OR 运算符

Posted

技术标签:

【中文标题】我怎样才能优化这个mysql查询?我使用 OR 运算符【英文标题】:how can i optimize this mysql query ? i use OR operator 【发布时间】:2017-06-21 09:22:51 【问题描述】:

我得到一个这样的 mysql 查询:

select a.goods_id, 
       a.site_id,
       b.goods_name,
       a.cost,
       a.stock 
from rs_goods as a 
inner join rs_goods_multi as b 
   on a.goods_id = b.goods_id 
where a.goods_sn LIKE 'sweater005%' 
OR    b.goods_name LIKE 'sweater005%';

它显示类型'ALL',也许是'OR'导致它,我该如何优化它,我已经为字段'goods_sn'和'goods_name'添加了索引。下面可以看到mysql的抓包。mysql capture

【问题讨论】:

您在a.goods_snb.goods_name 上有索引吗? 输入“ALL”是什么意思? 对不起,没看到图片。问题是,当您使用% 时,会扫描整个表,即逐行扫描以进行匹配。正如@FMashiro 建议的那样,尝试在没有% 的情况下找到确切的单词或修改架构和查询以找到 y ID 请通过格式化改进您提出问题的方式。看了3遍没看懂。 @PrabhatG ,如果我使用 % like "%field%",它可能会导致所有表扫描,但是如果我将 % 运算符放在像 'field%' 这样的字段后面,它应该使用索引来查询 【参考方案1】:

使用 UNION 从查询中删除 OR,通常可以获得更好的结果,因为每个查询都可以有效地使用单个索引。

select a.goods_id, 
       a.site_id,
       b.goods_name,
       a.cost,
       a.stock 
from rs_goods as a 
inner join rs_goods_multi as b 
   on a.goods_id = b.goods_id 
where a.goods_sn LIKE 'sweater005%' 
UNION
select a.goods_id, 
       a.site_id,
       b.goods_name,
       a.cost,
       a.stock 
from rs_goods as a 
inner join rs_goods_multi as b 
   on a.goods_id = b.goods_id 
where b.goods_name LIKE 'sweater005%'

看看这是否会产生更好的结果。

【讨论】:

以上是关于我怎样才能优化这个mysql查询?我使用 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章

如何优化 MySQL 中的多个左连接?

我有一个 MYSQL 表创建查询,其中包含以下约束 KEY `ix_email_address` (`address`) 。我怎样才能在蜂巢中实现这个?

MySql Query - 使用 varchars、索引进行优化,需要一个多小时才能运行

我怎样才能优化这个多数票

我怎样才能使这个查询 sargable?

我怎样才能优化这个脚本,这样它就不需要一周的时间来完成它正在做的任务? (也使用了 BASH PARALLEL。)