在大表上通过PRIMARY KEY查询进行的更新太慢

时间:2018-08-18 15:44:38

标签: mysql database mariadb myisam

我有一个MyISAM表(在Mariadb上),其中有700万行。

CREATE TABLE `mytable` (
  `id` bigint(100) unsigned NOT NULL AUTO_INCREMENT,
  `x` int(5) unsigned NOT NULL DEFAULT '0',
  `y` int(5) unsigned NOT NULL DEFAULT '0',
  `value` int(5) unsigned NOT NULL DEFAULT '0' 
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10152508 DEFAULT CHARSET=utf8 PAGE_CHECKSUM=1

当我这样做

SELECT * FROM mytable WHERE id = 167880;

大约需要0.272秒

当我这样做

UPDATE mytable SET value = 1 WHERE id = 167880;

随机花费0.200至2.5秒

我一直在想这是因为我的表有很多行,但是通过它的主键来更新一行应该不需要花费太多时间。

由于我在发布之前做了一些研究,所以这里是我已经做过的检查:

  • 没有重复的索引
  • 除主键“ id”外,没有其他索引
  • 没有触发器
  • 试图切换到innoDB引擎,情况更糟(一次更新大约需要6秒)
  • 试图切换到咏叹调引擎,甚至更糟
  • 已经做了优化表;
  • Config是Mariadb的最新版本(全新安装)的默认配置
  • 在未使用其他数据库的情况下进行所有这些检查,因此在测试过程中无需大量阅读

1 个答案:

答案 0 :(得分:0)

我认为问题是您用于id列的数据类型。 使用INT而不是BIGINT可以大大减少磁盘空间。 请改为阅读本文。 http://ronaldbradford.com/blog/bigint-v-int-is-there-a-big-deal-2008-07-18/ 希望对您有帮助