在mysql数据库中插入多个字符串的更好方法


Better way of inserting multiple strings in a mysql database

所以,我有几个txt文件,每个容器大约有400000行。

每一行都是一个单词,如果它还没有在数据库中,我需要添加到数据库中。

目前我检查/添加每个单词的代码是

$sql = mysql_sql("SELECT `id` FROM `word_list` WHERE `word`='{$word}' LIMIT 1");
$num = mysql_num($sql);
if($num == '0'){
    $length = strlen($word);
    $timestamp = time();
    @mysql_sql("INSERT INTO `word_list` (`word`, `length`, `timestamp`) VALUES ('{$word}', '{$length}', '{$timestamp}')");
}

被调用的函数有:

function mysql_sql($sql){
    global $db;
    $result = $db->query($sql);
    return $result;
}
function mysql_num($result){
    return $result->num_rows;
}

我正在寻找一种更好的方法将每个单词插入数据库。

任何想法都将不胜感激。

我可以想出一些方法来做到这一点。

首先,如果您可以访问MySQL服务器的文件系统,则可以使用LOAD DATA INFILE创建一个新表,然后将该新表插入到word_list表中。这很可能是你最快的选择。

其次(如果您无法访问MySQL服务器的文件系统),请在word_list.word上放置主键或唯一索引。然后去掉SELECT查询并使用INSERT IGNORE INTO word_list ...。这将允许MySQL自动跳过重复项,而不需要您使用查询/插入操作。

第三,如果您的表使用处理事务的访问方法(InnoDB,而不是MyISAM),请在开始插入循环之前发出BEGIN;语句。然后每隔几百行发出COMMIT;BEGIN;。然后在最后发布COMMIT;。这将把您的操作封装在多行事务中,因此会大大加快速度。

试试这个代码。它将首先使用您的所有值创建查询,并且您将只运行一次查询。。。不会一次又一次的行

$values = array();
$sql = mysql_sql("SELECT `id` FROM `word_list` WHERE `word`='{$word}' LIMIT 1");
$num = mysql_num($sql);
$insert_query = "INSERT INTO `word_list` (`word`, `length`, `timestamp`) VALUES ";
if ($num == '0') {
    $length = strlen($word);
    $timestamp = time();
    $values[] = "('$word', '$length', '$timestamp')";
}
$insert_query .= implode(', ', $values);
@mysql_sql($insert_query);