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条数据的散列值。
谢谢你的建议。布莱恩
2条答案
按热度按时间6yoyoihd1#
更改
UNIQUE
关键在于PRIMARY
. 这可能不会有任何影响,但是,它会让你的意图更加清晰。重复数据应该可以正常工作。
为了获得更好的性能,请在开始加载之前根据pk对传入数据进行排序。
你装的怎么样?如果您收到csv文件中的数据,
LOAD DATA
是最好的,多排INSERTs
是第二好的;一次一排是最慢的。uuid对性能非常不利;别这么做。
innodb_buffer_pool_size
应该是可用内存的70%。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
列以获得更好的性能。