我正试图从一个大数据库中导入数据。我有两张有几十万张唱片的桌子。我必须在两个表中搜索数据,然后在新表(第三表)中插入该记录,如果记录已经存在于第三个表中,那么我必须更新第三表中的一个列记录。
这听起来很容易,但处理起来要花很长时间。
下面是示例查询和伪代码:

select * from table1 INNER JOIN table2 USING(id)

search in table 3 ->
 if record exist{
  update record in table 3 (update counter in a column)
 }else{
  Insert new record in table 3
 }

第一和第二个表有二十多万条记录。当我开始在第三个表中插入记录时,它会扼杀整个速度,因为它还必须在第三个表中搜索以更新或插入记录。
Database Name = MySql
Language = Php

怎么了?我该如何改进?我等不及要处理它:(
谢谢
编辑:
在表3中,id有主键,所有其他列都是正常的。数据库架构太大而且复杂。你们要不要,我在这里贴上一百行?
你们能指出我的伪代码和查询中的错误吗?我可以使用什么索引或结构来提高性能??
结构
Table 1 - usr_id, first name, last name (usr_id is primary key)
Table 2 - id, usr_id, amount (id is primary key and usr_id is foreign key)

Table 3 - new_id , first name, last name, usr_id, total_amount (new_id is primary key and usr_id is foreign key

)
我检查表3的名字和姓氏是否相同,然后更新总数,如果它们不同,则插入新记录

最佳答案

从您的伪代码中,我看到您检查表3中的记录存在于select * from table1 INNER JOIN table2 USING(id)中的每个记录。您最终会得到数千个降低性能的select命令。你可以通过

select t1.*, t2.*, t3.pk_field from table1 t1 INNER JOIN table2 t2 USING(id)
LEFT JOIN table3 t3 ON (join codition)

现在可以测试t3.pk_field是否为空(如果为空则插入,否则更新)。下一步要改进它,就是按照jasonbar的建议,使用INSERT ON DUPLICATE KEY UPDATE编写一个处理所有事情的查询:
INSERT INTO table3(col1, col2,...)
 select t1.col1, t1.col2, t2.col3, ....
 from table1 t1 INNER JOIN table2 t2 USING(id)
ON DUPLICATE KEY UPDATE counter = new_value

10-08 04:54