我怎样才能优化这个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_sn
和b.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 表创建查询,其中包含以下约束 KEY `ix_email_address` (`address`) 。我怎样才能在蜂巢中实现这个?