提问者:小点点

Inner join mysql性能搜索产品


我有两张桌子:

~ 100k records
CREATE TABLE `words` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `word` varchar(20) COLLATE utf8_slovak_ci NOT NULL,
  `reverse` varchar(20) COLLATE utf8_slovak_ci NOT NULL
  PRIMARY KEY (`id`),
  UNIQUE KEY `word ` (`word`),
  UNIQUE KEY `reverse ` (`reverse`),
) ENGINE=InnoDB AUTO_INCREMENT=127531 DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci

~ 2M records
CREATE TABLE `products_words` (
  `product` int(11) NOT NULL,
  `word` varchar(20) COLLATE utf8_slovak_ci NOT NULL,
  UNIQUE KEY `pw` (`product`,`word`) USING BTREE,
  KEY `word` (`word`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci

现在,如果有人正在寻找关键字“car”,它会看看下面的表词:

从单词中选择id,单词如“car%”或反向如“rac%”这样的单词非常快。

问题是,当我想用这个词得到独一无二的产品时。这些表与words.id和products_words.word连接。

我使用了以下SQL:

SELECT products_words.product
FROM products_words
INNER JOIN words
    ON products_words.word=words.id
WHERE words.word like "car%" or words.reverse like "rac%"
GROUP BY products_words.product

我不明白它为什么要看1799211行?我需要告诉MySql先看words表,选择F.E。10个ID和给我带来独特的产品与这些ID的Word。

我做错了什么?

谢谢你。


共1个答案

匿名用户

products_words.word=words.id上的似乎完全错误--wordvarcharidint。是否需要有ID?为什么不简单地在单词上使用主键(单词)

不能很好地优化。切换到联合:

SELECT DISTINCT pw.product
    FROM ( ( SELECT id FROM words WHERE word LIKE 'car%' )
           UNION ALL
           ( SELECT id FROM words WHERE word LIKE 'rac%' )
         ) AS w
    JOIN products_words AS pw
      ON pw.word = w.id  -- This needs fixing!!  perhaps `w.word`??