gpt4 book ai didi

mySQL随机查询执行时间较长

转载 作者:行者123 更新时间:2023-11-29 20:09:38 25 4
gpt4 key购买 nike

我是查询优化的新手,所以我读了很多文章并观看了 YouTube 等内容,但我仍然无法弄清楚。

问题是我想为我的 API 执行这个查询:

SELECT  req_id,follow_requests.insta_id as id,caption,follow_requests.male,
users.name,users.profile_pic
FROM follow_requests
INNER JOIN users ON follow_requests.insta_id = users.insta_id
WHERE (remaining_follow>0 && req_id<='574989')
AND NOT EXISTS
(
SELECT *
FROM follows
WHERE follows.req_id=follow_requests.req_id
AND follows.follower_insta_id='3134816134'
)
ORDER BY req_id DESC
LIMIT 20

所以我记录了我的数据库,摘要显示这个正在消耗我+42%的资源此查询的某些实例看起来像 300 秒,但平均为 20 秒!(他们在发送数据状态时陷入困境)所以我尝试改变它以使其变得更好(并不是说我真的知道我在做什么:)我把它改成了这个

SELECT  fr.req_id, fr.insta_id as id, fr.caption, fr.male, u.name,
u.profile_pic, fr.date, fr.remaining_follow
FROM follow_requests AS fr
INNER JOIN users AS u ON fr.insta_id=u.insta_id
WHERE fr.remaining_follow>0
AND fr.insta_id!=3134816134
AND NOT EXISTS
(
SELECT *
FROM follows as f
WHERE f.req_id=fr.req_id
AND f.follower_insta_id='3134816134'
)
ORDER BY fr.date DESC
LIMIT 20

奇怪的是,前几次运行都还好!比如从0.1秒到0.7秒试运行中但是当我稍微拉伸(stretch)一下并回来完成它之后,这也被卡住了 +200,300 秒,但这次处于排序状态我用解释检查了查询,发现它没有使用日期索引!如果我从查询中删除“order by”部分,它就会变得非常快~0.2s

有什么想法吗?

顺便说一句,几乎所有列都被索引,并且下面的表有 2M 行,其他有类似 +100k

抱歉,如果我不能很好地解释或者我错过了向您提供一些重要信息,我只是个新人;)

如果您能以某种新手可以理解的方式解释它,同时又不会错过重要的细节,我将非常感激:)

提前致谢

=-=-=-=-=-=-=更新1=-=-=-=-=-=-=

感谢您的帮助,我现在完成了这个查询,这是时间高效的,但是我不得不稍微改变一下整个事情,但它可能仍然有问题

SELECT  follow_requests.req_id, follow_requests.insta_id as id,
caption, follow_requests.male, users.name,users.profile_pic
FROM follow_requests
INNER JOIN users ON follow_requests.insta_id = users.insta_id
LEFT OUTER JOIN follows ON follows.req_id = follow_requests.req_id
AND follows.follower_insta_id = '3134816134'
WHERE follow_requests.remaining_follow >0
AND follow_requests.insta_id != 3134816134
AND (follows.follower_insta_id != 3134816134 || follows.follower_insta_id is null)
ORDER BY follow_requests.date DESC
LIMIT 20

嗯,首先我需要说的是,我没有编写原始查询(第一个),而且我自己也不理解所有内容:/但是主要程序员现在无法联系到,我必须取代他的位置或整个项目将会失败

问题是每个人都可以提交多个对 insta_id 的请求,但应该只返回其中一个主代码和@Kickstart代码(这是原始代码的优化版本,平均响应时间约为10秒)做得对(出于某种原因我不明白但我的代码返回同一 insta_id 的多个实例(具有不同的 req_id)

还有人可以告诉我为什么第一个查询做得这么糟糕吗?

最佳答案

确实需要查看表声明和查询的解释。

但是,可能值得尝试下表的 LEFT OUTER JOIN,并检查是否不匹配(通过检查必须在该表上填充的列是否为 NULL)。

但是,您在下表中是否有一个涵盖 req_id 和 follower_insta_id 字段的索引?不是两个单独的索引,而是一个涵盖两个字段的索引。

SELECT req_id,
follow_requests.insta_id as id,
caption,
follow_requests.male,
users.name,users.profile_pic
FROM follow_requests
INNER JOIN users ON follow_requests.insta_id = users.insta_id
LEFT OUTER JOIN follows ON follows.req_id = follow_requests.req_id AND follows.follower_insta_id = '3134816134'
WHERE follows.req_id IS NULL
AND remaining_follow > 0
AND req_id <= '574989'
ORDER BY req_id DESC
LIMIT 20

关于mySQL随机查询执行时间较长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40210209/

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