2009-12-19 2 views
0

Использование PHP (1900 СЕК ограничения по времени и более чем 1 Гб ограничения по памяти) и MySQL (с использованием PEAR :: MDB2) на этом ...несколько запросов MySQL, и как сделать мой сценарий быстрее

Я пытаюсь создать поисковую систему, которая будет загружать данные из фидов сайтов в базе данных mysql. На некоторых сайтах есть довольно большие каналы с большим количеством данных в них (например, более 80 000 записей всего в одном файле). Некоторые проверки данных для каждой из записей выполняются до вставки записи в базу данных (проверка данных, которая также может вставлять или обновлять таблицу mysql).

Моя проблема заключается в том, что многие из вас, возможно, уже поняли ... время! Для каждой записи в фиде имеется более 20 проверок, а для фида, например: 10.000 записей, может быть> 50.000 вставок в базу данных.

Я пытался сделать это с 2-мя способами:

  1. Прочитайте корм и хранить данные в массиве, а затем цикл через массив и сделать проверку данных и вставки. (Это самый быстрый из всех)
  2. Прочтите фид и выполните проверку данных по строкам и вставьте.

База данных использует индексы для каждого поля, которое постоянно запрашивается. PHP-код настраивается без дополнительных переменных, а SQL-запросы - это простые операции выбора, обновления и вставки.

Установка ограничений по времени и памяти также не является проблемой. Проблема в том, что я хочу, чтобы эта операция была быстрее.

Так что мой вопрос: Как я могу быстрее импортировать данные фида? Есть ли другие подсказки, о которых я, возможно, не знаю?

ответ

0

Вы можете взглянуть на расширение PDO php, и это поддержка инструкций preapeared. Вы также можете рассмотреть возможность использования хранимых процедур в mysql. 2) Вы можете взглянуть на другие системы баз данных, такие как CouchDB и другие, и пожертвовать согласованностью для производительности.

+0

Не использует MDB2 PDO? – basdog22

+1

@jeezTech: Даже если это еще один дополнительный слой. – prodigitalson

+0

@erenon: У вас здесь хороший момент. – basdog22

1

Если ваш импорт является одноразовым, и вы используете полнотекстовый индекс, простая настройка для ускорения импорта - это удаление индекса, импорт всех ваших данных и добавление индекса полного текста после его импорта. Это намного быстрее, according to the docs:

Для больших наборов данных, гораздо быстрее для загрузки данных в таблицу, не имеет индекса FULLTEXT, а затем создать индекс после того, чем загружать данных в таблицу, которая имеет существующий индекс FULLTEXT.

2

Использование LOAD DATA INFILE часто во много раз быстрее, чем при использовании INSERT сделать объемную нагрузку.

Даже если вам нужно выполнить свои проверки в PHP-коде, выгрузите его в файл CSV, а затем используйте LOAD DATA INFILE, это может быть большой победой.

+0

Это, в сочетании с отбрасыванием индексов перед запросом LOAD DATA и последующим их восстановлением, в значительной степени является конечной в производительности импорта данных. –

0

Мне удалось удвоить введенные данные с помощью команды INSERT DELAYED за 1800 секунд. Предложение «LOAD DATA INFILE» было не так, поскольку данные должны быть строго проверены, и это испортило бы мой код. Спасибо за все ваши ответы и предложения :)

+1

LOAD DATA INFILE по-прежнему является опцией: вы создаете новый «INFILE» из данных, которые вы читаете, после проверки. Я не думаю, что кто-то предлагал LOAD DATA INFILE оригинальный, неутвержденный файл. У меня нет твердых чисел для MySQL, но я могу сказать вам, что для postgres есть * ничего * быстрее, чем эквивалент LOAD DATA INFILE («COPY» в postgres http://enfranchisedmind.com/blog/2006/11/04/Postgres-для выигрыша /) –

Смежные вопросы