我有一个聊天系统,我想要一些想法来优化它:
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
但是我需要扫描所有表来执行此操作,搜索来自= 2的每条消息to = 1和del_to_status = 0。如果我有很多消息,它可能会很慢,不是吗?有什么建议吗?
答案 0 :(得分:2)
我认为你的索引看起来没问题,因为你提到的UPDATE查询以及我想你需要显示聊天的SELECT类型。
但是,如果您预计此表有很多行,我可能会优化这些字段以最小化表大小,以便在增长时保持性能。 sent
可以是TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP。我不清楚recd
,del_from_status
和del_to_status
的用途,但如果它们只是布尔值,如果你的MySQL引擎是,你可以使用BIT(1)字段足够现代;如果不是BOOLEAN字段。
使用from
和to
作为字段名称也很常见,因为这些是保留的SQL字。结合所有这些,这里是另一个建议的CREATE TABLE:
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
相关的邮件内容。您可以将“since”和“until”时间戳添加到chat
表,以支持用户加入和离开群组聊天。