Несколько запросов MySQL и как заставить мой скрипт работать быстрее - PullRequest
0 голосов
/ 19 декабря 2009

Использование PHP (ограничение по времени 1900 секунд и ограничение памяти более 1 ГБ) и MySQL (используя PEAR :: MDB2) на этом ...

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

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

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

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

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

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

Итак, мой вопрос: Как я могу ускорить процесс импорта данных канала? Есть ли какие-либо другие советы, которые я мог бы не знать?

Ответы [ 4 ]

2 голосов
/ 20 декабря 2009

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

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

1 голос
/ 19 декабря 2009

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

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

0 голосов
/ 22 декабря 2009

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

0 голосов
/ 19 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...