Я использовал MySQLTuner, который указал, что некоторые таблицы были фрагментированы. я использовал
mysqlcheck --optimize -A
оптимизировать все таблицы. Исправлены некоторые таблицы, но MySQLTuner все еще находит фрагментированные 19 таблиц. Как узнать, какие таблицы нуждаются в дефрагментации? Возможно, OPTIMIZE TABLE будет работать там, где mysqlcheck не работал? Или что еще мне попробовать?
Ответы:
краткий ответ:
Ответ "Вы должны знать"
Прежде всего вы должны понимать, что таблицы Mysql фрагментируются при обновлении строки, так что это нормальная ситуация. Когда таблица создана, скажем, импортирована с использованием дампа с данными, все строки сохраняются без фрагментации на многих страницах с фиксированным размером. Когда вы обновляете строку переменной длины, страница, содержащая эту строку, делится на две или более страниц для хранения изменений, и эти две новые (или более) страницы содержат пустые места, заполняющие неиспользуемое пространство.
Это не влияет на производительность, если, конечно, фрагментация не растет слишком сильно. Что слишком много фрагментации, давайте посмотрим на запрос, который вы ищете:
DATA_LENGTH и INDEX_LENGTH - это пространство, которое используют ваши данные и индексы, а DATA_FREE - это общее количество байтов, неиспользуемых на всех страницах таблицы (фрагментация).
Вот пример реальной производственной таблицы
В этом случае у нас есть Таблица, использующая (896 + 316) = 1212 МБ, и у нас есть свободное пространство 5 МБ. Это означает «коэффициент фрагментации»:
... Что является действительно низким "коэффициентом фрагментации".
Я работал с таблицами с коэффициентом около 0,2 (что означает 20% пробелов) и никогда не замечал замедления запросов, даже если я оптимизирую таблицу, производительность остается той же. Но применение таблицы оптимизации на столе размером 800 МБ занимает много времени и блокирует таблицу на несколько минут, что нецелесообразно для производства.
Итак, если вы считаете, что вы выиграли в производительности и потратили время на оптимизацию таблицы, я предпочитаю НЕ ОПТИМИЗИРОВАТЬ.
Если вы считаете, что для хранения лучше, посмотрите соотношение и посмотрите, сколько места вы сможете сэкономить при оптимизации. Обычно это не так уж много, поэтому я предпочитаю НЕ ОПТИМИЗИРОВАТЬ.
И если вы оптимизируете, следующее обновление создаст пробелы, разделив страницу на две или более. Но быстрее обновить фрагментированную таблицу, чем не фрагментированную, потому что, если таблица фрагментирована, обновление строки не обязательно разделит страницу.
Я надеюсь, это поможет вам.
источник
Просто, чтобы добавить к ответу Фелипе-Рохаса, вы можете рассчитать соотношение фрагментов как часть запроса:
Если таблица фрагментирована небольшим процентом (менее 5%?), То вы, вероятно, можете оставить ее в покое.
Что-нибудь большее, и вам нужно будет оценить, основываясь на вашем использовании базы данных, блокировках таблиц и т. Д., Насколько важно дефрагментировать таблицу.
источник
Оптимизация таблицы действительно решит проблему, с которой вы столкнулись.
Если у вас есть только несколько баз данных, вы можете использовать PHPMyAdmin для просмотра всех ваших баз данных. Выберите таблицы с накладными расходами, а затем выберите для оптимизации.
Если у вас много баз данных, тогда, вероятно, предпочтительнее другой метод.
Я использую следующую настройку PHP-скрипта в cron для запуска каждый час.
источник
mysqlcheck --optimize -A
это то же самое, что и SQLOPTIMIZE TABLE <tablename>;
Я наткнулся на эту страницу и нашел, что запросы Фелипе-Рохаса и сисадмирала очень полезны. Но в моем случае я выполнял запрос в phpMyAdmin WHM, и получение только TABLE_NAME было не таким полезным, поскольку база данных не была указана, и несколько баз данных имеют одинаковые имена таблиц. Таким образом, простое добавление
TABLE_SCHEMA
также предоставит этот столбец.Показывает БД
Чтобы «исправить», я использовал ссылку таблицы дефрагментации в phpMyAdmin для каждой из таблиц, что привело к значительному «frag_ratio», для которого выполняется phpMyAdmin:
источник
Таблицы, использующие InnoDB Engine MySQL, по сути, никогда не должны быть
OPTIMIZEd
.Значение
Data_free
из одногоinformation_schema.tables
илиSHOW TABLE STATUS
очень часто ненулевое, даже если вы думаете, что сделали все, что можете, дефрагментируя свои таблицы. Кроме того, эта метрика - только одна из нескольких фрагментаций, которые могут и происходят. (Кроме того, потраченное впустую пространство в блоках, списки отмены, индекс BTrees против данных BTrees и т. Д. И т. Д.И
innodb_file_per_table
усложняет использованиеData_free
. Если таблица находится вibdata1
, тоData_free
относится ко всему табличному пространству; довольно бесполезный номер. Если таблица находится в своем собственном.ibd
файле, она может составлять несколько МБ или несколько процентов от размера таблицы, в зависимости от того, что больше.Только если вы удалили много строк и не намерены пополнить таблицу, может это будет стоить бег
OPTIMIZE TABLE
.PARTITIONs
также показывает тревожное количествоData_free
, так как каждый раздел обычно показывает 4-7 МБ "бесплатно". И это не пройдет.Зачем дефрагментировать?
innodb_file_per_table=1
. Но когда вы добавляете строки, вы забираете их из ОС.Data_free
.Историческая справка. Когда я помогал администраторам баз данных в основном с таблицами MyISAM, я обнаружил, возможно, 2 из 1000 таблиц, которым помогал ежемесячно
OPTIMIZE
. С тех пор я работал с тысячами таблиц InnoDB, но пока не нашел проблему с производительностью, которая могла бы помочьOPTIMIZE
. (Конечно, были проблемы с дисковым пространством, которыеOPTIMIZE
могли бы помочь, но это сложно, обычно у администратора базы данных недостаточно места для работыOPTIMIZE
!)источник