我得和 Gaëtan Gates Perrault 一起建议你的模式设计或环境可能有问题。

1000 万条记录并不是很多。

组织良好的 MySQL 实例可以处理针对具有数十亿条记录的表的单记录查找查询,如果查询使用主键并且有大量可用的缓冲池,则这些查询可以在几毫秒内完成。

 几个问题:

  • 您是否使用 InnoDB(或 XtraDB,这是 InnoDB 的 Percona 版本)?如果没有,请立即停止。 MyISAM 不应该用于生产应用程序,除非在极少数情况下,而且目前它比 InnoDB 慢得多。

  • 您是否拥有配置良好的数据库服务器实例,以及足够的 innodb_buffer_pool?该数据库足够小,整个数据库可能可以容纳在 RAM 中。

  • 您的数据库实例是在一台机器上单独运行,还是与加载该机器的应用程序在同一台机器上运行?

  • 您分析过您的实际查询吗?您可能在主要查询之一的某个位置进行了表扫描。

    或者您可能正在执行不使用索引的 ORDER BY,因此它需要主动排序;由于聊天应用程序必须经常获取最新的聊天记录,因此这是一种可能性。

  • 最后,您可能想探索按日期分区。