0

谁能告诉我这个 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)。

任何人都可以帮助我吗?

4

2 回答 2

1

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

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

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

于 2012-06-07T17:27:51.237 回答
0

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

于 2012-06-07T17:35:03.740 回答