gpt4 book ai didi

mysql - 如何使用 GROUP BY 和 ORDER BY 优化查询

转载 作者:行者123 更新时间:2023-11-29 02:35:52 24 4
gpt4 key购买 nike

我有一个POSTS表,结构是这样的:

CREATE TABLE IF NOT EXISTS `posts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_turkish_ci DEFAULT NULL,
`content` longtext COLLATE utf8_turkish_ci,
`excerpt` longtext COLLATE utf8_turkish_ci,
`link` longtext COLLATE utf8_turkish_ci,
`original_link` longtext COLLATE utf8_turkish_ci,
`mime_type` longtext COLLATE utf8_turkish_ci,
`language_id` int(11) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`site_id` int(11) DEFAULT NULL,
`type` varchar(255) COLLATE utf8_turkish_ci DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
`modified_at` datetime DEFAULT NULL,
`is_deleted` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `type` (`type`),
KEY `created_at` (`created_at`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=52487 ;

还有一个 USERS 表,其结构如下:

CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) COLLATE utf8_turkish_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_turkish_ci AUTO_INCREMENT=9422 ;

我正在使用此查询来获取按时间降序排列并按用户分组的最新“页面、文件或帖子”帖子,以不显示用户的所有最新帖子:

   SELECT p.*, u.* 
FROM posts p
LEFT JOIN users u ON p.user_id = u.id
WHERE p.type IN ('post', 'page', 'file')
GROUP BY p.user_id
ORDER BY p.created_at DESC
LIMIT 30

但是速度太慢,甚至限制在30条记录。

现在,我怎样才能加快这个查询?索引哪些列或任何其他想法?谢谢。

最佳答案

首先要做的是在 posts.user_id 上添加索引(或者可能是 posts.user_id + posts.type)。 posts.created_at

上的另一个索引

更新
我刚刚注意到您的查询从两个表中获取所有字段,并且 posts 表有 6 个长文本列。所以我相信你的表现很差,因为 mysql 必须创建一个相当大的临时表或临时文件来获取所有行以满足你的 group by + order by 子句。我认为以下查询应该有所帮助。

  SELECT u.*, p1.* FROM
users u
INNER JOIN
(
SELECT p.user_id, p.created_at, p.id FROM posts p
WHERE p.type IN ('post', 'page', 'file') GROUP by p.user_id
ORDER BY p.created_at DESC LIMIT 30
)xxx ON xxx.user_id = u.id
INNER JOIN posts p1 ON (p1.id = xxx.id)

关于mysql - 如何使用 GROUP BY 和 ORDER BY 优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5227079/

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