结合3个表和搜索的MySQL优化

时间:2012-06-07 16:40:04

标签: mysql

有人能告诉我这个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个表(productproduct_keywordkeywords)并根据用户输入进行搜索。一个产品可以是多个关键字,我将其存储在keywordId中的table关键字中product_keyword

有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

当您在LIKE搜索的前缀中使用%通配符时,MySQL无法利用任何索引进行搜索。相反,MySQL必须扫描所有行。

您至少应该在连接列(productID和keywordID)上有索引,以便MySQL能够更快地执行连接操作。但是,如果结果集太大,MySQL也会对JOIN执行扫描。

最有可能的是,MySQL正在扫描产品中的每一行,然后执行JOIN到product_keyword,然后执行连接到关键字。然后,它检查它是否可以根据WHERE子句排除行。一旦它返回100行,它就会停止。

答案 1 :(得分:0)

如果您的表很大,这将是一个非常昂贵的查询。在LIKE查询上使用前导通配符通常会非常慢。如果你需要那种搜索功能,最好在Lucene或类似的东西中进行外部操作,而不是在数据库中。