首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我不确定我是否有正确的索引,或者我是否可以在MySQL中提高查询速度?

我不确定我是否有正确的索引,或者我是否可以在MySQL中提高查询速度?
EN

Stack Overflow用户
提问于 2011-01-20 15:09:38
回答 3查看 457关注 0票数 13

我的查询有一个连接,看起来它使用了两个索引,这使它变得更加复杂。我不确定我是否能改进这一点,但我想我会问一下。

该查询生成一个记录列表,其中包含与要查询的记录相似的关键字。

这是我的问题。

代码语言:javascript
复制
SELECT match_keywords.padid,
       COUNT(match_keywords.word) AS matching_words
FROM   keywords current_program_keywords
       INNER JOIN keywords match_keywords
         ON match_keywords.word = current_program_keywords.word
WHERE  match_keywords.word IS NOT NULL
       AND current_program_keywords.padid = 25695
GROUP  BY match_keywords.padid
ORDER  BY matching_words DESC
LIMIT  0, 11  

解释

单词是varchar(40)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-26 18:50:15

您可以从尝试删除IS NOT NULL测试开始,该测试通过字段上的COUNT隐式删除。看起来你也想从match_keywords中省略25695,否则25695 (或其他)肯定会在你的11行限制内显示为“最佳”匹配?

代码语言:javascript
复制
SELECT     match_keywords.padid,
           COUNT(match_keywords.word) AS matching_words
FROM       keywords current_program_keywords
INNER JOIN keywords match_keywords
        ON match_keywords.word = current_program_keywords.word
WHERE      current_program_keywords.padid = 25695
GROUP BY   match_keywords.padid
ORDER BY   matching_words DESC
LIMIT      0, 11

接下来,考虑一下你作为一个人会怎么做。

你可以从一个padid (25695)开始,然后从那些单词列表中检索出该padid的所有单词,再次回到表格中,对于每个匹配的单词,获取它们的padid(假设在padid + word)

  • group
  • 上没有重复,并对它们进行计数
  • 排序,然后返回最高的11个

对于包含3个单独的单列索引的列表,前两步(都只涉及2列)总是必须从索引跳回到数据,才能获得另一列。覆盖索引可能会有所帮助-创建两个复合索引以进行测试

代码语言:javascript
复制
create index ix_keyword_pw on keyword(padid, word);
create index ix_keyword_wp on keyword(word, padid);

有了这些复合索引之后,您就可以删除padidword上的单列索引了,因为这两个索引涵盖了它们。

注意:您必须始终针对以下情况调整SELECT性能

store)

  • insert/update
  • 索引的大小(创建的越多,对提交性能的影响越大(索引越多,提交所需的时间就越长,因为它必须先更新数据,然后再更新所有索引)
票数 9
EN

Stack Overflow用户

发布于 2011-01-30 11:45:40

尝试执行以下操作...确保索引在PadID上,一个在WORD上。然后,通过更改SELECT WHERE限定符的顺序,首先优化CURRENT关键字的PADID,然后连接到其他关键字...排除对自身的联接。此外,由于您检查了内连接与匹配关键字的等价性...如果检查current关键字是否为null,则它永远不应连接到NULL值,从而消除了对匹配关键字别名的比较,因为将每次比较都视为查找NULL...

代码语言:javascript
复制
SELECT STRAIGHT_JOIN
      match_keywords.padid,
      COUNT(*) AS matching_words 
   FROM
      keywords current_program_keywords
         INNER JOIN keywords match_keywords          
            ON match_keywords.word = current_program_keywords.word 
            and match_keywords.padid <> 25695
   WHERE  
          current_program_keywords.padid = 25695
      AND current_program_keywords.word IS NOT NULL
   GROUP BY 
      match_keywords.padid 
   ORDER BY 
      matching_words DESC 
   LIMIT
      0, 11 
票数 5
EN

Stack Overflow用户

发布于 2011-01-20 15:28:31

您应该为以下字段建立索引(检查与哪个表对应)

match_keyword.padid

current_program_keywords.padid

match_keyword.words

current_program_keywords.words

希望它能帮助加速

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4744380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档