我有一个庞大的数据库,大多数字段都是长字符串(DNA序列)。目前它大约有5亿行。对于我的初始表,我只想要实现这个数据结构的所有5亿行。
Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Null
0 | PRIMARY | 1 | prim_id | A | 2654074 | NULL | NULL |
1 | cdr3seq | 1 | cdr3seq | A | 2654074 | NULL | NULL |
1 | cdr3aa | 1 | cdr3aa | A | 2654074 | NULL | NULL |
1 | v_gene | 1 | vg | A | 53081 | NULL | NULL |
1 | d_gene | 1 | dg | A | 46562 | NULL | NULL |
1 | j_gene | 1 | jg | A | 14269 | NULL | NULL |
1 | donor | 1 | donor | A | 1092 | NULL | NULL |
1 | seq_id | 1 | seq_id | A | 2654074 | NULL | NULL |
1 | seq | 1 | seq | A | 2654074 | NULL | NULL |
它们都是B-tree和同一个表(忽略不适合 - 忽略这是从上传过程中取得的基数)。我只需使用auto_increment主id(prim_id)就可以轻松上传此表。但是当我添加索引时,需要永远写出巨大的临时表。另一方面,如果我先设计表格,则需要永久上传。是否有一些我错过的SQL服务器选项?我目前正在运行Innodb引擎。正在等待索引不可避免的东西吗?我必须这样做的原因是因为所有这些列最终都会在某个时刻被分组。例如,我想从这个表创建另一个表,它只是唯一的seq
,但是如果没有首先对该表进行索引,则不能这样做。我是以正确的方式来做这件事的吗?
此外,对于唯一表,我还尝试使用唯一的seq
索引字段重新上载数据文件。这也花费了太多时间。
非常感谢,
PS,我有一个24核的64GB服务器我正在使用这个数据。答案 0 :(得分:0)
使用mysql,您可以暂时禁用非唯一索引:
ALTER TABLE tbl_name DISABLE KEYS;
-- Do lots of inserts without updating the index every row
ALTER TABLE tbl_name ENABLE KEYS; -- Indexes are refreshed once here
要进一步加速插入,请将插入包装在事务中,而不是为每个插入提交:
ALTER TABLE tbl_name DISABLE KEYS;
START TRANSACTION;
-- Do lots of inserts without updating the index or committing every row
COMMIT; -- Inserts are committed in one operation here
ALTER TABLE tbl_name ENABLE KEYS; -- Indexes are refreshed once here
确保在每次交易中都不加载太多,否则你会点击日志高水位并获得异常,所有内容都会被回滚(试错,但请尝试10000时间)。