1

我有一个 mysql 表,它每分钟存储有关我们用户的状态信息,但是插入开始需要 30 秒才能完成 - 我们仍处于私人测试版,只有几十个用户,但需要能够处理数千。

使用信息:

  • 插入:每个用户大约每分钟插入一次新行
  • 更新:每隔几分钟,最后几行将使用修改后的数据更新,每个用户
  • 删除:超过 6 个月前的条目每天删除一次
  • 选择:每个用户每天只有大约 10 个选择(有些选择每个用户当天的所有行,有些只获取用户的最新行。)
  • 我们正在使用 AWS RDS,如果这会影响任何东西(Mysql 5.5.27)

这是我继承的表定义:

CREATE TABLE statusMonitor (
  personId          int(10) unsigned  NOT NULL,
  monitorDateTime   datetime          NOT NULL,
/*
Other columns
*/
  UNIQUE KEY UQIX_statusMonitor (personId,monitorDateTime) USING BTREE,
  KEY personId (personId,monitorDateTime/* other cols */)
) ENGINE = MyISAM;

我想到了三个变化,这些变化是否正确?

  1. 对于高写入表,InnoDB将是比 MyISAM 更好的选择。
  2. 我认为首先根据日期进行索引会更有效率
  3. 主键会聚集数据,使查找更快,并且插入会在物理上更靠近。

所以这将是我的新定义:

CREATE TABLE statusMonitor (
  personId          int(10) unsigned  NOT NULL,
  monitorDateTime   datetime          NOT NULL,
/*
Other columns
*/
  PRIMARY KEY (
      monitorDateTime,
      personId
  ),
  UQIX_statusMonitor (monitorDateTime,personId) USING BTREE,
  KEY personId (monitorDateTime,personId/* other cols */)
) ENGINE = InnoDB;

因为我们的用户很少,所以我可以通过更改表定义来破坏一段时间,但宁愿第一次就正确,所以它只发生一次。

4

1 回答 1

1

InnoDB如果你有很多插入会很好,因为每个插入都会锁定整个表,以防万一MyISAM,而只有一行InnoDB。您也可以考虑垂直和/或水平分区。小心使用 KEY,其中太多可能会减慢请求速度。

于 2013-11-04T10:07:51.710 回答