有人能告诉我这个MySQL查询有什么问题吗?
select distinct(a.productId)
from product a
left join product_keyword b
on b.productId = a.productId
left join keywords c
on c.keywordId = b.keywordId
where a.productName LIKE '%truck%' OR c.value LIKE '%truck%'
limit 100;
实际上我需要加入3个表(product
,product_keyword
和keywords
)并根据用户输入进行搜索。一个产品可以是多个关键字,我将其存储在keywordId
中的table
关键字中product_keyword
。
有人可以帮我吗?
答案 0 :(得分:1)
当您在LIKE搜索的前缀中使用%
通配符时,MySQL无法利用任何索引进行搜索。相反,MySQL必须扫描所有行。
您至少应该在连接列(productID和keywordID)上有索引,以便MySQL能够更快地执行连接操作。但是,如果结果集太大,MySQL也会对JOIN执行扫描。
最有可能的是,MySQL正在扫描产品中的每一行,然后执行JOIN到product_keyword,然后执行连接到关键字。然后,它检查它是否可以根据WHERE子句排除行。一旦它返回100行,它就会停止。
答案 1 :(得分:0)
如果您的表很大,这将是一个非常昂贵的查询。在LIKE查询上使用前导通配符通常会非常慢。如果你需要那种搜索功能,最好在Lucene或类似的东西中进行外部操作,而不是在数据库中。