当前位置: 首页 > 知识库问答 >
问题:

Inner join mysql性能搜索产品

曾承弼
2023-03-14

我有两张桌子:

~ 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个答案

章昊
2023-03-14

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`??

 类似资料:
  • 问题内容: 我们有两个节点的集群(私有云中的VM,64GB的RAM,每个节点8个核心CPU,CentOS),几个小索引(约100万个文档)和一个大索引,约有2.2亿个文档(2个分片,170GB)的空间)。每个盒上分配了24GB的内存用于elasticsearch。 文件结构: 运行以下查询大约需要1-2秒: 我们是在此时达到硬件极限,还是有办法优化查询或数据结构以提高性能? 提前致谢! 问题答案:

  • 我对DS和算法相当陌生,最近在一次工作面试中,我被问到一个关于性能调优和代码的问题。我们有一个包含数十亿个条目的数据结构,我们需要在该数据结构中搜索特定的单词。那么,我们可以使用哪种Java特性/库在尽可能快的时间内进行搜索呢? 当时我想不出确切的答案,所以我写道: 我们可以将值存储在地图中,并在地图中搜索单词(但在如何确定地图中的键值对方面遇到了困难) 我如何才能理解这个问题的确切答案,以及什么

  • 我使用Elasticsearch允许用户输入要搜索的术语。例如,我要搜索以下属性'name': 如果使用以下代码搜索或,我希望返回此文档。 我尝试过做一个bool must和做多个术语,但它似乎只有在整个字符串都匹配的情况下才起作用。 所以我真正想做的是,这个词是否以任何顺序包含两个词。 有人能帮我走上正轨吗?我已经在这上面砸了一段时间了。

  • 本文向大家介绍SQLServer地址搜索性能优化,包括了SQLServer地址搜索性能优化的使用技巧和注意事项,需要的朋友参考一下 这是一个很久以前的例子,现在在整理资料时无意发现,就拿出来再改写分享。 1.需求  1.1 基本需求: 根据输入的地址关键字,搜索出完整的地址路径,耗时要控制在几十毫秒内。  1.2 数据库地址表结构和数据:  表TBAddress    表数据    1.3 例子:

  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 最大ngram 36 在速度和内存方面,这会得到真正糟糕的加班吗?有没有更好的方法来部分搜索UUID?例如,我有7e222584-0818-49b0-875b-2774f4bf939b,我希望能够使用9b0搜索它