SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.07.2011 12:41:12

ILYA
Участник
Зарегистрирован: 13.07.2010
Сообщений: 12

Использовать семафор-переключатель или переименовывать таблицу?

Тема исключительно для того, что бы узнать как лучше и узнать мнение "корифеев"

Фрагмент задачи:
есть таблица, которая активно используется (на выборку)
есть приходящие к нам данные (в csv), которые мы парсим и обновляем таблицу.
данных много - от 50-70 тысяч строк - до 700-900 тысяч (то есть, это несколько таблиц, несколько csv файлов).
данные приходят каждые 15 минут
исходя из этого - нужно делать это быстро
поэтому я использую таблицу-зеркало, которой выполняю трункейт, затем заполняю из csv
также использую переключатель (в базе храниться переменная, которой меняю значение - это и есть название таблицы - эта переменная используется в коде)
после обновления зеркала я переключаю рабочую таблицу на зеркало, выполняю трункет рабочей таблицы, заполняю ее из зеркала, переключаю переменную обратно на рабочую
/здесь можно было бы сразу выполнять трункет зеркала, но места много и его не жалко/
таким образом ни одной секунды нет такой ситуации, когда данных в таблице нет (или они не полные)

Сразу оговорюсь - обновлять таблицу не годится - хоть есть и ключ и индексация, но это порой занимает более 2-4 минут. Все равно придется удалять те, которые не пришли в csv.


Так вот - меня уже 2 человека спросили: зачем такие сложности с переменной в базе с названием таблицы? зачем эти семафоры?
Если можно просто заполнить (обновить) зеркало (которое, к стати, создать налету) а затем удалить рабочую таблицу и переименовать зеркало в рабочую.
И это займет доли секунды - якобы так лучше.


Считаю, переименовывать - это не есть "гуд".

Что скажет общественность?

Неактивен

 

#2 14.07.2011 18:58:30

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Использовать семафор-переключатель или переименовывать таблицу?

Сразу оговорюсь - обновлять таблицу не годится - хоть есть и ключ и индексация, но это порой занимает более 2-4 минут.
А каким образом вы выполняете обновление ?
Какой table engine ?

Считаю, переименовывать - это не есть "гуд".

Это из каких соображений ?

Неактивен

 

#3 15.07.2011 11:34:39

ILYA
Участник
Зарегистрирован: 13.07.2010
Сообщений: 12

Re: Использовать семафор-переключатель или переименовывать таблицу?

evgeny написал:

А каким образом вы выполняете обновление ?

Сейчас ( с переключением) работаю так:
truncate <TABLE> ;
INSERT INTO <TABLE> SELECT * FROM <TABLE_M> WHERE 1;

А перед этим зеркало <TABLE_M> заполняю так:
- truncate <TABLE_M> ;
- читаю блоками csv (по 500 строк) (проверяю/обрабатываю данные)
- формирую строку запроса - по окончанюи блока выглядит где-то так:
INSERT INTO <TABLE_M> (d1,d2,........, d15) VALUES (.....),(.....), ...... (....);
- выполняю запрос.

(затем переключаю обратно таблицы и т.д.)
и вот так (вместе с парсингом файла) это занимает от 20 до 40 сек


Если вопрос относился к тому, что я сказал "...но это порой занимает более 2-4 минут."

То это было изначальное решение в лоб (работало, когда никто не предполагал, что в файлах будет более 30-50 строк и что файлов будет больше чем 1)

- читаем (и разбираем) csv по строкам
- проверяем по ключу - есть ли такая запись
- есть - обновляем
- нет - вставляем
- составляем массив ключей
- (в самом начале - на заре формирования проекта ничего удалять не нужно было), но затем потребовалось -  в конце удаляем все, которых нет в массиве ключей: .... WHERE key NOT IN (k1,k2,k3.....k30);

Так вот, когда раздулся проект, несколько раз изменилась логика - увеличился файл, появилось их несколько - обратили внимание, что весь процесс (построчного чтения с проверкой на каждую строку) занимает более 3-4-х минут (то есть не выполнение запросов 3-4 минуты! - общий)


evgeny написал:

Какой table engine ?

MyISAM

Это из каких соображений считаю что переименовывать не "гуд" ?
smile
та еслибы я знал - я бы не постил
Видать когда-то где-то прочитал или услышал от кого из тех "что с опытом" - не помню?

Неактивен

 

#4 17.07.2011 11:58:39

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Использовать семафор-переключатель или переименовывать таблицу?

Увеличить скорость вам могли бы помочь такие способы как : LOAD DATA INFILE
Обновление данных с помощью REPLACE INTO или INSERT ... ON DUPLICATE KEY UPDATE

Переход на InnoDb, позволил бы вам заливать данные напрямую в главную таблицу, в InnoDb она не будет блокироваться как в MyIsam.

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

Важно делать multi rename, чтоб таблица была блокирована во время переименования.

RENAME TABLE main_table TO old_table, temp_table TO main_table;

Неактивен

 

#5 18.07.2011 11:37:52

ILYA
Участник
Зарегистрирован: 13.07.2010
Сообщений: 12

Re: Использовать семафор-переключатель или переименовывать таблицу?

на счет таких изменений как в первой части - пожалуй не буду пока, хотя вечно забываю про REPLACE INTO  - спасибо что напоминаете.

На счет переименования - ну что же - значит был не прав - пора менять свои убеждения sad

Спасибо за ответ.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson