【问题标题】:Slow inserts on database due to primary key由于主键,数据库上的插入速度很慢
【发布时间】:2012-12-14 14:48:24
【问题描述】:

获得了一个 MySQL 数据库,其中包含一个包含基于邮政编码和门牌号的值的表。因此,主键选择为邮政编码和门牌号,因为这些是要搜索的字段。该数据库包含大约 1000 万条记录。

一个特定的邮政编码包含约 100000 个不同的门牌号,插入速度极慢(每 10000 条记录需要 1 小时)。

编程语言是 Java,我在一批 10000 条中使用准备好的语句,自动提交为 false。

表格结构如下:

+-----------------+-------------+------+-----+---- -----+--------+ |领域 |类型 |空 |钥匙 |默认 |额外 | +-----------------+-------------+------+-----+---- -----+--------+ |邮政编码 | varchar(6) |否 |优先级 |空 | | |房子_no |整数(11) |否 |优先级 |空 | | |沙码 | varchar(45) |否 | |空 | | |仓库 | varchar(3) |否 | |空 | | |网络点 | varchar(6) |否 | |空 | | |地区 | varchar(3) |否 | |空 | | |序列 |整数(11) |否 | |空 | | | cluster_id | varchar(1) |否 | |空 | | | strand_id |整数(11) |否 | |空 | | | strand_props_id |整数(11) |否 | |空 | | |版本号 |整数(11) |否 |优先级 |空 | | +-----------------+-------------+------+-----+---- -----+--------+

谁知道这个问题的解决方案?谢谢!

【问题讨论】:

  • 在这种情况下,邮政编码和门牌号码可能不是一个好的主键。原因是主键是唯一的。这意味着当邮政编码和门牌号是主键时,每个邮政编码中的每个数字只能有一个房子。你知道吗?
  • @Philipp,我认为 OP 有一个复合键,即由多个字段组成的键。在这种情况下,我看不出这有什么问题?不过,我仍然建议使用代理键。
  • @KingCronus 这绝对是个问题,因为一个 ZIP 包含多条街道。
  • 复合主键无论如何都不是一个好主意。为此使用序列号,稍后再考虑强制执行任何唯一性约束。
  • @MarkoTopolnik - 哇...显示我今天需要额外的咖啡,当然你是对的!我没有考虑这种情况,在英国(我所在的地方)我认为每条街道都有不同的代码。

标签: java mysql performance


【解决方案1】:

当您需要插入大量行时,首先删除键,然后插入所有数据,然后重新创建键可能会更快。这样数据库就不需要花费大量时间来更新这些键。

【讨论】:

    【解决方案2】:

    如果您不尝试从 GUI 加载数据,我会推荐 sql loader,它可以非常快地加载所有数据。

    https://metacpan.org/pod/SQL::Loader::MySQL

    http://www.roseindia.net/sql/mysql-example/loader-tutorial.shtml

    【讨论】:

    • 如果是第一次加载,那么您可以采用这种方法,并在初始加载完成后让您的应用程序接管数据库。如果您觉得有帮助,请接受。
    • 供参考:不要评论自己的答案; 编辑它。评论在 StackOverflow 上被视为二等公民,与其说是一项功能,不如说是一种必要的邪恶。
    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2017-06-03
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多