Mysql даёт оверхед 50 раз в обычной MyISAM таблице с BLOB. Как уменьшить?
Есть 16 таблиц MyISAM. Первое поле — int, второе — BLOB. Второе поле может как расти, так и уменьшаться, но в целом размер меняется не очень быстро во времени (в большинстве запросов незначительно растёт). Операции — UPDATE (~100 в секунду). Размер таблиц ~4 ГБ каждая. В базу пишется около 200 КБ/с, но в iotop видно, что mysql пишет на ssd аж 10 МБ/с, т.е. оверхед 50 раз! Естественно, это негативно влияет на срок жизни ssd. Есть способ справиться с этим ужасом?
PS. Временная папка mysql смонтирована на tmpfs, поэтому здесь проблем не может быть.
200кб → в базу → чёрный ящик → 10мб/с
если рассмотреть чёрный ящик, то база кроме всего прочего работает не с каждым байтом данных, а с блоками по 4кб каждый. в каком порядке она их записывает — неизвестно
например, добавляя один байт данных в строке база может не найти под него место и тогда надо создавать новый 4кб блок, записывать его на диск, и записывать старый блок на диск помеченный как освободившийся (итого на 1 ваш байт - 8 кб записи) и т.д.
Но точно я вам никогда не скажу почему пишет там много, потому что только вы можете тулзами посмотреть с какими файлами работает база.
По идее БД типа berkeley db или leveldb должны иметь наименьший оверхед при записи данных т.к. все апдейты и инсерты там дописываются в конец последнего файла. У вас есть возможность вынести этот процесс в отдельную БД или перенести эту таблицу на движок BDB в рамках той же mysql?
vitaliy2: Оверхед будет, но не более чем в 2 раза при дефолтных настройках. Там отдельный тред висит, который чистит старые файлы. По умолчанию чистится файл, занятый менее чем на 5% полезными данными плюс поддерживается максимальный оверхед по всей бд в 2 раза (т.е. могут очищаться файлы и с большим процентом полезных данных). Пишу про java-версию BDB, но думаю обычная не сильно отличается в этом плане. В задачах с соотношением чтения к записи 1:1 или около того, реализации с использованием BDB как правило дают кратный прирост производительности именно за счет оптимизации записи.
baadf00d: если всё так хорошо, то почему существуют движки типа MYISAM и InnoDB? Они же тоже дают до 2x оверхеда вроде. На случай, если данные или их размер не меняются?
А кто сказал, что там все отлично? Пишет она в среднем гораздо быстрее - это да, а вот чтение из нее будет менее производительным. Вы же решаете проблему с оверхедом при записи? А за это придется чем-то заплатить :)
Кроме того, BDB - это NoSQL база ключ-значение и перепиливание её под MySQL движок - своего рода натягивание совы на глобус, что вполне может отложить негативный отпечаток на производительности.
PS еще можно попробовать поубирать лишние индексы - это в любом случае снизит нагрузку на диск при записи, что с BDB, что на обычном движке.