gpt4 book ai didi

mysql - 需要帮助加快 MySQL 查询速度

转载 作者:行者123 更新时间:2023-11-29 08:43:42 26 4
gpt4 key购买 nike

我需要一个查询来快速显示用户尚未上传 PDF 的特定模块(文章子集)中的文章。考虑到文章表中有 300,000 篇文章,模块中有 6,000 篇文章,我在下面使用的查询大约需要 37 秒。

SELECT * 
FROM article a
INNER JOIN article_module_map amm ON amm.article=a.id
WHERE amm.module = 2 AND
a.id NOT IN (
SELECT afm.article
FROM article_file_map afm
INNER JOIN article_module_map amm ON amm.article = afm.article
WHERE afm.organization = 4 AND
amm.module = 2
)

我在上面的查询中所做的是首先将文章列表截断为选定的模块,然后进一步将该列表截断为不在子查询中的文章。子查询正在生成组织已为其上传 PDF 的文章列表。因此,最终结果是组织尚未上传 PDF 的文章列表。

非常感谢您的帮助,提前致谢!

编辑2012/10/25

在 @fthiella 的帮助下,以下查询的运行时间从 37 多秒缩短到了惊人的 1.02 秒!

SELECT a.* FROM (
SELECT article.* FROM article
INNER JOIN article_module_map
ON article.id = article_module_map.article
WHERE article_module_map.module = 2
) AS a
LEFT JOIN article_file_map
ON a.id = article_file_map.article
AND article_file_map.organization=4
WHERE article_file_map.id IS NULL

最佳答案

我不确定我是否能够正确理解表格的逻辑和结构。这是我的查询:

SELECT
article.id
FROM
article
INNER JOIN
article_module_map
ON article.id = article_module_map.article
AND article_module_map.module=2
LEFT JOIN
article_file_map
ON article.id = article_file_map.article
AND article_file_map.organization=4
WHERE
article_file_map.id IS NULL

我提取了包含模块 2 的所有文章。然后选择组织 4 未提供文件的文章。

我使用了 LEFT JOIN 而不是子查询。在某些情况下,这可能会更快。

编辑感谢您的评论。我不确定它会跑得更快,但令我惊讶的是它慢得多!不管怎样,值得一试!

现在,出于好奇,我想尝试一下 LEFT/INNER JOIN 和子查询的所有组合,看看哪一个运行得更快,例如:

SELECT *
FROM
(SELECT *
FROM
article INNER JOIN article_module_map
ON article.id = article_module_map.article
WHERE
article_module_map.module=2)
LEFT JOIN
etc.

也许删除*,我想看看WHERE子句和ON子句的条件之间有什么变化...无论如何我认为这没有多大帮助,你现在应该专注于索引。

键/外键上的索引应该已经没问题了,但是如果您在 article_module_map.module 和/或 article_file_map.organization 上添加索引会怎样?

关于mysql - 需要帮助加快 MySQL 查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13064117/

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