_RVK_
Новичок
Обновление таблиц, как оптимальнее?
Вопрос в следующем.
Идет обновление из XML. Для этого написан скрипт, который рекурсивно проходит по дереву, и обновляет 4 таблицы. Сейчас тупо удаляются данные, а потом, по мере прохода по дереву, вставляются обновленные данные. Естественно в реальной системе так быть не может, т.к обновление занимает несколько минут, и в это время сайт неработоспособен. Ищу наилучший выход.
Понятно что нужно создавать временные таблицы, добавлять данные в них, а потом просто менять местами. Вот тут и вопрос. Я вижу несколько способов:
Первый:
1. Создаем временную таблицу CREATE TEMPORARY TABLE tmp ...
2. Добавляем данные. INSERT INTO tmp...
3. Удаляем данные из основной. DELETE FROM real_table...
4. INSERT INTO real_table SELECT * FROM tmp...
Недостатки:
1. Время на удаление данных.
2. Время на добавление данных.
Соответственно некоторое время данные недоступны. При моих ~20000 записей это несколько секунд, но если данных будет 20000000...
Второй:
1. -
2. -
3. Удаляем основную DROP TABLE real_table...
4. Создаем заново CREATE TABLE real_table SELECT * FROM tmp
Недостатки:
1. Некоторое время таблицы вообще нет. Хотя удалить таблицу ИМХО быстрее чем данные из неё.
2. Время на создание таблицы и добавление данных.
Третий:
1.-
2.-
3. Переименовываем временную таблицу в новую. ALTER TABLE tmp RENAME real_table
Наиболее быстрый способ, но понятия не имею как при переименовании сделать из временной, обычную таблицу. Пропущено удаление старой таблицы сознательно, странно, но MySQL не ругается при если такое имя существует.
Ну и сам вопрос, как действительно нужно делать?
Вопрос в следующем.
Идет обновление из XML. Для этого написан скрипт, который рекурсивно проходит по дереву, и обновляет 4 таблицы. Сейчас тупо удаляются данные, а потом, по мере прохода по дереву, вставляются обновленные данные. Естественно в реальной системе так быть не может, т.к обновление занимает несколько минут, и в это время сайт неработоспособен. Ищу наилучший выход.
Понятно что нужно создавать временные таблицы, добавлять данные в них, а потом просто менять местами. Вот тут и вопрос. Я вижу несколько способов:
Первый:
1. Создаем временную таблицу CREATE TEMPORARY TABLE tmp ...
2. Добавляем данные. INSERT INTO tmp...
3. Удаляем данные из основной. DELETE FROM real_table...
4. INSERT INTO real_table SELECT * FROM tmp...
Недостатки:
1. Время на удаление данных.
2. Время на добавление данных.
Соответственно некоторое время данные недоступны. При моих ~20000 записей это несколько секунд, но если данных будет 20000000...
Второй:
1. -
2. -
3. Удаляем основную DROP TABLE real_table...
4. Создаем заново CREATE TABLE real_table SELECT * FROM tmp
Недостатки:
1. Некоторое время таблицы вообще нет. Хотя удалить таблицу ИМХО быстрее чем данные из неё.
2. Время на создание таблицы и добавление данных.
Третий:
1.-
2.-
3. Переименовываем временную таблицу в новую. ALTER TABLE tmp RENAME real_table
Наиболее быстрый способ, но понятия не имею как при переименовании сделать из временной, обычную таблицу. Пропущено удаление старой таблицы сознательно, странно, но MySQL не ругается при если такое имя существует.
Ну и сам вопрос, как действительно нужно делать?