Надеюсь, вы можете мне помочь. Я много искал, но, к сожалению, ничего не нашел. В чем проблема? У меня есть большие CSV-файлы с 1 столбцом, который содержит адреса электронной почты. В одном файле около 50000 строк. Я создаю панель администрирования, которая позволяет импортировать эти файлы на сервер, используя HTML-форму и PHP. Импорт CSV в базу данных MySQL через PHP прост, но мне нужно что-то еще - проверьте, все ли электронные письма существуют, а если да - пропустите. В чем проблема? В таблице содержится около миллиона + записей, проверка одного сообщения электронной почты длится +/- 3 секунды. 50000 записей умножается на 3 ... это займет мин. 44 часа! PHP скрипт перестает отвечать на запросы после того, как менее чем за 10 минут ... Так что это невозможно сделать это таким образом:Импорт больших CSV-файлов в базу данных MySQL с использованием PHP с проверкой дубликатов
function doesExist($email) {
$sql = "SELECT count(*) as counter FROM mailing_subscribers WHERE subscriber_email LIKE :subscriber_email";
$sth = $this->db->prepare($sql);
$sth->execute(array(':subscriber_email' => $email));
$row = $sth->fetch();
$counter = $row->counter;
if ($counter > 0) {
return true;
} else {
return false;
}
}
function importCSV($file,$group) {
$fp = fopen($file['tmp_name'], "r");
$importsCounter = 0;
while($csv_line = fgetcsv($fp)) {
for ($i = 0, $j = count($csv_line); $i < $j; $i++) {
if (!$this->doesExist($csv_line[$i])) {
$sql = "INSERT INTO mailing_subscribers(subscriber_email,subscriber_group) VALUES('".$csv_line[$i]."','".$group."')";
$sth = $this->db->prepare($sql);
$sth->execute();
$importsCounter++;
}
}
}
$_SESSION["feedback_positive"][] = FEEDBACK_FILE_IMPORT_SUCCESSFUL . " Utworzonych wpisów: " . $importsCounter;
}
$file
является $_FILE
массив.
Есть ли какой-нибудь другой и более быстрый способ сделать это?
Опустите чек и просто используйте 'INSERT IGNORE'. Также может помочь правильный индекс в столбце электронной почты. – Sirko
Действительно ли это 'WHERE subscriber_email LIKE: subscriber_email', имея ГДЕ И НРАВИТСЯ? Обычно я вижу пример, например 'WHERE subscriber_email = '$ email'. –
@ Fred-ii- Я использую 'LIKE', потому что я не уверен, что' = 'нечувствителен к регистру. – Blacky