gpt4 book ai didi

sql - 优化执行时间为 1 分钟的简单查询

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:23 24 4
gpt4 key购买 nike

我有这个相当简单的 SQL 查询,但执行起来需要将近一分钟:

SELECT
i.id,
...,
a.id AS albums_id,
...,
u.id AS users_id,
...
FROM
images i
LEFT JOIN albums a ON i.albums_id = a.id
LEFT JOIN users u ON a.users_id = u.id
WHERE
a.access = 'public'
AND i.num_of_views > 0
ORDER BY
i.num_of_views DESC
LIMIT
0, 60

上述查询的 EXPLAIN 结果:

http://i.min.us/ibeAnM.png

涉及的表:

图像(~4,822,000 行),相册(~149,000 行),用户(~43,000 行)

相关指标:

相册: access(access,num_of_images,album_time), access_2(access,num_of_images,num_of_all_comments,album_time), users_id(users_id,album_time)

图片: browser_2(num_of_views), albums_id(albums_id,image_order)

所有表格都是 InnoDB,运行在 MySql v5.1.47 上

那么我该如何将其缩短到不到一秒呢?

如果您需要任何其他信息,请发表评论。

编辑:users 表可以与 albumsimages 连接,这对我来说无关紧要。

edit2:将 a.access = 'public'WHERE 移动到 JOIN 确实解决了我的问题,但返回的结果不是正确(我从非公开的相册中获取图像),将 a.access ... 放在 WHEREJOIN 中会减慢查询速度甚至比以前下降更多。

最佳答案

albums.users_id 上添加索引。我也同意有关 a.access = 'public' 的评论。但无论哪种方式,索引都应该有所帮助。

更新

因为上面的key存在。尝试调整您的 JOIN 的顺序,即将 users 移到相册上方或将不同的表设为主表。在极少数情况下,这会有所帮助。另外,为了更好地加入 albums,请尝试:

LEFT JOIN albums a ON (i.albums_id = a.id AND a.access = 'public')

更新

根据评论,我会尽可能多地删除 LEFT JOIN。由于我不确定您在结果中需要什么,所以我只会为 albums 显示它。这不仅会减少结果集,而且会解决应用过滤器的问题。

JOIN albums a ON (i.albums_id = a.id AND a.access = 'public')

关于sql - 优化执行时间为 1 分钟的简单查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4400797/

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