【问题标题】:Indexing to get unique fields on 500 million row database mysql索引以获取 5 亿行数据库 mysql 上的唯一字段
【发布时间】:2012-12-04 05:44:04
【问题描述】:

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

【问题讨论】:

    标签: mysql indexing large-data


    【解决方案1】:

    使用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时间)。

    【讨论】:

    • 启用键不是必须写一堆临时表,因为有唯一的键,你会修改数据吗?
    • 根据我的回答,DISABLE KEYS 仅适用于 唯一索引。唯一索引必须或当然保持活动状态,mysql 才能保持唯一性。这样做仍然会比不这样做更快。不过,不管你怎么看,都会花很多时间来做很多工作
    • 因此,对于唯一键,无论您是分组方式、上传方式还是其他方式,都将花费大量时间
    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-04-16
    • 2017-03-27
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多