我有一个 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;
我想到了三个变化,这些变化是否正确?
- 对于高写入表,InnoDB将是比 MyISAM 更好的选择。
- 我认为首先根据日期进行索引会更有效率
- 主键会聚集数据,使查找更快,并且插入会在物理上更靠近。
所以这将是我的新定义:
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;
因为我们的用户很少,所以我可以通过更改表定义来破坏一段时间,但宁愿第一次就正确,所以它只发生一次。