【问题标题】:How to improve performance on Mysql table - index, clustering, PK?如何提高 Mysql 表的性能 - 索引、集群、PK?
【发布时间】:2013-11-01 10:54:34
【问题描述】:

我有一个 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;

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

【问题讨论】:

    标签: mysql indexing primary-key


    【解决方案1】:

    InnoDB 如果你有很多插入会很好,因为在MyISAM 的情况下每个锁定整个表,而在InnoDB 的情况下只锁定一行。 您也可以考虑垂直和/或水平分区。 小心使用 KEY,太多会降低请求速度。

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 2011-09-17
      • 1970-01-01
      • 2010-12-30
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多