FB3
Новичок
TEXT/BLOB в InnoDB и размер таблицы
Попытаюсь упрощенно описать проблему:
Есть большая таблица InnoDB с примерно миллионом записей.
В таблице всего два поля, одно - первичный ключ, второе - содержит данные в текстовом виде. Думаем перейти на BLOB, но пока не об этом.
Проблема в том, что и TEXT и BLOB - это поля переменной, а не фиксированной длины. Соответственно, когда данные изменяются, то они не затираются новыми поверх старых и при активной работе с этими данными размер таблицы вырастает за неделю или даже быстрее до такого, что мускул уже не влезает в отведенный ему объем памяти и начинает свопить на винт. После этого помогает только OPTIMIZE TABLE, который вычищает весь мусор, скопившийся в таблице и никому не нужный. Удаление и добавлений новых записей происходит намного реже, чем изменение данных. Времени оно отнимает до 20 минут, если еще не начало свопить и 40-60 минут - если уже MySQL свопит во всю.
В поле фиксированного размера эти данные ну никак не влезут. Средняя длина поля около 2400 байт после сжатия zip и упаковки mime64 (если чо, не я это придумал
). Максимальное же поле фиксированного размера это 255 символов. Даже если попытаться разбить эти данные на какие-то части (для записи в разные поля), все равно остается логическая единица данных, которая больше 255 байт займет и не влезет в поле фиксированной длины.
Варианты:
1. Добавить памяти на сервак - все равно не обойтись без OPTIMIZE TABLE, просто реже делать придется, да и памяти в серваке уже по максимуму.
2. Купить еще один сервак под шардинг БД - поддержка шардинга имеется, но опять же без OPTIMIZE TABLE, только реже, не обойдется.
3. Разбивать логическую единицу данных на несколько фиксированных полей - в принципе реально, но очень уж криво на мой взгляд.
4. Разбить эту логическую единицу данных на совсем мелкие логические единицы данных, записывать их в новую таблицу как отдельные записи и выбирать отдельным запросом эти данные - автоматом получаем табличку с кол-вом записей в 500 раз больше, чем в оригинальной таблице.
5. Ваши советы и предложения?
Может коряво объяснил, но резюмирую суть вопроса: проблема в том, что из-за постоянного изменения полей переменной длины довольно быстро растет размер таблицы InnoDB, хотя кол-во хранимой информации в самой таблице растет намного медленней.
Попытаюсь упрощенно описать проблему:
Есть большая таблица InnoDB с примерно миллионом записей.
В таблице всего два поля, одно - первичный ключ, второе - содержит данные в текстовом виде. Думаем перейти на BLOB, но пока не об этом.
Проблема в том, что и TEXT и BLOB - это поля переменной, а не фиксированной длины. Соответственно, когда данные изменяются, то они не затираются новыми поверх старых и при активной работе с этими данными размер таблицы вырастает за неделю или даже быстрее до такого, что мускул уже не влезает в отведенный ему объем памяти и начинает свопить на винт. После этого помогает только OPTIMIZE TABLE, который вычищает весь мусор, скопившийся в таблице и никому не нужный. Удаление и добавлений новых записей происходит намного реже, чем изменение данных. Времени оно отнимает до 20 минут, если еще не начало свопить и 40-60 минут - если уже MySQL свопит во всю.
В поле фиксированного размера эти данные ну никак не влезут. Средняя длина поля около 2400 байт после сжатия zip и упаковки mime64 (если чо, не я это придумал

Варианты:
1. Добавить памяти на сервак - все равно не обойтись без OPTIMIZE TABLE, просто реже делать придется, да и памяти в серваке уже по максимуму.
2. Купить еще один сервак под шардинг БД - поддержка шардинга имеется, но опять же без OPTIMIZE TABLE, только реже, не обойдется.
3. Разбивать логическую единицу данных на несколько фиксированных полей - в принципе реально, но очень уж криво на мой взгляд.
4. Разбить эту логическую единицу данных на совсем мелкие логические единицы данных, записывать их в новую таблицу как отдельные записи и выбирать отдельным запросом эти данные - автоматом получаем табличку с кол-вом записей в 500 раз больше, чем в оригинальной таблице.
5. Ваши советы и предложения?
Может коряво объяснил, но резюмирую суть вопроса: проблема в том, что из-за постоянного изменения полей переменной длины довольно быстро растет размер таблицы InnoDB, хотя кол-во хранимой информации в самой таблице растет намного медленней.