Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> разбить данные из таблицы на 2 таблици 
:(
    Опции темы
studentigor
Дата 19.3.2012, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 397
Регистрация: 14.11.2008

Репутация: нет
Всего: нет



Всем привет.

Есть в базе таблица с объявлениями, она уже выросла более чем на 2 миллиона записей, и продолжает расти.
Из за такого объема записей поиск по таблице становится все медленее и медленее.

Я решил сделать 2 таблици, 1я - "архивная", 2я - таблица с записями за последние 4 месяца.
Таблици находятся в одной базе.

Теперь нужно сделать скрипт, который бы из 2й таблици переносил записи(именно переносил), даты которых более 4х месяцев, в первую.

Хочу поинтересоваться, как лучше сделать.

Либо сделать РНР скрипт, подвесить его на крон, который бы делал 
SELECT FROM t_2
....
INSERT INTO t_1
....
DELETE FROM t_2

Или есть какието решения непосредственно в mysql, или ещё какието?
Подскажите пожалуйста как лучше такое организовать?
Спасибо



Это сообщение отредактировал(а) studentigor - 19.3.2012, 11:07
PM MAIL   Вверх
РОМАN
Дата 6.4.2012, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.4.2012

Репутация: нет
Всего: нет



При данном раскладе можно объединить первые 2 пункта: INSERT INTO ... SELECT ...
PM MAIL   Вверх
ksnk
Дата 6.4.2012, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Код

CREATE TEMPORARY TABLE tmp SELECT * FROM t_2 where DATE_ADD(t_2 .`date`,INTERVAL 4 MONTHS)<NOW();

создаст таблицу tmp в памяти. Если на 4 месяца набирается не очень много записей, то такое поведение вполне оправдано. Если таблица будет большой - тоже не страшно, просто таблица создастся на диске.. 
Код

INSERT INTO `archive` select * from tmp;

вставить все записи в архивную таблицу
Код

DELETE FROM `t_2` WHERE `id` IN (SELECT `id` FROM tmp);

удалит все записи, которые ранее были вставлены в архив.

Алгоритм будет стойким к параллельному запуску. То есть, лишних записей не будет удалено даже если одновременно будет запущено пара и больше версий скрипта.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
РОМАN
Дата 6.4.2012, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.4.2012

Репутация: нет
Всего: нет



честно говоря непонятно, зачем так

предложенный автором вариант:
SELECT FROM t_2
....
INSERT INTO t_1
....
DELETE FROM t_2

гораздо прозрачнее...

Кроме того TEMPORARY таблицы не поддерживают индексы..

"лишних записей не будет удалено даже если одновременно будет запущено пара и больше версий скрипта."

лишних записей и так не будет удалено, так как удаление с условием по дате. нельзя два раза удалить данные за вчерашний день smile
PM MAIL   Вверх
ksnk
Дата 6.4.2012, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



РОМАN, В тех запросах, которые используют временную таблицу ее индексы не используются.

в моем случае  - нужно просто последовательно исполнить 3 запроса. Это ли не прозрачность? Выборка по диапазону дат делается в единственном запросе.
В случае studentigor нужно выбрать в массив результат и в цикле запихать результат на место. Нет? Может и нет, можно составить единый запрос на вставку результатов выборки, но все равно выборка по разнице дат будет делаться 2 раза.

Цитата(РОМАN @  6.4.2012,  23:17 Найти цитируемый пост)
нельзя два раза удалить данные за вчерашний день 

Зато можно их 2 раза вставить... потенциально.

Впрочем, ладно, тут надо тестировать что будет быстрее  smile 


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
РОМАN
Дата 6.4.2012, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 5.4.2012

Репутация: нет
Всего: нет



smile
да не пойму просто в чем косяк

Добавлено @ 23:52
можно же вот так (почти как автор)
1. INSERT INTO ... SELECT ...
2. DELETE FROM t_2

зачем временные создавать?

"В тех запросах, которые используют временную таблицу ее индексы не используются."
а я об этом как раз и говорил )
"Кроме того TEMPORARY таблицы не поддерживают индексы.."

Добавлено @ 00:04
"Впрочем, ладно, тут надо тестировать что будет быстрее smile"


Это сообщение отредактировал(а) РОМАN - 7.4.2012, 10:29
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.