![]() |
Модераторы: skyboy |
![]() ![]() ![]() |
|
lancelot555 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 19.2.2005 Репутация: нет Всего: нет |
Есть таблица с большим количеством данных (например 30 млн строк)
Структура: DATE и еще 8 интовых полей, 4 из которых составляют уникальный ключ на каждую дату приходится разное количество строк Задача: Периодически нужно обновлять по нужной дате записи, новых записей может быть больше или меньше чем старых, простым апдейтом не обойтись Сейчас решается так: удаляются все записи нужного дня, затем вставляются новые записи удаление происходит очень долго чувствую что решение неоптимальное.. должно быть чтото лучше и быстрее Подскажите куда копать --------------------
Hи что так не поpтит цель, как попадание! =) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
DDL, код, explain - в студию.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
lancelot555 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 19.2.2005 Репутация: нет Всего: нет |
К примеру мы посчитали новые данные за позавчера, нужно этот день в табличке обновить Строк может быть как больше так и меньше например за 2013-03-20 00:00:00 было 2 млн уникальных строк после пересчета вышло 2,1 млн строк, при чем в старых данных встречаются только 1,9 млн уникальных ключей, остальные новые.. А еще в старых данных 0,1 млн строк с ключами которых в новых данных уже нет Теоретически мы можем 1,9 строк обновить апдейтом (update) потом нужно удалить 0,1 млн старых строк и еще потом вставить недостающие 0,2 млн строк с новыми ключами которых раньше не было Сейчас делается так: Delete from table where date_time = '2013-03-20 00:00:00' а затем массовый инсерт данных на эту дату Это сообщение отредактировал(а) lancelot555 - 29.3.2013, 16:16 --------------------
Hи что так не поpтит цель, как попадание! =) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Движок - InnoDB?
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
lancelot555 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 19.2.2005 Репутация: нет Всего: нет |
да InnoDB
--------------------
Hи что так не поpтит цель, как попадание! =) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Тогда суть очевидна. Первичного индекса в таблице нет, посему первый уникальный индекс, не содержащий NULL-полей, становится кластерным. Т.е. вот этот твой составной монстр. И его перестройка при удалении (а удаление-то выполняется по одной записи!) коматозит весь процесс.
Просто введи в структуру первичный автоинкрементный ключ. Пусть даже он тебе и нахрен не нужен. Но именно он станет кластерным. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
lancelot555 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 19.2.2005 Репутация: нет Всего: нет |
Хм.. не подумал об этом что-то. Спасибо за наводку, попробую.
--------------------
Hи что так не поpтит цель, как попадание! =) |
|||
|
||||
lancelot555 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 19.2.2005 Репутация: нет Всего: нет |
Добавил в таблицу поле id
Честно говоря стало только хуже, теперь процесс обновления записей происходит в разы медленнее раньше удаление и вставка занимало секунд 20, теперь больше 100 --------------------
Hи что так не поpтит цель, как попадание! =) |
|||
|
||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: нет Всего: 329 |
||||
|
||||
lancelot555 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 19.2.2005 Репутация: нет Всего: нет |
он есть KEY `date_time` (`date_time`) отдельно и в составе ключа --------------------
Hи что так не поpтит цель, как попадание! =) |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Возможный результат. Никто чуда не обещал. Давайте попробуем понять, с чем имеем дело. Какова наполненность таблицы (сколько в ней всего записей, за какой срок)? куда деваются устаревшие? допускает ли она партиционирование или секционирование по дате? почему в качестве движка выбран именно InnoDB? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Агрох |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 176 Регистрация: 6.4.2013 Где: Москва Репутация: 1 Всего: 6 |
А если убрать:
Но оставить вот это внесённое вами изменение:
и
Если конечно по полям
--------------------
Putin here, Putin there, Putin almost everywhere! |
||||||||
|
|||||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MySQL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |