FreeBSD. Записки системного администратора. Innodb оптимизация
Плановая оптимизация таблиц в MySQL InnoDB
OPTIMIZE TABLE выполняет следующие шаги внутри на столе (mydb.mytable)
CREATE TABLE mydb.mytablenew LIKE mydb.mytable; INSERT INTO mydb.mytablenew SELECT * FROM mydb.mytable; ALTER TABLE mydb.mytable RENAME mydb.mytablezap; ALTER TABLE mydb.mytablenew RENAME mydb.mytable; DROP TABLE mydb.mytablezap;Поскольку там DDL участвует, нет никакого пути вокруг запросов принимает большой удар по производительности во время работы. Кроме того, неэффективная оптимизация будет не хуже.
Что вам нужно иметь MySQL Master/Мастер (ака Circular) Replication установить
Вы могли бы попробовать это:
для серверов M1 и M2 и DB VIP указывающей на М1
на М2, выполните следующие
STOP SLAVE; SET sql_log_bin = 0; Perform OPTIMIZE TABLE or ALTER TABLE ... ENGINE=InnoDB on all InnoDB tables START SLAVE; Wait for replication to catch (Seconds_Behind_Master = 0)SET sql_log_bin = 0 предотвратит DDL команды от репликации над Master.
После того, как все эти шаги завершены, продвиньте подчиненное устройство к мастеру и понизите мастер на ведомый (можно сделать, просто переместив свой DB VIP с M1 на M2). Вы можете выполнять это обслуживание каждый день, и производство не будет ощущать никаких эффектов, за исключением Master Promotion и Slave Demotion.
Вы можете создать скрипт и запустить его на M2, как это:
echo "SET sql_log_bin = 0;" > InnoDBCompression.sql echo "STOP SLAVE;" >> InnoDBCompression.sql mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBCompressionSQL FROM information_schema.tables WHERE engine='InnoDB' ORDER BY (data_length+index_length)" >> InnoDBCompression.sql echo "START SLAVE;" >> InnoDBCompression.sql mysql -u... -p... -A < InnoDBCompression.sqlОтсюда, просто ждать Seconds_Behind_Master быть 0 на М2, а затем переместить DBVIP от М1 до М2.Теперь, если вы знаете конкретные имена таблиц, которые хотите оптимизировать, вы можете настроить запрос для извлечения только этих таблиц.
Дайте ему попробовать !!!
CAVEAT
Вот справедливое предупреждение: If you have innodb_file_per_table disbaled, every time you run OPTIMIZE TABLE or ALTER TABLE ... ENGINE=InnoDB; the ibdata1 file just grows. You would need to cleanup the InnoDB infrastructure предотвратить ibdata1 расти из-под контроля.
dba.stackovernet.com
Оптимизация MySQL, optimize table — как не надо делать — Olunka ♥ layout of sites and emails
В блогосфере советы по ускорению работы сайта и оптимизации разносятся с бешеной скоростью. При этом мало кто из авторов проверяет реальную полезность полученных советов. Это вдвойне странно, потому как возможность проверить правильность той или иной идеи и сравнить разные мнения по одному и тому же вопросу в Интернете представлена очень широко.
В одном из блогов встретила вот такой текст:
Конкретный пример из жизни: 2 таблицы по 50 000 записей, в которых постоянно идут update, insert, delete. Ясное дело, что при таком подходе данные фрагментируются. Поэтому, когда мы делаем JOIN, то запрос выполняется 0.2 секунды — довольно много для базы данных. После optimize table запрос стал выполнятся 0.015 сек. Никаких дополнительных индексов, покупки железа — просто упорядочили данные на диске. Команду можно поставить в cron раз в сутки, например.
Мое внимание сразу зацепилось за то, что автор делает данную процедуру раз в сутки, а другие читатели только на цифры скорости выполнения запроса внимание обращают. А между тем, у автора написано, что у него в сутки по 50 тысяч записей меняются, может ли этим похвастаться ваш блог? Нет? Тогда зачем вы применяете совет, который вам не подходит?
И вот тысячи блогеров постят себе полезную команду optimize table и рекомендуют всем своим читателям пользоваться ею не реже раза в неделю. Кто-нибудь из них почитал зачем нужна эта команда, что она делает, чего она не может сделать и стоит ли ее применять для блогов?
Заглянем сюда — MySQL — справочное руководство на русском. И найдем такой пункт, касающийся optimize table, цитирую:
4.5.1. Синтаксис команды OPTIMIZE TABLEOPTIMIZE TABLE tbl_name[,tbl_name]…
Команда OPTIMIZE TABLE должна использоваться после удаления большей части таблицы или если в таблице было внесено много изменений в строки переменной длины (таблицы, в которых есть столбцы VARCHAR, BLOB или TEXT). Удаленные записи поддерживаются при помощи связного списка, и последующие операции INSERT повторно используют позиции старых записей. Чтобы перераспределить неиспользуемое пространство и дефрагментировать файл данных, можно воспользоваться командой OPTIMIZE TABLE.На данный момент команда OPTIMIZE TABLE работает только с таблицами MyISAM и BDB. Для таблиц BDB команда OPTIMIZE TABLE выполняет ANALYZE TABLE.Можно применить OPTIMIZE TABLE к таблицам других типов, запустив mysqld с параметром —skip-new или —safe-mode, но в этом случае OPTIMIZE TABLE лишь только выполняет ALTER TABLE.Команда OPTIMIZE TABLE работает следующим образом:* Если в таблице есть удаленные или разделенные строки, восстанавливает таблицу.* Если индексные страницы не отсортированы — сортирует их.* Если статистические данные не обновлены (и восстановление нельзя осуществить путем сортировки индексов), обновляет их.
Команда OPTIMIZE TABLE для MyISAM представляет собой эквивалент выполнения myisamchk —quick —check-only-changed —sort-index —analyze над таблицей.Обратите внимание: во время работы OPTIMIZE TABLE таблица заблокирована!
На такие ссылки блогеры обижаются, топают ногами и кричат, что новичкам никто не помогает. Новички, учитесь помогать себе сами, все самые важные и полезные знания можно почерпнуть из профессиональной литературы, а не в блогах таких же новичков.
В определении все четко и ясно написано. Команда optimize table применяется для таблиц, в которые было внесено много изменений. Много — это не 12 комментариев и 4 поста, это несколько тысяч. А фраза про то, что во время выполнения команды optimize table таблица будет заблокирована нам о чем говорит? Если таблица заблокирована, значит и сайт, работающий с этой таблицей тоже будет не работоспособен. Таблица будет заблокирована полностью, даже если оптимизироваться будет только тот столбец, что отвечает за комментарии. Отсюда вопрос, зачем запускать эту команду каждый день?
Если на вашем сайте один автор и отключены комментарии, вам вообще подобная команда может не пригодиться. Если у вас много комментариев и большая часть из них удаляется по причине спама, может понадобиться провести оптимизацию, но это процедура разовая.
Когда стоит применять команду optimize table для блога
1. Если у вас удаляется или изменяется большое количество статей или комментариев (большое количество — это несколько тысяч).2. В часы, когда посещаемость вашего сайта самая низкая.
P.S. Не бойтесь обращаться за советом к первоисточникам и профессиональной литературе.
Похожие статьи
olunka.ru
Оптимизация MySQL InnoDB на высоких нагрузках
Попытаюсь в этой статье рассказать об особенностях применения хранилища InnoDB в высоконагруженных проектах, а так же дать поверхностное сравнение MyISAM и InnoDB. Безусловно, MySQL не ограничивается только этими двумя типами хранилища данных, однако они являются подавляющими в своей распространенности использования. Несмотря на то, что много в InnoDB для меня очевидно, все еще остаются некоторые темные пятна и если меня где то поправят, буду только благодарен. Почему народ выбирает InnoDB? InnoDB обладает преимуществами перед MyISAM.- Транзакционная модель. Это конечно преимущество не столько для администратора, сколько для программиста. Программист может объединить операции с базой в транзакцию, с кучей вытекающих из этого профита. Это основная причина по которой архитекторы выбирают InnoDB.
- Блокировка на уровне строки. В отличии от MyISAM, где идет блокировка на уровне таблицы, в InnoDB блокировка осуществляется на уровне строки. Проблема конкурентных блокировок стоит не так остро как в MyISAM, однако все таки присутствует. Но об этом ниже.
- Защита от сбоев. InnoDB более устойчивая к сбоям, если сказать точнее, InnoDB намного лучше восстанавливается после сбоев и практически не теряет данные. Для восстановления же MyISAM таблиц зачастую требуется потушить MySQL сервер и вручную восстанавливать таблицы утилитой myisamchk. Результатом работы myisamchk зачастую может оказаться частичная или полная потеря данных в таблице. InnoDB восстанавливается автоматически.
- Качественная работа с IO. InnoDB имеет свой собственный Buffer Pool в памяти, где держит таблицы. Для InnoDB можно отключить системную буферизацию IO при работе с таблицами InnoDB. Таким образом, можно сказать что в InnoDB нет двойной буферизации (как в MyISAM), следовательно, оперативная память разумно расходуется.
mysql - Оптимизация Mysql InnoDB
У меня возникли проблемы с пониманием использования InnoDB - у нас есть DB на основе drupal (5: 1 read: write), работающий на mysql (версия сервера: 5.1.41-3ubuntu12.10-log (Ubuntu)). Наш текущий размер данных/индекса Innodb:
Текущее пространство индекса InnoDB = 196 M Текущее пространство данных InnoDB = 475 М
Оглядываясь на Интернет и читающие книги, такие как "Высокопроизводительный sql", предлагают увеличить размер данных на 10% - я установил буферный пул (data + index) + 10% и заметил, что пул буферов был на 100%... даже увеличивая примерно до 896 Мб, он все равно делает это на 100% (хотя индексы данных + составляют только ~ 671 Мб?
Я подключил вывод раздела innodb mysqlreport ниже. Страницы, свободные от 1, как представляется, также указывают на серьезную проблему. У параметра innodb_flush_method установлено значение по умолчанию - я буду исследовать установку этого параметра в O_DIRECT, но вы хотите решить эту проблему раньше.
__ InnoDB Buffer Pool __________________________________________________ Usage 895.98M of 896.00M %Used: 100.00 Read hit 100.00% Pages Free 1 %Total: 0.00 Data 55.96k 97.59 %Drty: 0.01 Misc 1383 2.41 Latched 0 0.00 Reads 405.96M 1.2k/s From file 15.60k 0.0/s 0.00 Ahead Rnd 211 0.0/s Ahead Sql 1028 0.0/s Writes 29.10M 87.3/s Flushes 597.58k 1.8/s Wait Free 0 0/s __ InnoDB Lock _________________________________________________________ Waits 66 0.0/s Current 0 Time acquiring Total 3890 ms Average 58 ms Max 3377 ms __ InnoDB Data, Pages, Rows ____________________________________________ Data Reads 21.51k 0.1/s Writes 666.48k 2.0/s fsync 324.11k 1.0/s Pending Reads 0 Writes 0 fsync 0 Pages Created 84.16k 0.3/s Read 59.35k 0.2/s Written 597.58k 1.8/s Rows Deleted 19.13k 0.1/s Inserted 6.13M 18.4/s Read 196.84M 590.6/s Updated 139.69k 0.4/sЛюбая помощь по этому вопросу была бы значительно исправлена.
Спасибо!
задан DOS 29 марта '11 в 11:02 источник поделитьсяqaru.site