我选择此选项是为了在某人发表评论时向用户显示一些通知。 我注意到,用户发表带有很多评论的文章可能需要6秒钟以上的时间。
select 'comments' prefix, c.foto, c.data as data, c.user,
concat(k.user, ' comments your post') as logs
from comments c
inner join posts p on c.foto = p.id
inner join cadastro k on c.user = k.id
where p.user = 1 and c.user <> 1 and c.delete = 0
order by c.data desc
limit 5
我想向用户显示通知,有人评论您的帖子,为此,我对帖子使用了固定连接(以了解评论是否来自用户“ 1”)和内部联接cadastro(以获取用户昵称) -对用户1条信息发表评论的用户。
检查用户是否为1,c.user <> 1(不显示自己的评论通知)和c.delete(未删除评论)。
我的桌子:
`posts` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`user` int(11) UNSIGNED NOT NULL,
`foto` varchar(400),
`data` datetime NOT NULL,
`delete` tinyint(1) NOT NULL DEFAULT '0',
FOREIGN KEY (`user`) REFERENCES cadastro (`id`),
PRIMARY KEY (`id`)
)
`comments` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`foto` int(11) UNSIGNED NOT NULL,
`user` int(11) UNSIGNED NOT NULL,
`texto` varchar(3000) NOT NULL,
`data` datetime NOT NULL,
`delete` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `foto_delete` (foto, `delete`),
FOREIGN KEY (`foto`) REFERENCES posts (`id`) ON DELETE CASCADE
)
有什么主意,为什么用户有大约200.000条评论会花这么长时间? (如果用户有1000,则速度很快)。
答案 0 :(得分:1)
没有索引,为了运行查询,引擎通常会扫描所有行,以在ON,WHERE以及ORDER BY子句中查找所需的值。
您可以做的一件简单的事情就是创建索引:
CREATE INDEX cadastro_id ON cadastro(id);
CREATE INDEX posts_id ON posts(id);
CREATE INDEX posts_user ON posts(user);
CREATE INDEX comments_foto ON comments(foto);
CREATE INDEX comments_user ON comments(user);
CREATE INDEX comments_delete ON comments(delete);
CREATE INDEX comments_data ON comments(data);
测量当前时间,然后应用这些索引并再次测量,然后在此处告知。
另请参阅:
https://dev.mysql.com/doc/refman/5.7/en/create-index.html
https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html