【发布时间】:2011-11-25 11:01:18
【问题描述】:
这个查询有点慢,我想优化一下,有什么想法吗?
SELECT DISTINCT a.id
FROM article a
LEFT JOIN article_comment ac
ON a.id = ac.article_id
LEFT JOIN comment c
ON ac.id = c.id
WHERE a.id IN (SELECT a2.id
FROM article_user_read aur
LEFT JOIN article a2
ON aur.article_id = a2.id
WHERE c.published_date > aur.read_date
AND aur.user_id = 36748
AND aur.followed = 1)
ORDER BY c.published_date DESC
这里是 article_user_read 表:
CREATE TABLE `article_user_read` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`article_id` int(11) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
`read_date` datetime NOT NULL,
`followed` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_BBE52A0262922701A76ED395` (`article_id`,`user_id`),
KEY `IDX_BBE52A0262922701` (`article_id`),
KEY `IDX_BBE52A02A76ED395` (`user_id`),
CONSTRAINT `article_user_read_ibfk_3` FOREIGN KEY (`article_id`) REFERENCES `article` (`id`),
CONSTRAINT `article_user_read_ibfk_4` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20193 DEFAULT CHARSET=latin1;
其他只是简单的文章和用户表。
【问题讨论】:
-
“解释”说什么?我假设您在用于加入的列上有索引?您是否尝试过将“in”子句重写为另一个联接?
-
您必须以某种方式摆脱依赖子查询 (
IN),我们可能需要了解您的表的结构(对于给定的 @ 可以有几个article_user_read.read_date987654325@ 和user_id?) -
@Trent,如果
article_comment和comment之间的链接在两个表的id字段上 - 即。article_comment.id实际上是评论的 ID 吗? -
@MarkBannister:我宁愿认为
ac.id = c.id是不正确的,因为ac.comment_id = c.id对我来说似乎更有可能和自然。但也许它比我们所看到的更多。 -
其实还有第四张表,因为comment是单继承模式,这里有article_comment,comment,article
标签: mysql sql performance optimization query-optimization