我有两张桌子:
~ 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。
我做错了什么?
谢谢你。
products_words.word=words.id上的似乎完全错误--
主键(单词)word
是varchar
但id
是int。是否需要有
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`??