【发布时间】:2015-06-08 14:08:41
【问题描述】:
我有 5 个文本字段要导入 MySQL/MariaDB 数据库。但是有两个问题:
(1) 文件非常大:0.5 GB 到 10 GB
(2) 所有相关键都有 40 个字符
第(1)点我必须接受它,我不能改变它。第2点是我关心的。网上有很多建议。例如,将枚举用于 varchar 或使用数字代理。将代理键添加到表中没有问题。但是必须将相同的代理键添加到其他表中。这就是我卡住的地方。
这里是关于文件/表格的具体信息:
-
invoice 表有 3 列和 20 行 Mio:
- 具有不同值的invoice_id(主键)= 行数
- 具有 4,000 个不同值的 praxis_id
- 具有 4 个 Mio 不同值的患者 ID 所有列都是 CHAR(40) 并且固定长度为 40。
-
diagnose 表有 3 列和 25 个 Mio 行:
- invoice_id CHAR(40) 1.4 Mio distinct id
- diagnose_type
- 诊断代码
-
患者表有 5 列,5 行:
- patient_id CHAR(40) 不唯一(4 Mio distinct pat_id)
- praxis_id CHAR(40)
- 出生年份、性别等
例如,我想将发票与诊断和患者一起加入。索引键是有意义的。一种方法是将 invoice.invoice_id 定义为主键,对于表 invoice 中的所有其他键,我将添加一个索引。与表诊断(invoice_id 与 INDEX)和患者(患者 ID 作为主键)相同。
问题在于将 invoice.invoice_id 定义为主键需要很长时间:
ALTER TABLE invoice_id ADD PRIMARY KEY(invoice_id);
一小时后,我终止了该进程。我认为性能问题是由表 invoice 中 invoice_id 的数据类型引起的。一个想法可能是在加载文本文件时添加一个自动递增代理键 invoice_id_surr。但是,如果我想加入表诊断,问题仍然存在,因为我必须加入表诊断的 invoice_id,它没有代理键 invoice_id_surr 作为外键。我可以在 diagnostic.invoice_id 上添加一个索引,但随后我失去了在表格发票上拥有代理键的优势。
我会对如何解决这个问题的策略感兴趣:几个已经存在的表可以连接在一起,但键是 CHAR(40) 并且没有索引。
感谢您的帮助。
更新 1:表格规范
- 键有 40 个字符 [0-9][A-Z]
- 这些是不会再改变的表(没有插入)
-- invoice_id is primary key (unique)
-- patient_id and praxis id for foreign key and not unique in this table
CREATE TABLE invoice (
invoice_id CHAR(40) DEFAULT NULL
, praxis_id CHAR(40) DEFAULT NULL
, patient_id CHAR(40) DEFAULT NULL
, PRIMARY KEY (invoice_id2)
) ENGINE = InnoDB
;
LOAD DATA LOCAL INFILE 'C:/data/invoice.txt'
INTO TABLE invoice
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
;
-- invoice_id is not unique in this table
CREATE TABLE diagnose (
invoice_id CHAR(40) DEFAULT NULL
, diagnose_katalog VARCHAR(20) DEFAULT NULL
, diagnose_code VARCHAR(20) DEFAULT NULL
) ENGINE = InnoDB
;
-- patient_id is not unique in this table since since patient may change praxis
CREATE TABLE patient (
patient_id CHAR(40) DEFAULT NULL
, praxis_id CHAR(40) DEFAULT NULL
, sex CHAR(1) DEFAULT NULL
, birth_year SMALLINT UNSIGNED DEFAULT NULL
, zip_code VARCHAR(20) DEFAULT NULL
) ENGINE = InnoDB
;
【问题讨论】:
标签: mysql indexing primary-key surrogate-key natural-key