V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
tanteng
V2EX  ›  MySQL

Mysql 批量插入数据之前判断重复的好的方案?

  •  
  •   tanteng ·
    tanteng · 2016-01-07 09:22:48 +08:00 · 6445 次点击
    这是一个创建于 3244 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 MySQL 做统计,需要查询大量数据计算后重新组装各种数据入库,考虑到大数据量和性能问题,要批量插入数据库,而且可能会出现重复的情况,如何判断重复呢?

    如果在入库前判断重复,需要每条数据都 select 一下判断,不重复的放到数组再一次批量插入,但是这个查询量也是很大的。或者建立联合唯一约束,但是如果其中一条数据插入失败,则整个插入操作都失败。

    现在的做法是先不判断重复,入库后,再找出重复的删掉。。

    有没有更好的办法呢?

    13 条回复    2016-01-07 19:44:59 +08:00
    realpg
        1
    realpg  
       2016-01-07 09:26:05 +08:00
    禁止重复的做唯一性约束
    然后
    insert ignore into
    nightspirit
        2
    nightspirit  
       2016-01-07 09:42:42 +08:00 via iPhone
    可以建立唯一索引,然后记录插入失败的记录
    tanteng
        3
    tanteng  
    OP
       2016-01-07 09:43:45 +08:00
    @nightspirit 唯一索引可以批量插入数据吗,其中一条失败会不会全失败
    est
        4
    est  
       2016-01-07 09:54:31 +08:00
    最快速度导入 mysql 是

    LOAD DATA INFILE 'xxx.csv' IGNORE INTO TABLE 就行了。
    ETiV
        5
    ETiV  
       2016-01-07 10:21:27 +08:00 via iPhone
    如 ls ,最快的导入就是 load data infile

    表引擎换成 myisam ,比 innodb 快 20 倍。
    lyragosa
        6
    lyragosa  
       2016-01-07 10:24:59 +08:00
    ON DUPLICATE KEY?
    lixiaohan
        7
    lixiaohan  
       2016-01-07 10:30:32 +08:00
    做唯一性索引, insert into ignore 就这样了
    500miles
        8
    500miles  
       2016-01-07 11:59:57 +08:00
    如果重复数据 需要被替换更新掉.,

    那么 replace into 或者 on duplicate key 是个好的选择..
    zacard
        9
    zacard  
       2016-01-07 13:15:45 +08:00
    mark
    tanteng
        10
    tanteng  
    OP
       2016-01-07 14:39:08 +08:00
    @500miles 请问用 replace into 需要给字段设置什么吗?比如我对重复的定义是其中 A , B , C 三个字段值如果一样就是重复, replace into 认为什么样的数据是重复?
    timsims
        11
    timsims  
       2016-01-07 15:40:27 +08:00
    insert into ignore 不会进行任何的插入
    on duplicate key 除了唯一 key, 其余字段会覆盖 , 自增的主键不会变化
    replace into 同上,但自增的主键也会有变化(实际上是删了旧的行再插入)
    toben
        12
    toben  
       2016-01-07 19:29:43 +08:00
    @tanteng 唯一主键
    iyangyuan
        13
    iyangyuan  
       2016-01-07 19:44:59 +08:00
    缓存 id
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 13:07 · PVG 21:07 · LAX 05:07 · JFK 08:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.