索引聊天mysql表

时间:2015-10-05 23:33:08

标签: php mysql

我有这个聊天表:

   CREATE TABLE IF NOT EXISTS `support_chat` (
      `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
      `from` varchar(255) NOT NULL DEFAULT '',
      `to` varchar(255) NOT NULL DEFAULT '',
      `message` text NOT NULL,
      `sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
      `seen` varchar(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`),
      KEY `from` (`from`),
      KEY `to` (`to`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 AUTO_INCREMENT=1 ;

基本上我需要一直选择(每个用户3个)来检查新消息:

select id, `from`, message, sent from support_chat where `to` = ? and seen = 0

我有500万行,通常是100个在线用户同时在线。我可以更改一些东西以使这个表更快吗? key和key是一个不错的选择?

3 个答案:

答案 0 :(得分:1)

以此特定顺序在to和seen列上添加多列索引(到列应该是索引中的第1列)。然后在查询上运行explain select ...以查看是否使用了新索引。

答案 1 :(得分:1)

通过索引可以做很多事情来加速特定查询。你可以在to和seen字段上有一个复合索引,但如果有的话,改进将是最小的。为什么?因为看到的字段具有非常差的基数。您似乎只在其中存储0或1,并且此类列上的索引不是非常有用。通常,查询优化器直接读取数据会更快。

但是你可以做Partition

  

...使您可以分配各个表的各个部分   文件系统根据您可以根据需要设置的规则。在   效果,表的不同部分存储为单独的表   不同的地点。用户选择的划分规则   完成数据称为分区函数,

您可以对数据进行分区,以便将旧数据与新数据分开。这可能会给你一个很大的推动力。但请注意,如果您有一个查询来获取旧数据以及新数据将会慢得多。

您可以执行以下操作:添加限制子句。 您可能只在任何给定时间显示有限数量的消息。设置限制条款会有所帮助。然后mysql知道在找到N行之后不再需要查看。

答案 2 :(得分:0)

假设seen列仅存储2个值('0''1'),而to列存储聊天消息的收件人(电子邮件,用户名),所以它可以有更多的值,我首先使用seento秒的复合索引:

ALTER TABLE support_chat
  ADD INDEX seen_to_ix
    (seen, `to`) ;

反向排序(`to`, seen)的复合索引也是一个不错的选择。它甚至可能更好,具体取决于服务器负载和表更新的频率。一个优点(如果您决定使用第二个索引)是您可以删除(`to`)索引  选择并添加两个索引中的一个并再次检查查询的性能。

附加说明:

  • 使用varchar(1)来表示本质上是一个布尔值并不是最佳的。更糟糕的是它是utf8mb4字符集。它使用5个字节! (1表示变量,4表示单字节!)
    我会将该列的类型更改为tinyint(并存储01)或bit

  • 请避免对表名和列名使用保留字(例如fromto)。