Загрузка больших наборов данных -> Текст в MySQL или просто в MySQL? - PullRequest
1 голос
/ 07 января 2011

Я загружаю большие наборы данных через XML-запрос через PHP по следующему сценарию: - Запрос для записей 1-1000, загрузка всех частей (1000 частей имеет примерно 4,5 мегабайта текста), а затем сохранение их в памяти, покая запрашиваю следующие 1001 - 2000, сохраняю в mem (до, возможно, 400k)

Мне интересно, лучше ли было бы записывать эти записи в текстовое поле, а не сохранять их в памяти и послеполная загрузка выполняется, пытаясь вставить их все в БД или попытаться записать их в БД по мере их поступления.

Любые предложения будут с благодарностью приняты.

Приветствия

Ответы [ 3 ]

1 голос
/ 07 января 2011

Я думаю, что записать их в базу данных, как только вы их получите.Это сэкономит память, и вам не нужно будет выполнять запрос в 400 раз медленнее в конце.Вам понадобится механизм для решения любых проблем, которые могут возникнуть в этом процессе, таких как отключение после 399K результатов.

1 голос
/ 07 января 2011

Вы можете выполнить запрос следующим образом:

INSERT INTO table (id, text)
VALUES (null, 'foo'), (null, 'bar'), ..., (null, 'value no 1000');

Делая это, вы сделаете это за один выстрел, и парсер будет вызван один раз.Лучшее, что вы можете сделать, это запустить что-то подобное с помощью функции MySQL Benchmark , 1000 раз выполнить запрос, который вставляет 1000 записей, или 1000000 вставок одной записи.предыдущий ответ, я неправильно понял вопрос).

0 голосов
/ 07 января 2011

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

Поскольку вы используете базу данных, вы можете захотеть поместить все в таблицу, что-то вроде этого кода:

$error=false;
while ( ($row = getNextRow($db)) && !error ) {
    $sql = "insert into temptable(key, value) values ($row[0], $row[1])";
    if (mysql_query ($sql) ) {
         echo '#';
    } else {
         $error=true;
    }
}

if (!error) {
    $sql = "insert into myTable (select * from temptable)";
    if (mysql_query($sql) {
        echo 'Finished';
    } else {
        echo 'Error';
    }
}

В качестве альтернативы, если вы хорошо знаете таблицу, вы можете добавить поле «новый» флаг для вновь вставленных строк и обновить все, когда вы закончите.

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