2014-10-31 42 views
1

所以插入多個字符串的更好的辦法,我有幾個txt文件,每個集裝箱約40萬線。在MySQL數據庫中

每一行都是一個字,我需要添加到我的數據庫,如果不是在那裏了。

目前我檢查代碼/添加的每個字都是

$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

你有訪問MySQL服務器的文件系統?這些文本文件中的內容是什麼 - 只是文本,還是每行都有時間戳或其他信息?你使用什麼訪問方法? – 2014-10-31 12:40:54

回答

0

嘗試這個代碼。它將首先與所有你的價值觀建立查詢,你將運行查詢只有一次......不是一次又一次,直到永遠排

$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); 
1

我能想到的一些方法來做到這一點。首先,如果您有權訪問MySQL服務器的文件系統,則可以使用LOAD DATA INFILE創建一個新表,然後從該新表執行插入到word_list表中的操作。這很可能是你最快的選擇。

秒(如果你沒有訪問MySQL服務器的文件系統),穿上word_list.word主鍵或唯一索引。然後擺脫你SELECT查詢和使用INSERT IGNORE INTO word_list ...。這將允許MySQL自動跳過重複的項目,而無需通過查詢/插入操作來完成。第三,如果您的表使用處理事務(InnoDB,而不是MyISAM)的訪問方法,則在開始插入循環之前發出BEGIN;語句。然後每隔幾百行發行COMMIT;BEGIN;。然後在最後問題COMMIT;。這將把你的操作包裝在多行交易中,這樣會加速很多事情。