将唯一联系人批量导入sql(php、mysql)的更好方法

将唯一联系人批量导入sql(php、mysql)的更好方法,php,mysql,Php,Mysql,我需要导入一个非常大的联系人列表(csv格式的姓名和电子邮件,PHP->MySQL)。我想跳过现有的电子邮件。我目前的方法在生产数据库中非常慢,数据量很大 假设100个联系人(可能是10000个联系人) 原始步骤 得到了输入数据 检查表中的每个联系人是否存在电子邮件 100选择 将质量插入到表中 插入值(),(),() 1插入 这太慢了 我想改进流程和时间 我想到了两种方法 方法1 为临时空间创建max_addressbook_temp(与max_addressbook的结构相同) 清除

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

假设100个联系人(可能是10000个联系人)

原始步骤

  • 得到了输入数据
  • 检查表中的每个联系人是否存在电子邮件
    • 100选择
  • 将质量插入到表中
    • 插入值(),(),()
    • 1插入
  • 这太慢了

    我想改进流程和时间

    我想到了两种方法

    方法1

  • 为临时空间创建max_addressbook_temp(与max_addressbook的结构相同)
  • 清除/删除max_addressbook_temp中用户的所有记录
  • 在max_addressbook_temp中插入所有记录
  • 创建重复记录列表(用于前端)
  • 将max_addressbook_temp中的唯一记录插入max_addressbook
  • 优势

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

    • 需要一张单独的桌子吗
    方法2

  • 创建unqiue索引(图书\用户名\ id,图书\电子邮件)
  • 对于每条记录,使用插入忽略到。。。(这将忽略重复的图书\用户名\ id、图书\电子邮件)
  • 优势

    • 更少的代码
    劣势

    • 无法显示未导入的联系人
    • 速度较慢,要导入100条记录,需要调用100 insert
    有什么反馈吗?将大量地址导入数据库的最常见和最有效的方法是什么

    =====

    下面是方法1的更多细节。你认为这是个好主意吗

    有4个步骤

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

    delete max_addressbook_temp where book_user_id = 
    
    //插入导入数据,不检查是否存在重复数据

    insert into max_addressbook_temp values (), (), ()....
    
    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
    
    //选择要显示或计数的重复数据

    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_temp values (), (), ()....
    
    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
    
    插入最大地址簿t1
    从最大地址簿温度t2中选择*
    其中t1.book\u user\u id=t2.book\u user\u id
    和t1.book\u email t2.book\u email
    
    Q:Wny不使用mySQL吗

    例如:

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

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

    问题1:如何将.csv文件读入mySQL数据库

    我希望你考虑一下< /P> 问题2:如何将.csv中的数据与mySQL中已有的数据进行“区分”(或者两个文件中的行相交;或者一个文件中的行,而不是另一个文件)

    答:没有“有效”的方法。不管你怎么做,你很可能会做一件好事

    我建议如下:

  • 将.csv数据加载到临时表中

  • 执行以下两个表中的一个:

    选择tableA.id 从表格 其中tableA.id位于(从tableB中选择id)

  • 保存“相交”查询的结果

  • 将.csv数据加载到实际数据库中


  • 数据来自网站上的文本字段。我仍然喜欢显示未导入的联系人列表,如果可能并且不会对速度造成太大影响的话。我在网站上有一个带有文本框的页面,用户可以在其中输入要导入的联系人列表。当用户单击导入按钮时,我处理列表并将其导入地址表。然后显示导入和未导入(复制)的联系人数。我还显示未导入的联系人列表。“加载数据导入”不会为我提供未导入的联系人列表,对吗?请参阅上面的评论。用户在网页的文本字段中输入(或复制粘贴)该列表。没有csv文件上载。数据来自csv格式的网站上的文本字段,即名称、电子邮件。我仍然喜欢显示一个没有导入的联系人列表,如果可能的话,如果它不会对速度造成太大影响的话。你说的不太有道理。下面的答案是正确的method@Strawberry我在网站上有一个带有文本框的页面,用户可以在其中输入要导入的联系人列表。当用户单击导入按钮时,我处理列表并将其导入地址表。然后显示导入和未导入(复制)的联系人数。我还显示未导入的联系人列表。加载数据导入不会给我一个未导入的联系人列表,对吗?