所以,我有几个txt
个文件,每个容器大约有400,000行。
每一行都是一个单词,我需要添加到我的数据库中,如果它不在那里。
目前我检查/添加每个单词的代码是
$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;
}
我正在寻找一种更好的方法将每个单词插入数据库。
非常感谢任何想法。
答案 0 :(得分:1)
我可以考虑一些方法来做到这一点。
首先,如果您可以访问MySQL服务器的文件系统,则可以使用LOAD DATA INFILE
创建新表,然后从该新表插入到word_list表中。这很可能是您最快的选择。
其次(如果您无法访问MySQL服务器的文件系统),请在word_list.word
上放置主键或唯一索引。然后摆脱SELECT
查询并使用INSERT IGNORE INTO word_list ...
。这将允许MySQL自动跳过重复项,而无需您使用查询/插入操作。
第三,如果您的表使用处理事务的访问方法(InnoDB,而不是MyISAM),请在开始插入循环之前发出BEGIN;
语句。然后,每隔几百行发出COMMIT;BEGIN;
。然后在最后一期COMMIT;
。这将把您的操作包装在多行交易中,因此会加快速度。
答案 1 :(得分:0)
试试这段代码。它将首先使用您的所有值创建查询,您将仅运行查询ONCE ...不会一次又一次地运行
$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);