聊天消息mysql优化

时间:2016-04-27 20:41:14

标签: mysql

我有一个聊天系统,我想要一些想法来优化它:

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。如果我有很多消息,它可能会很慢,不是吗?有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我认为你的索引看起来没问题,因为你提到的UPDATE查询以及我想你需要显示聊天的SELECT类型。

但是,如果您预计此表有很多行,我可能会优化这些字段以最小化表大小,以便在增长时保持性能。 sent可以是TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP。我不清楚recddel_from_statusdel_to_status的用途,但如果它们只是布尔值,如果你的MySQL引擎是,你可以使用BIT(1)字段足够现代;如果不是BOOLEAN字段。

使用fromto作为字段名称也很常见,因为这些是保留的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表,以支持用户加入和离开群组聊天。