Итак, у меня есть несколько 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;
}
Я ищу лучший способ вставить каждое слово в базу данных.
Любые идеи очень приветствуются.
Я могу придумать несколько способов сделать это.
Во-первых, если у вас есть доступ к файловой системе сервера 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);