索引以获得500万行数据库mysql的唯一字段

时间:2012-12-17 05:44:58

标签: mysql indexing large-data

我有一个庞大的数据库,大多数字段都是长字符串(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服务器我正在使用这个数据。

1 个答案:

答案 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时间)。