我有一个 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;
因为我们的用户相当少,所以我可以通过更改表定义来破坏一段时间,但宁愿第一次就做对,所以它只发生一次。
如果您有很多插入内容,InnoDB
会很好,因为每个插入物都会在MyISAM
的情况下锁定整个表,而在InnoDB
的情况下只有一行。您也可以考虑垂直和/或水平分区。小心使用 KEY,其中太多可能会减慢请求速度。