SlideShare a Scribd company logo
mysql 101 // Андрей Аксенов // #addconf 2012




         MySQL 101

            Андрей Аксенов, AddConf, 2012
mysql 101 // Андрей Аксенов // #addconf 2012




             ПРО БАЗЫ ДАННЫХ
mysql 101 // Андрей Аксенов // #addconf 2012




         Ряд шокирующих новостей

• ШН1. select * from table where id=X,
  mysql, python, 10K rps == 0.01M rps
• ШН2. hash::find(), C++, 1-10M rps
• ШН3. Любые БД (SQL, NoSQL, WtfQL) –
  они про простоту, а не скорость
• ШН4. Скорость важна «через тоже»;
  нужна адская => пиши спецхранилку
mysql 101 // Андрей Аксенов // #addconf 2012




                Про реляционные базы

•   Все есть таблица (Table)
•   В которой есть строки (Rows)
•   В которых есть колонки (Columns)
•   Набор которых фиксирован (Schema)

• Откуда простота?
• Изоляция физического от логического
mysql 101 // Андрей Аксенов // #addconf 2012




                         Про уровни

• Физический == как хранить байтики
• Логический == что писать в программе

• Увы, про физический надо знать
• Иначе тормоза неизбежны, как закат
mysql 101 // Андрей Аксенов // #addconf 2012




            Про логический уровень

• Два вида, DDL + DML
• DDL, definition == про схему == CREATE
  TABLE, ALTER TABLE, CREATE INDEX
• DML, manipulation == про данные ==
  SELECT, INSERT, DELETE, UPDATE
mysql 101 // Андрей Аксенов // #addconf 2012




                     Про всё сложно

• Реализация физуровня это хранилка строк,
  индексы, оптимизатор, планы запросов,
  буфера, кеши, логи, репликация, …
• Детали реализации привязаны и сильно
  зависят от конкретной БД
• Но, есть и вечные ценности
mysql 101 // Андрей Аксенов // #addconf 2012




                          Про B-tree

• Индексы всегда B-tree — хорошо подходят
• Это спецструктура, которая
  – Хранит все пары (key, row_ptr)
  – Умеет быстро «дай все row_ptr, где key=X»
    (выборка по ключу)
  – Умеет быстро «дай все row_ptr, где key>=X &&
    key<=Y» (выбора по диапазону)
  – Разумно быстро (не мгновенно!) обновляется
mysql 101 // Андрей Аксенов // #addconf 2012




                  Про B-tree, пример

• select * from 1_million_rows where id=123
  без индекса == ууу... :(
• select * from 1_million_rows where id=123
  с индексом по title == ууу... :(
• select * from 1_million_rows where id=123
  с индексом по id == ооо! :)
mysql 101 // Андрей Аксенов // #addconf 2012




              ПРО ТРАНЗАКЦИИ
mysql 101 // Андрей Аксенов // #addconf 2012




                     Про транзакции

• Транзакция это набор операций над
  данными, имеющий ряд свойств
• ACID
  – Atomicity
  – Consistency
  – Isolation
  – Durability
mysql 101 // Андрей Аксенов // #addconf 2012




              Про физику транзакций

• Durability в теории?
  – В идеале, данные НИКОГДА не теряются
  – Ну, в смысле, после COMMIT
  – Ну, в смысле, если в ДЦ не попала молния
• Durability на практике?
  – Реализация, Write Ahead Log
  – Оптимизация, менее жесткие гарантии
mysql 101 // Андрей Аксенов // #addconf 2012




                     ПРО MYSQL
mysql 101 // Андрей Аксенов // #addconf 2012




        Нет (теперь) никакой ложки

• Ложку украли где-то между 4.0 и 5.0
• Подключаемые движки (pluggable SE)
  – По-разному реализующие физику хранения,
    индексации, выборок
• MySQL это общий код всего остального!
  – Сетевой протокол, разбор SQL, оптимизатор,
    репликация, итп
• Отчасти рулится конфигом, /etc/my.cnf
mysql 101 // Андрей Аксенов // #addconf 2012




                    ПРО MYISAM
mysql 101 // Андрей Аксенов // #addconf 2012




                        Кратко в целом

•   Нетранзакционный
•   Иногда может потерять данные
•   Кеширует только индексы, строки нет
•   Так себе масштабируется по ядрам
•   Блокирующая вставка в 1 поток
•   Как следствие, ТОРМОЗА при write load
mysql 101 // Андрей Аксенов // #addconf 2012




                     Хранилка строк

• Файл /var/lib/mysql/$databaseName/
  $tableName.MYD
• Строки (грубо говоря) дописываются в
  конец по мере поступления
• Важно, строки НИКАК не кешируются,
  каждый раз read() через OS!
mysql 101 // Андрей Аксенов // #addconf 2012




                           Индексы

• Файл /var/lib/mysql/$databaseName/
  $tableName.MYI
• Кешируются в памяти
• Ключевая директива key_buffer
mysql 101 // Андрей Аксенов // #addconf 2012




                Зачем использовать

• Обычно (в 99%) случаях незачем
• Обычно InnoDB решительно лучше
• Может, сколько-то осмысленно для
  постоянного дописывания (append)
  маловажных архивных данных
  – см. сравнительно быстрая вставка
mysql 101 // Андрей Аксенов // #addconf 2012




       Что и как тюнить про MyISAM

• Если не используется?
  – Скрутить key_buffer вниз (~16-32M)
• Если используется?
  – Скрутить key_buffer вверх
  – по размеру горячих (!) *.MYI
  – Иначе ТОРМОЗА
mysql 101 // Андрей Аксенов // #addconf 2012




       Что и как тюнить про MyISAM

• Скрутить вниз sort_buffer, read_buffer,
  read_rnd_buffer, если вдруг «настроили»
• Дефолтные небольшие значения обычно
  хорошо работают
• Эти буфера аллокаются на каждый тред!
  32M sort_buffer * 100 max_connections =
  минус 3.2 GB зазря
mysql 101 // Андрей Аксенов // #addconf 2012




                    ПРО INNODB
mysql 101 // Андрей Аксенов // #addconf 2012




                        Кратко в целом

•   Транзакционный
•   Данные не теряет
•   Кеширует и индексы, и строки
•   Получше масштабируется по ядрам
•   Блокировки и вставок, и чтений на уровне
    отдельных строк, а не всей таблицы
mysql 101 // Андрей Аксенов // #addconf 2012




          Хранилка строк + индексов

• Все хранится вместе, в т.н. tablespace
• Все кешируется вместе, ключевая
  директива innodb_buffer_pool_size
• Хранится страничками по 8 KB, весь
  tablespace I/O вроде тоже страничками
mysql 101 // Андрей Аксенов // #addconf 2012




          Хранилка строк + индексов

• По умолчанию, все таблицы всех баз (!!!)
  кладут все данные в один файл
  /var/lib/mysql/ibdata1, который никогда не
  уменьшается (адъ!)
• При наличии innodb_file_per_table все
  лежит в /var/lib/mysql/$databaseName/
  $tablename.ibdМясо
mysql 101 // Андрей Аксенов // #addconf 2012




                Зачем использовать

• Наиболее внятный движок в (стоковом)
  MySQL
  – Быстрый
  – Надежный
  – Транзакционный
  – Масштабируемый
mysql 101 // Андрей Аксенов // #addconf 2012




                   Что и как тюнить

• Если не используется
  – скрутить innodb_buffer_pool_size вниз
• Если используется
  – все несколько длиннее :)
  – плюс ряд дефолтов удивляет
mysql 101 // Андрей Аксенов // #addconf 2012




                Опасные умолчания

• innodb_file_per_table нету, диск утекает
• innodb_buffer_pool_size = 32M
  – Адово мало, надо 128M ... 128G
• innodb_flush_log_at_trx_commit = 0
  – Адово медленно (если не BBU), надо 2
• innodb_log_file_size = 5M
  – Тупо маловато, надо 16M … 1G
mysql 101 // Андрей Аксенов // #addconf 2012




                innodb_file_per_table

• Без него – неконтролируемый рост ibdata1
• На свежей копии нужно сразу включать
• На существующей копии можно сменить —
  но процесс нууудный
  – Dump, Unlink, Change, Import...
mysql 101 // Андрей Аксенов // #addconf 2012




              innodb_buffer_pool_size

• Мега Кеш Всего!
  – И данных
  – И индексов
  – И даже data dictionary
• Крутить вверх до упора, чо (~80%)
mysql 101 // Андрей Аксенов // #addconf 2012




     innodb_flush_log_at_trx_commit

• Все пишется в WAL, ибо durability
• Лог это что? Страховка, причем 2 видов!
  – Креш демона, креш машины
  – 0, fflush txn + fsync txn
  – 1, fflush 1 sec + fsync 1 sec
  – 2, fflsuh txn + fsync 1 sec
  – 0 для а) RAID b) BBU c) дрова d) живое BBU :)
  – 2 для обычных деревенских пареньков
mysql 101 // Андрей Аксенов // #addconf 2012




                    innodb_log_file_size

•   Все пишется в WAL, ибо durability
•   Бесконечно писать нельзя
•   По пределу размера флаш грязных страниц
•   То. чем больше лог, тем реже запись!
•   Поэтому...
mysql 101 // Андрей Аксенов // #addconf 2012




                    innodb_log_file_size

•   При RO нагрузке неважно совсем
•   При RW нагрузке важно
•   При WO нагрузке (импорт) адово важно
•   128M .. 1G ok, более 2G нельзя
•   Более innodb_buffer_pool_size/2 тупо нет
    смысла
mysql 101 // Андрей Аксенов // #addconf 2012




                          ИТОГО
mysql 101 // Андрей Аксенов // #addconf 2012




             О чем говорил иностранец

•   Оно внутри устроено — вот так
•   Оно из коробки настроено — вот так
•   Надо из коробки настраивать — не так!
•   Надо каждому — в т.ч. разработчикам
•   Потому что скорость разработки
•   Потому что тестирование во внятной среде
mysql 101 // Андрей Аксенов // #addconf 2012




                            ВСЕ!

More Related Content

PPTX
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
PDF
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
PPTX
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
PPTX
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
PPTX
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
PPTX
Велосипед уже изобретен. Что умеют промышленные СХД? / Антон Жбанков (Nutanix)
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
PPTX
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
LuaJIT как основа для сервера приложений - проблемы и решения / Игорь Эрлих (...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Велосипед уже изобретен. Что умеют промышленные СХД? / Антон Жбанков (Nutanix)
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)

What's hot (20)

PDF
Балансировка нагрузки и отказоустойчивость в Одноклассниках
PPTX
Опыт построения СХД на базе Windows Server для использования в публичном обла...
PDF
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
PPTX
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
PPTX
Mysql replication DevConf 2012
PPTX
Практический опыт использования некоторых современных решений репликации MySQL
PDF
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
PPTX
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
PPTX
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
PDF
Чему мы научились разрабатывая микросервисы?
PDF
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PPTX
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
PDF
Клиентские приложения под нагрузкой (HighLoad 2014)
PDF
Javascript-фреймворки:
 должен остаться только один
PDF
MySQL: чек-лист для новичка в highload (Cвета Cмирнова, Aнастасия Распопина ...
PPTX
Стратегия и тактика улучшения производительности BSS систем оператора мобильн...
PPTX
Как мы готовим MySQL / Николай Королёв (Badoo)
PPTX
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
PPTX
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
PDF
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Опыт построения СХД на базе Windows Server для использования в публичном обла...
Кластеры баз данных делаем сложные вещи просто / Андрей Тихонов (Avito)
Как устроена MySQL-репликация, Андрей Аксенов (Sphinx)
Mysql replication DevConf 2012
Практический опыт использования некоторых современных решений репликации MySQL
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Системный администратор Vkontakte. Как? / Антон Кирюшкин (Vkontakte)
Чему мы научились разрабатывая микросервисы?
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
За счет чего Tarantool такой оптимальный / Денис Аникин (Mail.Ru)
Клиентские приложения под нагрузкой (HighLoad 2014)
Javascript-фреймворки:
 должен остаться только один
MySQL: чек-лист для новичка в highload (Cвета Cмирнова, Aнастасия Распопина ...
Стратегия и тактика улучшения производительности BSS систем оператора мобильн...
Как мы готовим MySQL / Николай Королёв (Badoo)
Как устроена MySQL-репликация / Андрей Аксенов (Sphinx)
smart balancing with nginx+lua / Андрей Кононов (IPONWEB)
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ad

Similar to MySQL 101 (20)

PPTX
Hosting for forbes.ru_
PPTX
Oracle NoSQL Database
PDF
Обзор Redis storage / Symfony Camp UA 2011
PDF
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
PPT
Использование Sedna в WEB
PPT
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
PPTX
Open source субд глазами обычного программиста
PPTX
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
PPTX
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
PPTX
IOP202 Redis in Azure
PPTX
Доклад на Highload-2012
PPTX
High Load
PPTX
MyRocks: табличный движок для MySQL на основе RocksDB
PPTX
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
PDF
Обзор перспективных баз данных для highload / Юрий Насретдинов
PPT
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
PDF
За гранью NoSQL: NewSQL на Cassandra
PPT
XML Native Database на примере SednaXML
PDF
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
PDF
OpenSource SQL Databases Enter Millions Queries per Second Era
Hosting for forbes.ru_
Oracle NoSQL Database
Обзор Redis storage / Symfony Camp UA 2011
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Использование Sedna в WEB
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Open source субд глазами обычного программиста
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
IOP202 Redis in Azure
Доклад на Highload-2012
High Load
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Обзор перспективных баз данных для highload / Юрий Насретдинов
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
За гранью NoSQL: NewSQL на Cassandra
XML Native Database на примере SednaXML
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
OpenSource SQL Databases Enter Millions Queries per Second Era
Ad

More from Andrew Aksyonoff (6)

PPTX
Sphinx 2013
PPTX
Wr2013 opensource
PPTX
Как устроен поиск
PPTX
Крадущийся сервер, затаившийся диод
PPTX
Про качественный поиск
PPTX
Как написать JIT компилятор
Sphinx 2013
Wr2013 opensource
Как устроен поиск
Крадущийся сервер, затаившийся диод
Про качественный поиск
Как написать JIT компилятор

MySQL 101

  • 1. mysql 101 // Андрей Аксенов // #addconf 2012 MySQL 101 Андрей Аксенов, AddConf, 2012
  • 2. mysql 101 // Андрей Аксенов // #addconf 2012 ПРО БАЗЫ ДАННЫХ
  • 3. mysql 101 // Андрей Аксенов // #addconf 2012 Ряд шокирующих новостей • ШН1. select * from table where id=X, mysql, python, 10K rps == 0.01M rps • ШН2. hash::find(), C++, 1-10M rps • ШН3. Любые БД (SQL, NoSQL, WtfQL) – они про простоту, а не скорость • ШН4. Скорость важна «через тоже»; нужна адская => пиши спецхранилку
  • 4. mysql 101 // Андрей Аксенов // #addconf 2012 Про реляционные базы • Все есть таблица (Table) • В которой есть строки (Rows) • В которых есть колонки (Columns) • Набор которых фиксирован (Schema) • Откуда простота? • Изоляция физического от логического
  • 5. mysql 101 // Андрей Аксенов // #addconf 2012 Про уровни • Физический == как хранить байтики • Логический == что писать в программе • Увы, про физический надо знать • Иначе тормоза неизбежны, как закат
  • 6. mysql 101 // Андрей Аксенов // #addconf 2012 Про логический уровень • Два вида, DDL + DML • DDL, definition == про схему == CREATE TABLE, ALTER TABLE, CREATE INDEX • DML, manipulation == про данные == SELECT, INSERT, DELETE, UPDATE
  • 7. mysql 101 // Андрей Аксенов // #addconf 2012 Про всё сложно • Реализация физуровня это хранилка строк, индексы, оптимизатор, планы запросов, буфера, кеши, логи, репликация, … • Детали реализации привязаны и сильно зависят от конкретной БД • Но, есть и вечные ценности
  • 8. mysql 101 // Андрей Аксенов // #addconf 2012 Про B-tree • Индексы всегда B-tree — хорошо подходят • Это спецструктура, которая – Хранит все пары (key, row_ptr) – Умеет быстро «дай все row_ptr, где key=X» (выборка по ключу) – Умеет быстро «дай все row_ptr, где key>=X && key<=Y» (выбора по диапазону) – Разумно быстро (не мгновенно!) обновляется
  • 9. mysql 101 // Андрей Аксенов // #addconf 2012 Про B-tree, пример • select * from 1_million_rows where id=123 без индекса == ууу... :( • select * from 1_million_rows where id=123 с индексом по title == ууу... :( • select * from 1_million_rows where id=123 с индексом по id == ооо! :)
  • 10. mysql 101 // Андрей Аксенов // #addconf 2012 ПРО ТРАНЗАКЦИИ
  • 11. mysql 101 // Андрей Аксенов // #addconf 2012 Про транзакции • Транзакция это набор операций над данными, имеющий ряд свойств • ACID – Atomicity – Consistency – Isolation – Durability
  • 12. mysql 101 // Андрей Аксенов // #addconf 2012 Про физику транзакций • Durability в теории? – В идеале, данные НИКОГДА не теряются – Ну, в смысле, после COMMIT – Ну, в смысле, если в ДЦ не попала молния • Durability на практике? – Реализация, Write Ahead Log – Оптимизация, менее жесткие гарантии
  • 13. mysql 101 // Андрей Аксенов // #addconf 2012 ПРО MYSQL
  • 14. mysql 101 // Андрей Аксенов // #addconf 2012 Нет (теперь) никакой ложки • Ложку украли где-то между 4.0 и 5.0 • Подключаемые движки (pluggable SE) – По-разному реализующие физику хранения, индексации, выборок • MySQL это общий код всего остального! – Сетевой протокол, разбор SQL, оптимизатор, репликация, итп • Отчасти рулится конфигом, /etc/my.cnf
  • 15. mysql 101 // Андрей Аксенов // #addconf 2012 ПРО MYISAM
  • 16. mysql 101 // Андрей Аксенов // #addconf 2012 Кратко в целом • Нетранзакционный • Иногда может потерять данные • Кеширует только индексы, строки нет • Так себе масштабируется по ядрам • Блокирующая вставка в 1 поток • Как следствие, ТОРМОЗА при write load
  • 17. mysql 101 // Андрей Аксенов // #addconf 2012 Хранилка строк • Файл /var/lib/mysql/$databaseName/ $tableName.MYD • Строки (грубо говоря) дописываются в конец по мере поступления • Важно, строки НИКАК не кешируются, каждый раз read() через OS!
  • 18. mysql 101 // Андрей Аксенов // #addconf 2012 Индексы • Файл /var/lib/mysql/$databaseName/ $tableName.MYI • Кешируются в памяти • Ключевая директива key_buffer
  • 19. mysql 101 // Андрей Аксенов // #addconf 2012 Зачем использовать • Обычно (в 99%) случаях незачем • Обычно InnoDB решительно лучше • Может, сколько-то осмысленно для постоянного дописывания (append) маловажных архивных данных – см. сравнительно быстрая вставка
  • 20. mysql 101 // Андрей Аксенов // #addconf 2012 Что и как тюнить про MyISAM • Если не используется? – Скрутить key_buffer вниз (~16-32M) • Если используется? – Скрутить key_buffer вверх – по размеру горячих (!) *.MYI – Иначе ТОРМОЗА
  • 21. mysql 101 // Андрей Аксенов // #addconf 2012 Что и как тюнить про MyISAM • Скрутить вниз sort_buffer, read_buffer, read_rnd_buffer, если вдруг «настроили» • Дефолтные небольшие значения обычно хорошо работают • Эти буфера аллокаются на каждый тред! 32M sort_buffer * 100 max_connections = минус 3.2 GB зазря
  • 22. mysql 101 // Андрей Аксенов // #addconf 2012 ПРО INNODB
  • 23. mysql 101 // Андрей Аксенов // #addconf 2012 Кратко в целом • Транзакционный • Данные не теряет • Кеширует и индексы, и строки • Получше масштабируется по ядрам • Блокировки и вставок, и чтений на уровне отдельных строк, а не всей таблицы
  • 24. mysql 101 // Андрей Аксенов // #addconf 2012 Хранилка строк + индексов • Все хранится вместе, в т.н. tablespace • Все кешируется вместе, ключевая директива innodb_buffer_pool_size • Хранится страничками по 8 KB, весь tablespace I/O вроде тоже страничками
  • 25. mysql 101 // Андрей Аксенов // #addconf 2012 Хранилка строк + индексов • По умолчанию, все таблицы всех баз (!!!) кладут все данные в один файл /var/lib/mysql/ibdata1, который никогда не уменьшается (адъ!) • При наличии innodb_file_per_table все лежит в /var/lib/mysql/$databaseName/ $tablename.ibdМясо
  • 26. mysql 101 // Андрей Аксенов // #addconf 2012 Зачем использовать • Наиболее внятный движок в (стоковом) MySQL – Быстрый – Надежный – Транзакционный – Масштабируемый
  • 27. mysql 101 // Андрей Аксенов // #addconf 2012 Что и как тюнить • Если не используется – скрутить innodb_buffer_pool_size вниз • Если используется – все несколько длиннее :) – плюс ряд дефолтов удивляет
  • 28. mysql 101 // Андрей Аксенов // #addconf 2012 Опасные умолчания • innodb_file_per_table нету, диск утекает • innodb_buffer_pool_size = 32M – Адово мало, надо 128M ... 128G • innodb_flush_log_at_trx_commit = 0 – Адово медленно (если не BBU), надо 2 • innodb_log_file_size = 5M – Тупо маловато, надо 16M … 1G
  • 29. mysql 101 // Андрей Аксенов // #addconf 2012 innodb_file_per_table • Без него – неконтролируемый рост ibdata1 • На свежей копии нужно сразу включать • На существующей копии можно сменить — но процесс нууудный – Dump, Unlink, Change, Import...
  • 30. mysql 101 // Андрей Аксенов // #addconf 2012 innodb_buffer_pool_size • Мега Кеш Всего! – И данных – И индексов – И даже data dictionary • Крутить вверх до упора, чо (~80%)
  • 31. mysql 101 // Андрей Аксенов // #addconf 2012 innodb_flush_log_at_trx_commit • Все пишется в WAL, ибо durability • Лог это что? Страховка, причем 2 видов! – Креш демона, креш машины – 0, fflush txn + fsync txn – 1, fflush 1 sec + fsync 1 sec – 2, fflsuh txn + fsync 1 sec – 0 для а) RAID b) BBU c) дрова d) живое BBU :) – 2 для обычных деревенских пареньков
  • 32. mysql 101 // Андрей Аксенов // #addconf 2012 innodb_log_file_size • Все пишется в WAL, ибо durability • Бесконечно писать нельзя • По пределу размера флаш грязных страниц • То. чем больше лог, тем реже запись! • Поэтому...
  • 33. mysql 101 // Андрей Аксенов // #addconf 2012 innodb_log_file_size • При RO нагрузке неважно совсем • При RW нагрузке важно • При WO нагрузке (импорт) адово важно • 128M .. 1G ok, более 2G нельзя • Более innodb_buffer_pool_size/2 тупо нет смысла
  • 34. mysql 101 // Андрей Аксенов // #addconf 2012 ИТОГО
  • 35. mysql 101 // Андрей Аксенов // #addconf 2012 О чем говорил иностранец • Оно внутри устроено — вот так • Оно из коробки настроено — вот так • Надо из коробки настраивать — не так! • Надо каждому — в т.ч. разработчикам • Потому что скорость разработки • Потому что тестирование во внятной среде
  • 36. mysql 101 // Андрей Аксенов // #addconf 2012 ВСЕ!