0

我有一个庞大的数据库,其中大多数字段都是长字符串(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 server 选项吗?我目前正在运行一个 Innodb 引擎。等待索引是不可避免的吗?我必须这样做的原因是因为所有这些列最终都会在某个时候被分组。例如,我想从该表创建另一个表,该表只是唯一的seq,但如果不首先对该表进行索引,则无法执行此操作。我会以正确的方式解决这个问题吗?

此外,对于唯一表,我也尝试过重新上传具有唯一seq索引字段的数据文件。这也花费了太多时间。

非常感谢,

PS,我有一个 24 核 64GB 服务器,我正在使用这些数据。

4

1 回答 1

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)。

于 2012-12-17T05:57:06.203 回答