我有一个聊天系统,我想要一些想法来优化这个:
CREATE TABLE IF NOT EXISTS `chat` (
`id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`from` int(11) UNSIGNED NOT NULL,
`to` int(11) UNSIGNED NOT NULL,
`message` text NOT NULL,
`sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`recd` int(11) UNSIGNED NOT NULL DEFAULT '0',
`del_from_status` int(11) NOT NULL DEFAULT '0',
`del_to_status` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `from` (`from`),
KEY `to` (`to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;1)这张桌子可以大得多,想象一下100个女孩整天在网上聊天,我的索引好吗?
2)我有del_from_status和del_to_status,例如,用户1删除用户2中的所有消息,我将update del_to_status=1 where from=2 and to=1,但我需要扫描所有的表来完成这一点,搜索每个消息from=2 to=1和del_to_status=0。如果我有很多信息,可能会很慢,不是吗?对此有什么建议吗?
发布于 2016-04-27 21:46:10
考虑到您提到的更新查询和选择类型,我认为您的索引看起来还不错,我认为您需要显示聊天。
但是,如果您预期这个表有许多行,我可能会优化字段以最小化表的大小,以便在表增长时保持性能。sent可以是时间戳,而不是空缺省CURRENT_TIMESTAMP。我不清楚recd、del_from_status和del_to_status的用途,但如果它们只是布尔值,如果您的MySQL引擎足够现代,则可以使用位(1)字段;如果不是布尔字段的话。
使用from和to作为字段名也是不寻常的,因为它们是保留的SQL。结合所有这些,下面是建议创建表的另一种方法:
CREATE TABLE `chat` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`from_user` int(10) unsigned NOT NULL,
`to_user` int(10) unsigned NOT NULL,
`message` text NOT NULL,
`sent` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`recd` tinyint(1) NOT NULL DEFAULT '0',
`del_from_status` tinyint(1) NOT NULL DEFAULT '0',
`del_to_status` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `from` (`from_user`),
KEY `to` (`to_user`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;最后的想法-如果你想支持小组聊天在未来,你可能希望重新建筑师这一点。您可以有一个chat表,它可以告诉您聊天中有哪些用户,还有一个chat_message表,它包含与chat.id相关的消息内容。您可以在chat表中添加“自”和“直到”时间戳,以支持用户加入和离开组聊天。
https://stackoverflow.com/questions/36900455
复制相似问题