Есть таблица, в ней 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 тыс. записей, а потом ещё и запуск оптимизации.
А чем это поможет? Разве что ускорит выборку. Вопрос в том, что он в любом случае будет блочить таблицу, а это значит, что весь сайт ляжет, пока не выполнится модернизация, удаление лишних 100,200,500 тыс. записей, а потом ещё и запуск оптимизации.
Спустя 1 день, 6 часов, 53 секунды (28.01.2012 - 06:57) ancient mariner написал(а):
inpost
InnoDB блокирует на уровне строк, а не таблиц, как MyISAM. Так что может действительно вариант.
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
Это одно из преимуществ InnoDB над MyISAM
Спустя 1 час, 30 минут, 27 секунд (28.01.2012 - 15:07) sergeiss написал(а):
Цитата (neadekvat @ 28.01.2012 - 14:31) |
sergeiss, но ведь переименование таблицы происходит путем создания новой и перекидывания в нее строк, |
С какого перепуга??? Просто меняется имя и всё. Безо всякого копирования.
PS. Ну, если только Мускуль так криво работает Но маловероятно. Все-таки нормальная БД, где такие вещи должны быть по-уму сделаны.
Спустя 2 дня, 2 часа, 18 минут, 46 секунд (30.01.2012 - 17:26) Cartagen написал(а):
Цитата |
но ведь переименование таблицы происходит путем создания новой и перекидывания в нее строк |
Нет конечно Вы представляете, сколько времени переименовывалась бы таблица размеров в мегов 500
_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).