SlideShare a Scribd company logo
1 of 36
Download to read offline
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

What's hot

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

What's hot (20)

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

Similar to MySQL 101

Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
Oracle NoSQL Database
Oracle NoSQL DatabaseOracle NoSQL Database
Oracle NoSQL DatabaseAndrey Akulov
 
Обзор Redis storage / Symfony Camp UA 2011
Обзор Redis storage / Symfony Camp UA 2011Обзор Redis storage / Symfony Camp UA 2011
Обзор Redis storage / Symfony Camp UA 2011Igor Brovchenko
 
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...
Горизонтальное масштабирование: что, зачем, когда и как /Александр Макаров (Y...Ontico
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013
Низкоуровневые оптимизации. Андрей Аксенов. Unigine Open Air 2013Unigine Corp.
 
Open source субд глазами обычного программиста
Open source субд глазами обычного программистаOpen source субд глазами обычного программиста
Open source субд глазами обычного программистаSlach
 
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Эффективное использование x86-совместимых CPU (Алексей Тутубалин)
Эффективное использование x86-совместимых CPU (Алексей Тутубалин)Ontico
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...phpdevby
 
IOP202 Redis in Azure
IOP202 Redis in AzureIOP202 Redis in Azure
IOP202 Redis in Azuremourhoon
 
Доклад на Highload-2012
Доклад на Highload-2012Доклад на Highload-2012
Доклад на Highload-2012Alex Tutubalin
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBSergey Petrunya
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...Ontico
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновOntico
 
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)
ORM технологии в .NET (Nhibernate, Linq To SQL, Entity Framework)Pavel Tsukanov
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXMLSlach
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Ontico
 
OpenSource SQL Databases Enter Millions Queries per Second Era
OpenSource SQL Databases Enter Millions Queries per Second EraOpenSource SQL Databases Enter Millions Queries per Second Era
OpenSource SQL Databases Enter Millions Queries per Second EraSveta Smirnova
 

Similar to MySQL 101 (20)

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

More from Andrew Aksyonoff

Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поискAndrew Aksyonoff
 
Крадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодКрадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодAndrew Aksyonoff
 
Про качественный поиск
Про качественный поискПро качественный поиск
Про качественный поискAndrew Aksyonoff
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать JIT компиляторAndrew Aksyonoff
 

More from Andrew Aksyonoff (6)

Sphinx 2013
Sphinx 2013Sphinx 2013
Sphinx 2013
 
Wr2013 opensource
Wr2013 opensourceWr2013 opensource
Wr2013 opensource
 
Как устроен поиск
Как устроен поискКак устроен поиск
Как устроен поиск
 
Крадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диодКрадущийся сервер, затаившийся диод
Крадущийся сервер, затаившийся диод
 
Про качественный поиск
Про качественный поискПро качественный поиск
Про качественный поиск
 
Как написать JIT компилятор
Как написать JIT компиляторКак написать JIT компилятор
Как написать 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 ВСЕ!