gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-29 00:11:53 25 4
gpt4 key购买 nike

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

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

这是我的查询。

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

解释 alt text

Word 是 varchar(40)。

最佳答案

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

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 上没有重复项)
  • 将 padid 分组并数数
  • 排序计数并返回最高的 11

对于 3 个单独的单列索引的列表,前两个步骤(均仅涉及 2 列)将始终必须从索引跳回数据以获取另一列。覆盖索引在这里可能会有所帮助 - 创建两个复合索引进行测试

create index ix_keyword_pw on keyword(padid, word);
create index ix_keyword_wp on keyword(word, padid);

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

注意:您始终必须针对 SELECT 性能调整

  • 索引的大小(创建的越多,存储的越多)
  • 插入/更新性能(索引越多,提交时间越长,因为它必须更新数据,然后更新所有索引)

关于mysql - 我不确定我是否有正确的索引或者我是否可以提高我在 MySQL 中的查询速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4744380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com