mysql表性能优化-hash作为主键还是唯一键

ohfgkhjo  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(406)

update*:在查看我的python脚本之后,我发现在插入记录之前准备和计算数据是最长的处理时间。。。不是db插件。实际上,插入速度相对较快(对于表大小为1000000条记录的10000条记录,插入时间约为30秒)。不过,我认为我在这个问题上得到的反馈也会帮助我优化插入。感谢所有回复的人。现在我开始尝试优化python脚本来加速它。
我目前有一个mariadb表,其结构如下:

CREATE TABLE IF NOT EXISTS `adeck_errors` (
  `StormID` varchar(8) NOT NULL DEFAULT '1',
  `ModelBaseTime` datetime NOT NULL,
  `Model` varchar(4) NOT NULL,
  `Tau` smallint(4) NOT NULL,
  `LatCARQ` float DEFAULT NULL,
  `LonCARQ` float DEFAULT NULL,
  `LatModel` float DEFAULT NULL,
  `LonModel` float DEFAULT NULL,
  `DistError` smallint(6) DEFAULT NULL,
  `WindCARQ` int(11) DEFAULT NULL,
  `WindModel` int(11) DEFAULT NULL,
  `WindError` smallint(6) DEFAULT NULL,
  `PresCARQ` int(11) DEFAULT NULL,
  `PresModel` int(11) DEFAULT NULL,
  `PresError` smallint(6) DEFAULT NULL,
  UNIQUE KEY `StormID` (`StormID`,`ModelBaseTime`,`Model`,`Tau`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

如您所见,我的唯一键跨表中的4个字段,以确保我不会得到任何重复的条目。当我在一个已经包含一百万条记录的表中插入10000多条记录时,这大约需要15-20分钟,我想加快这个过程。
我的问题是,最好在4个字段中创建一个散列数据,并将该散列用作主键,这样就不会有重复的数据了?当我在插入之前处理数据时(使用python),我可以在进入db insert函数之前快速创建4条数据的散列值。
谢谢你的建议。布莱恩

6yoyoihd

6yoyoihd1#

更改 UNIQUE 关键在于 PRIMARY . 这可能不会有任何影响,但是,它会让你的意图更加清晰。
重复数据应该可以正常工作。
为了获得更好的性能,请在开始加载之前根据pk对传入数据进行排序。
你装的怎么样?如果您收到csv文件中的数据, LOAD DATA 是最好的,多排 INSERTs 是第二好的;一次一排是最慢的。
uuid对性能非常不利;别这么做。 innodb_buffer_pool_size 应该是可用内存的70%。

wa7juj8i

wa7juj8i2#

当前您没有“正确”或“正常”主键。这是相关的,因为主键被用作所谓的聚集索引来对磁盘上的行进行排序。innodb将选择下一个合适的键作为聚集索引的候选键:
如果不定义 PRIMARY KEY 对于您的表,mysql定位第一个 UNIQUE 索引所有键列所在的位置 NOT NULL innodb使用它作为聚集索引。
在您的情况下,它是唯一存在的唯一密钥 "StormId" . 您的行在磁盘上按此键排序,现在您遇到的问题与使用guid/uuid作为主键相同。当你阅读诸如mysql中int和uuid之间的区别之类的问题和文章时,http://kccoder.com/mysql/uuid-vs-int-insert-performance/ 或者https://www.percona.com/blog/2007/03/13/to-uuid-or-not-to-uuid/ 你看你不应该用这样的键来排序磁盘上的行。
创建法线 BIGINT AUTO_INCREMENT PRIMARY KEY 列以获得更好的性能。

相关问题