将唯一联系人大量导入sql(php,mysql)

时间:2017-12-12 05:21:24

标签: php mysql

我需要导入一个非常大的联系人列表(csv格式的名称和电子邮件,PHP - > MySQL)。我想跳过现有的电子邮件。我当前的方法在生产数据库中非常慢,有很多数据。

假设有100个联系人(可能是10,000个联系人)

原创步骤

  1. 获得了输入数据
  2. 检查表格中的每个联系人是否有现有电子邮件
    • 100选择
  3. 质量插入表中
    • 插入值(),(),()
    • 1 insert
  4. 这很慢。

    我想改善流程和时间。

    我想过两种方法。

    方法1

    1. 为临时空间创建max_addressbook_temp(与max_addressbook相同的结构)
    2. 清除/删除max_addressbook_temp
    3. 中用户的所有记录
    4. 在max_addressbook_temp
    5. 中插入所有记录
    6. 创建重复记录列表(前端)
    7. 将max_addressbook_temp中的唯一记录插入max_addressbook
    8. 优点

      • 可以获取要在前端显示的重复记录列表
      • 非常快 - 想要导入100条记录,总是只需要2个sql调用:1个插入值,1个插入到选择

      缺点

      • 需要一个单独的表格

      方法2

      1. 创建unqiue索引(book_user_name_id,book_email)
      2. 对于每条记录,使用insert ignore into ...(这将忽略重复的book_user_name_id,book_email)
      3. 优点

        • 少代码

        缺点

        • 无法显示未导入的联系人
        • 较慢,想要导入100条记录,需要调用100个插入

        有任何反馈意见吗?最常见的是什么?将大量地址导入数据库的有效方法?

        =====

        以下是方法1的更多细节。您认为这是一个好主意吗?

        有4个步骤。

        • 清除用户的临时数据
        • 插入导入数据,而不是检查重复的
        • 选择要显示或计数的重复数据
        • 插入不重复的数据

        //清除用户的临时数据

        delete max_addressbook_temp where book_user_id = 
        

        //插入导入数据,而不是检查重复的

        insert into max_addressbook_temp values (), (), ()....
        

        //选择要显示或计数的重复数据

        select * from max_addressbook_temp t1, max_addressbook t2
        where t1.book_user_id = t2.book_user_id
        and t1.book_email = t2.book_email
        

        //插入不重复的数据

        insert into max_addressbook t1
        select * from max_addressbook_temp t2
        where t1.book_user_id = t2.book_user_id
        and t1.book_email <> t2.book_email
        

1 个答案:

答案 0 :(得分:1)

问:不使用mySQL BULK INSERT

实施例

LOAD DATA INFILE 'C:\MyTextFile'
INTO TABLE myDatabase.MyTable
FIELDS TERMINATED BY ','

附录:

听起来你实际上是在问两个单独的问题:

Q1:如何将.csv文件读入mySQL数据库?

答:我敦促您考虑LOAD DATA INFILE

Q2:我如何&#34;差异&#34; .csv中的数据与mySQL中的数据(两者中的行的交集;或者一行中的行,而不是另一行中的数据)?

答:没有效率&#34;方法。无论你怎么做,你都可能会做full-table scan

我建议如下:

  1. 将.csv数据加载到临时表

  2. 执行两个表中的INTERSECT

    SELECT tableA.id 来自tableA WHERE tableA.id IN(SELECT id FROM tableB);

  3. 保存&#34;相交&#34;的结果查询

  4. 将.csv数据加载到实际的