2013-11-01 43 views
1

我有一个mysql表,它存储有关我们的用户在每分钟的基础上的状态信息,但插入已经开始需要长达30秒才能完成 - 我们仍然在只有几十个用户的私人测试版,但需要能够处理数千人。如何提高Mysql表上的性能 - 索引,集群,PK?

使用信息:

  • 插入:一个新行插入每分钟一次,每用户
  • 更新:每隔几分钟最后几排将与修正后的数据进行更新,每个用户
  • 删除:超过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; 

因为我们有相当一些用户,我可以负担得起通过改变表定义,打破东西了一小会儿,但更希望得到正确的结果第一次,所以它只发生一次。

回答

1

InnoDB将是很好的,如果你有很多的插件,因为每锁全表的MyISAM情况下,和在InnoDB情况下,只有一排。 你也可以考虑垂直和/或水平分区。 小心使用KEY,其中太多会减慢请求速度。