[英]Better way of inserting multiple strings in a mysql database
因此,我有一些txt
文件,每個容器大約40萬行。
每行都是一個單詞,如果還不存在,我需要添加到數據庫中。
目前,我用於檢查/添加每個單詞的代碼是
$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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.