[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как оптимизировать таблицу при больших нагрузках?
inpost
Всем привет.
Есть таблица, в ней 2гб реальных данных, и уже 15 гб дефрагментированных. То есть банально необходимо запустить OPTIMIZE TABLE. Кроме того перед этим стоял вопрос из 6млн удалить примерно 5,5 млн записей.
Каждая из вышеуказанных операций лочит таблицу и достаточно на долгий период. Удалением занимался кусочками в течении суток, а вот оптимизация, допустим, работала у меня около 5 минут(!).
Сайт работает 24/7. Так вот вопрос, как работать с таким сайтом, когда нельзя блокировать таблицу в связи с постоянных нахождением на сайте людей, потому что идея "закрыт на переучет" мне не нравится и не подходит, хотя именно так делают рутрекеры и фри-ланс биржи.



Спустя 15 минут, 57 секунд (27.01.2012 - 00:08) neadekvat написал(а):
Что за таблица? В нее постоянно что-то пишут или модифицируют?

Спустя 34 минуты, 24 секунды (27.01.2012 - 00:42) inpost написал(а):
Именно. И пишется, и читается, и изменяется, и удаляется. Временами необходима чистка.

Спустя 2 минуты, 4 секунды (27.01.2012 - 00:44) Семён написал(а):
InnoDB может попробовать?

Спустя 11 минут, 39 секунд (27.01.2012 - 00:56) inpost написал(а):
Семён
А чем это поможет? Разве что ускорит выборку. Вопрос в том, что он в любом случае будет блочить таблицу, а это значит, что весь сайт ляжет, пока не выполнится модернизация, удаление лишних 100,200,500 тыс. записей, а потом ещё и запуск оптимизации.

Спустя 1 день, 6 часов, 53 секунды (28.01.2012 - 06:57) ancient mariner написал(а):
inpost
InnoDB блокирует на уровне строк, а не таблиц, как MyISAM. Так что может действительно вариант.

Спустя 27 минут, 26 секунд (28.01.2012 - 07:24) inpost написал(а):
Строки? Не знал и не слышал. Обязательно попробую, спасибо.

Спустя 4 часа, 5 минут, 50 секунд (28.01.2012 - 11:30) sergeiss написал(а):
Если не заморачиваться насчет блокировок, т.е. не вникать, как они работают, а просто считать, что они есть... То можно по-другому подойти.

Сделай временную таблицу, куда перепиши все нужные данные в ОТДЕЛЬНУЮ, временную таблицу. Как я понял, это всего около полумиллиона записей. Заодно веди отдельный журнал изменений в основной таблице. Затем создаешь во временной таблице нужные индексы. Затем запускаешь все изменения основной таблицы. После чего просто переименовываешь таблицы, даешь основной таблице "левое" имя, а временной - имя основной.
Ествественно, это потребует некоторой подготовки. Опять же, не с каждой таблицей это получится. Но вариант вполне рабочий.

Спустя 2 часа, 1 минута, 14 секунд (28.01.2012 - 13:31) neadekvat написал(а):
sergeiss, но ведь переименование таблицы происходит путем создания новой и перекидывания в нее строк, а затем удаления старой таблицы. Правда, я не возьмусь сказать, сколько это будет происходить с полумиллионами записей.

Спустя 5 минут, 13 секунд (28.01.2012 - 13:36) Семён написал(а):
inpost
Это одно из преимуществ InnoDB над MyISAM

Спустя 1 час, 30 минут, 27 секунд (28.01.2012 - 15:07) sergeiss написал(а):
Цитата (neadekvat @ 28.01.2012 - 14:31)
sergeiss, но ведь переименование таблицы происходит путем создания новой и перекидывания в нее строк,

С какого перепуга??? Просто меняется имя и всё. Безо всякого копирования.

PS. Ну, если только Мускуль так криво работает wink.gif Но маловероятно. Все-таки нормальная БД, где такие вещи должны быть по-уму сделаны.

Спустя 2 дня, 2 часа, 18 минут, 46 секунд (30.01.2012 - 17:26) Cartagen написал(а):
Цитата
но ведь переименование таблицы происходит путем создания новой и перекидывания в нее строк


Нет конечно smile.gif Вы представляете, сколько времени переименовывалась бы таблица размеров в мегов 500


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.