我有 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 的固定长度。
表诊断有 3 列和 25 Mio 行:
- invoice_id CHAR(40) 1.4 Mio distinct id
- 诊断类型
- 诊断代码
表患者有 5 列和 5 Mio 行:
- patient_id CHAR(40) 不唯一(4 Mio distinct pat_id)
- praxis_id CHAR(40)
- 出生年份、性别等
例如,我想将发票与诊断和患者一起加入。索引键是有意义的。一种方法是将 invoice.invoice_id 定义为主键,对于表 invoice 中的所有其他键,我将添加一个索引。与表诊断(invoice_id with INDEX)和患者(patient_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][AZ]
- 这些表格不再更改(无插入)
-- 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
;