2012-12-17 11 views
0

我有一个庞大的数据库,其中大多数字段都是长字符串(DNA序列)。目前它约有5亿行。对于我的初始表,我只希望所有5亿行实现到这个数据结构中。索引获得500万行数据库上的唯一字段mysql

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树和同一个表(忽略基数 - 这是从上传过程中取的)。我只需使用auto_increment主标识(prim_id)即可轻松上传此表。但是当我添加索引时,需要永远写出大量的临时表。另一方面,如果我先设计表格,则需要永久上传。有没有一些SQL服务器选项我错过了?我目前正在运行Innodb引擎。正在等待索引不可避免的内容?我必须这样做的原因是因为所有这些列最终都会在某个时候分组。例如,我想从此表中创建另一个表,这些表只是唯一的seq,但如果没有首先对此表进行索引,则无法执行此操作。我是否以正确的方式去做这件事?

另外,对于独特的表格,我也试过只重新上传带有唯一seq索引字段的数据文件。这也花费了太多时间。

非常感谢,

PS,我有我的工作只有这个数据的24核服务器64GB。

回答

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

+0

不会启用键只需写一堆临时表,因为有唯一的键,你会有数据修改? – jwillis0720

+0

根据我的回答,'DISABLE KEYS'只适用于*非*唯一索引。对于mysql来说,唯一索引必须或当然保持活动才能保持唯一性。这样做仍然会比没有更快。然而,无论如何,你看,它需要很多时间来做很多工作 – Bohemian

+0

所以对于唯一的键,无论你是分组,上传,还是别的什么,它将花费大量的时间 – jwillis0720