什么是插入此数据的最快方法

时间:2015-06-18 03:06:33

标签: mysql sql database performance csv

好的,我有一个名为entries的MySQL表,其中包含name VARCHAR(255) NOT NULLaddress VARCHAR(255)

该表有大约一百万套数据。

对于每组数据,name都有一个值,例如: "约翰"地址为NULL。

例如:

+------+---------+
| name | address |
+------+---------+
| john | NULL    |
+------+---------+
| jake | NULL    |
+------+---------+
| zach | NULL    |
+------+---------+

我收到了一个CSV文件,其中包含name:address格式的名称及其对应的地址。

就像我说的那样,entries表有近百万个条目,因此csv文件大约有800,000行。

我想在csv中取每行,并插入名称相同的地址:

UPDATE `entries` SET `address` = <address from csv> WHERE `name` = <name from csv>;

我制作了一个Python脚本来打开逐行读取的csv文件。对于每一行,它会将名称和地址存储在单独的变量中。然后它会执行上面的查询,但是将数据插入列中需要很长时间。

无论如何我可以在MySQL中做到这一点,如果是这样,最快的方法是什么?

感谢。

3 个答案:

答案 0 :(得分:1)

您可以使用mysql LOAD DATA INFILE将CSV文件导入单独的表中,然后根据类似的列名使用JOIN语句更新条目表。

E.g: 更新条目a.name = b.name上的内连接new_table b设置a.address = b.address;

此处从CSV文件中导入new_table ..

不要忘记在名称列的两个表上添加索引,以便它快速...

答案 1 :(得分:1)

创建table1和table2

for ($i=count($array); i>0; $i--;)
{
 if(condition)
 {DO SOMETHING like print the element in a decreasing manner}
 if(enter ending iteration condition here after xth element) break;
}

同样将file2改为table2

继续

答案 2 :(得分:0)

确实使用批量查询会更快。您可以使用for循环扫描CSV文件并创建执行大批量查询的字符串。

例如(伪代码):

String Query ="UPDATE entries SET Value = ( CASE ";

For (begin of file to end)

    Name = NameFromFile;
    Value = ValueFromFile;
    Query += "WHEN NameField = ";
    Query += Name + " THEN " +Value;

End

Query+= " )";

当然,连接时需要将这些值转换为字符串。我不会说这是最快的,但肯定更快。

抱歉格式不佳,我在手机上。