如何提高Mysql表的性能 - 索引,集群,PK?

时间:2013-11-01 10:54:34

标签: mysql indexing primary-key

我有一个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. 主键会对数据进行群集,从而更快地进行查找,并且插入物理上更接近。
  4. 所以这将是我的新定义:

    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 个答案:

答案 0 :(得分:1)

如果你有很多插入,那么

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