SlideShare a Scribd company logo
1 of 51
Download to read offline
14:551
Новые фичи в MariaDB
и в MySQL
что общего и в чем разница
DevConf 2013, Сергей Петруня, Monty Program Ab
14:562
Что такое MariaDB
• Это ветка (branch) субд MySQL
• Лицензия - GPL
• Полностью совместима c «основным» MySQL
– форматы файлов
– соединения master<->slave*
– имена бинарников, init-скрипты и тд.
• Отличия от MySQL
– Собственные фичи
– Percona's XtraDB (vanilla InnoDB то же есть, как plugin)
– Интегрированы разные патчи от Percona, Sphinx, и других
авторов
14:563
История релизов MariaDB и MySQL
• 2012 – MariaDB 5.5
– это MySQL 5.5 + еще фичи
• 2013 – MySQL 5.6
• 2013? – MariaDB 10.0
= важное из MySQL 5.6 + фичи + альтернативные реализации
14:564
Процесс разработки
14:565
Направления разработки
• InnoDB
• Репликация
• Оптимизатор
• PERFORMANCE_SCHEMA
• NoSQL
14:566
Направления разработки
• InnoDB
• Репликация
• Оптимизатор
• PERFORMANCE_SCHEMA
• NoSQL
14:567
InnoDB в MySQL 5.6
• Fulltext index
• Производительность
– Масштабируемость на многоядерных системах (16+ ядер)
– Более равномерный cброс данных на диск (adaptive flushing)
– Настройки сброса для SSD/HDD
– Read-only транзакции
• Высокая доступность
– Online ALTER TABLE для многих операций
– Transportable tablespaces
– Сохранение/загрузка содержимого Buffer Pool
• как в XtraDB (в Percona Server 5.5, MariaDB 5.5)
14:568
InnoDB в MySQL 5.6 (2)
• Сжатие данных
– Настройка компрессии, уровень 1...9
– Обработка провалов компрессии
– Диагностика компрессии для каждого индекса
• Redo log > 4G
• и т. д..
14:569
Направления разработки
• InnoDB
• Репликация
• Оптимизатор
• PERFORMANCE_SCHEMA
• NoSQL
14:5610
Репликация : MariaDB 5.3/5.5
• Group Commit ( Percona Server)→
– Писать в binlog и InnoDB надо синхронно
– Писать надо группами
• Контрольные суммы событий в binlog
– бекпорт из MySQL 5.6
• RBR: текст исходного запроса в binlog
• RBR: оптимизация работы с таблицами без PK
– использование индексов
14:5611
Репликация: MySQL 5.6
• Group commit
– Похож на MariaDB
– из-за разных InnoDB пока не сравнить
• RBR: Batch Applier для таблиц без PK
• Контрольные суммы событий в binlog
• RBR: текст исходного запроса в binlog
• Global Transaction IDs
• Параллельный slave
• RBR: partial row images
• Slave crash safety
• Утилиты для администрирования
– mysqlrpl*
14:5612
Репликация: MySQL 5.6: Параллельный slave
• Базовое предположение
Изменения в разных БД (schema) можно применять в
любом порядке
• Линейное ускорение, если транзакции размазаны по
разным БД.
• MariaDB: альтернативная идея
– Group commit помечает, какие он делал группы
– Транзакции-члены группы были совместно “готовы к
коммиту”
• Конфликтов нет
– Slave может применять членов группы параллельно
14:5613
Репликация: MySQL 5.6: GTID
• Вместо binlog position – set<server-uuid:trx-no>
• Цели
– Простое администрирование
CHANGE MASTER TO MASTER_AUTO_POSITION=1
– Простая смена мастера
– master->slave promotion
– ...
• Проблемы
– Репликация между GTID и не-GTID серверами невозможна
– В случае ошибки починить будет нелегко
– ...
• MariaDB: будет другая реализация
14:5614
Репликация в MariaDB 10.0
• Своя реализация GTID
– Вместо set<server-uuid:trx-no>
set<domain:server-id:trx-no>
– Домен – последовательность транзакций, в которой
должен сохраняется порядок
• Между доменами порядок не сохраняется
– Возможность репликации между GTID и не GTID
• Multi-Source
– Slave с несколькими masters
– Предполагается отсутствие конфликтов
– На основе кода от TaoBao.
14:5615
Направления разработки
• InnoDB
• Репликация
• Оптимизатор
• PERFORMANCE_SCHEMA
• NoSQL
14:5616
Оптимизатор – общие корни
“Новые фичи”
14:5617
Подзапросы
14:5618
Новые фичи - подзапросы
• “Не используйте в MySQL подзапросы”
• В Facebook их запретили на уровне парсера
• Причина
– Отсутствие оптимизатора
– “Наивное” выполнение подзапросов
14:5619
Наивное выполнение подзапросов (1)
• Подзапрос IN (SELECT ...)
select * from hotel
where
hotel.country='USA' and
hotel.name IN (select hotel_stays.hotel
from hotel_stays
where hotel_stays.customer='John Smith')
for (each hotel in USA ) {
if (John Smith stayed here) {
…
}
}
• Наивное выполнение:
• Медленно!
14:5620
Наивное выполнение подзапросов (2)
• Подзапрос FROM (SELECT ...)
select *
from
(select *
from hotel
where hotel.rooms > 500
) as big_hotel
where
big_hotel.nearest_aiport='HEL'
• Наивное выполнение
1. Найти все отели, у которых rooms>500,
записать во временную таблицу big_hotel
2. Просмотреть big_hotel и выбрать отели, для
которых nearest_aiport='HEL'
• Медленно!
14:5621
14:5622
14:5623
Оптимизации для подзапросов
• Большая работа
• Оптимизации для
– IN (SELECT…)
– FROM (SELECT …)
– И многих других случаев
• Сравнивали support cases с PostgreSQL
– До: ~1000 раз медленнее
– После: такой же порядок
• => Подзапросы работают как join'ы
• Релизы
– MariaDB 5.3 (все)
– MySQL 5.6 (подмножество)
14:5624
Batched Key Access
14:5625
Batched Key Access - зачем
• Большие, аналитические join'ы работали медленно
– DBT-3 scale=10, 30G data, аналитика
есть запросы >24 часов
• Причина?
– Nested Loops Join
– Random disk IO
14:5626
Batched Key Access - идея
Причины ускорения
• Вращающийся диск – одно движение головки
• Дружественно к кешам
• Дружественно к prefetch
Nested Loops Join Batched Key Access
14:5627
Batched Key Access benchmark
Запускаем с
• Разными размерами @@join_buffer_size
• Разными размерами промежутка $DATE1...$DATE2
set join_cache_level=6; – enable BKA
select max(l_extendedprice)
from orders, lineitem
where
l_orderkey=o_orderkey and
o_orderdate between $DATE1 and $DATE2
14:5628
Batched Key Access benchmark (2)
-2,000,000 3,000,000 8,000,000 13,000,000 18,000,000 23,000,000 28,000,000 33,000,000
0
500
1000
1500
2000
2500
3000
BKA join performance depending on buffer size
query_size=1, regular
query_size=1, BKA
query_size=2, regular
query_size=2, BKA
query_size=3, regular
query_size=3, BKA
Buffer size, bytes
Querytime,sec
Время выполнения без BKA
Если дать BKA достаточно
большой буфер...
14:5629
Результат
• 4 GB RAM
• DBT-3 benchmark, scale=10, InnoDB
– 30GB data (InnoDB)
– 20 “decision-support” аналитических запросов
До После
avg 3.24 hrs 5.91 min
median 0.32 hrs 4.48 min
max 25.97 hrs* 22.92 min
* - надоело ждать
14:5630
Batched Key Access - детали
• MariaDB 5.3
– “Key-ordered scan” (см предыдущий пример)
– “Rowid-ordered scan”
• MySQL 5.6
– “Using MRR” - не работает для clustered PK
• How-to
– Лучше использовать MariaDB :-)
– Надо настроить параметры (kb.askmonty.org).
14:5631
Index Condition Pushdown
14:5632
Index Condition Pushdown
alter table lineitem add index s_r (l_shipdate, l_receiptdate);
select count(*) from lineitem
where
l_shipdate between '1993-01-01' and '1993-02-01' and
datediff(l_receiptdate,l_shipdate) > 25 and
l_quantity > 40
• Еще одна “общая” фича MariaDB 5.3 и MySQL 5.6
+----+-------------+----------+-------+---------------+------+---------+------+--------+------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+------+---------+------+--------+------------------------------------+
| 1 | SIMPLE | lineitem | range | s_r | s_r | 4 | NULL | 158854 | Using index condition; Using where |
+----+-------------+----------+-------+---------------+------+---------+------+--------+------------------------------------+
1. Читать индекс в диапазоне
l_shipdate between '1993-01-01' and '1993-02-01'
2. Проверить условие на колонки из индекса
datediff(l_receiptdate,l_shipdate) > 25
3. Читать полные записи
4. Проверить оставшуюся часть WHERE
l_quantity > 40
← Новое!
Уменьшает число←
читаемых записей
14:5633
Index Condition Pushdown - итого
• MariaDB 5.3 MySQL 5.6→
• Работает для любого чтения через индекс (ref,
range, eq_ref)
• Проверяет часть WHERE до чтения полной записи
– Можно иметь “почти Using index”
• Ускорение
– IO-bound – 5x-10x
– CPU-bound: 2x.
14:5634
Extended keys
14:5635
Extended Keys (расширенные индексы?)
col1 col2 pk1 pk2
• Раньше: бОльшая часть оптимизатора про “xвост” не знала
• MariaDB 5.5, повтор в MySQL 5.6:
– Все части оптимизатора могут ипользовать “хвост”.
CREATE TABLE tbl (
pk1 sometype,
pk2 sometype,
...
col1 sometype,
col2 sometype,
...
KEY indexA (col1, col2)
...
PRIMARY KEY (pk1, pk2)
) ENGINE=InnoDB
indexA col1 col2 pk1 pk2
• У каждого индекса в InnoDB есть невидимый “хвост”
14:5636
Улучшенный EXPLAIN
14:5637
MySQL 5.6: улучшения в EXPLAIN
• EXPLAIN UPDATE/DELETE/INSERT … SELECT
mysql> explain update customer set c_acctbal = c_acctbal - 100 where c_custkey=12354;
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
| 1 | SIMPLE | customer | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+
• EXPLAIN FORMAT=JSON
– Выдает EXPLAIN в JSON
– Показывает, куда прицеплены части WHERE
– Показывает, зачем используются “Using temporary” и “Using
filesort”
– А так, тот же EXPLAIN, вид сбоку.
14:5638
Что такое “части WHERE”
explain
select
count(*)
from
orders, customer
where
customer.c_custkey=orders.o_custkey and
customer.c_mktsegment='BUILDING' and
orders.o_totalprice > customer.c_acctbal and
orders.o_orderpriority='1-URGENT'
+----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
| 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 1509871 | Using where |
| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 | dbt3sf10.customer.c_custkey | 7 | Using where |
+----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
14:5639
{
"query_block": {
"select_id": 1,
"nested_loop": [
{
"table": {
"table_name": "customer",
"access_type": "ALL",
"possible_keys": [
"PRIMARY"
],
"rows": 1509871,
"filtered": 100,
"attached_condition": "(`dbt3sf10`.`customer`.`c_mktsegment` = 'BUILDING')"
}
},
{
"table": {
"table_name": "orders",
"access_type": "ref",
"possible_keys": [
"i_o_custkey"
],
"key": "i_o_custkey",
"used_key_parts": [
"o_custkey"
],
"key_length": "5",
"ref": [
"dbt3sf10.customer.c_custkey"
],
"rows": 7,
"filtered": 100,
"attached_condition": "((`dbt3sf10`.`orders`.`o_orderpriority` = '1-URGENT') and
(`dbt3sf10`.`orders`.`o_totalprice` > `dbt3sf10`.`customer`.`c_acctbal`))"
}
}
]
}
}
+----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
| 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 1509871 | Using where |
| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 | dbt3sf10.customer.c_custkey | 7 | Using where |
+----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
14:5640
Статистика
14:5641
Статистика по индексамselect
count(*)
from
customer, orders
where
customer.c_custkey=orders.o_custkey and customer.c_mktsegment='BUILDING';
+------+-------------+----------+------+---------------+-------------+---------+--------------------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+------+---------------+-------------+---------+--------------------+--------+-------------+
| 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 148305 | Using where |
| 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 | customer.c_custkey | 7 | Using index |
+------+-------------+----------+------+---------------+-------------+---------+--------------------+--------+-------------+
MariaDB > show table status like 'orders'G
*************************** 1. row ***************************
Name: orders
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 1495152
.............
MariaDB > show keys from orders where key_name='i_o_custkey'G
*************************** 1. row ***************************
Table: orders
Non_unique: 1
Key_name: i_o_custkey
Seq_in_index: 1
Column_name: o_custkey
Collation: A
Cardinality: 212941
Sub_part: NULL
.................
?
1495152 / 212941 = 7
7 заказов/ заказчик
14:5642
Проблемы со статистикой
MySQL 5.5, InnoDB
• Статистика вычисляется на лету
– Когда отркрывается таблица (перезапуск сервера, ALTER TABLE)
– После изменения n% записей
– …
• Статистика вычисляется методом случайных проб
– @@innodb_stats_sample_pages
• Результат
– Статистика меняется без предупреждения
=> А с ней и планы запросов тоже
• DBT-3 benchmark
– 22 аналитических запросов
– Планов на запрос: avg=2.8, max=7.с
14:5643
Решение проблем со статистикой
Persistent statistics v1
• Percona Server 5.5 (спортировано в MariaDB 5.5)
– Надо включить: innodb_use_sys_stats_table=1
• Статистика хранится внутри InnoDB
– Можно посмотреть (но не менять) через information_schema.innodb_sys_stats
• Можно отключить авто-перевычисление: innodb_stats_auto_update=OFF
Persistent statistics v2
• MySQL 5.6
– Включена по умолчанию (innodb_stats_persistent=1)
• Хранится в обычных таблицах (engine=InnoDB)
– mysql.innodb_table_stats, mysql.innodb_index_stats
• Можно отключить авто-перевычисление: innodb_stats_auto_recalc=OFF
• Можно настраивать статистику для каждой таблицы
14:5644
Статистика – текущее состояние
• Проблема #2: Статистики не хватает. Есть только
– Число записей в таблице
– Число разных значений в *индексе*
• Сначала в Percona, потом в MySQL
– Хранение статистики
– Запрет авто-обновления
• Проблема #1:
метод случайных проб
– DBT-3
– Scale=30
– Гоняем EXPLAINы
– Считаем планы
14:5645
MariaDB 10.0: Engine independent statistics
• Собирается/используется на SQL уровне
– mysql.{table,index,column}_stat
• Автообновления нет
– ANALYZE TABLE
• 100% точная, детерминированная статистика
• Больше данных
– Статистика по индексам (уже есть)
– Статистика по таблицам (уже есть)
– Статистика по колонкам
• MIN/MAX значение
• Число NULL / not-NULL
– Гистограммы нескольких типов
=> Оптимизатор будет умен и предсказуем.
14:5646
Направления разработки
• InnoDB
• Репликация
• Оптимизатор
• PERFORMANCE_SCHEMA
• NoSQL
14:5647
PERFORMANCE_SCHEMA
• Новое средство диагностики
– “На каких lock'ах ждет соединение X?”
– “На каких lock'ах вообще ждут?”
– “Сколько MB/sec (или rows/sec) мы
пишем/читаем в таблицу/index $NAME?”
– ...
• Появилось в MySQL 5.5, доработано в 5.6
• Оверхед стал меньше
– Но все еще есть (5%...15%)
14:5648
Направления разработки
• InnoDB
• Репликация
• Оптимизатор
• PERFORMANCE_SCHEMA
• NoSQL
14:5649
NoSQL
• MariaDB 5.3
– Handlersocket плагин
– Dynamic columns
• MySQL 5.6
– Memcached плагин для InnoDB
• MariaDB 10.0
– Поддержка имен колонок в Dynamic Columns
• В 5.5 в качестве имен были integers.
– Табличный движок Cassandra
– Табличный движок Сonnect.
14:5650
Спасибо!
Вопросы / Ответы
14:5651
Итого
• Oracle движет вперед InnoDB
– Некоторые идеи подает Percona
• Oracle движет вперед PERFORMANCE_SCHEMA
– В 5.6 она стала интересной.
• MariaDB 5.5 имеет продвинутый оптимизатор
– Даже MySQL 5.6 не догнал
• В репликации
– MariaDB 5.5 двинулась вперед
– MySQL 5.6 решил вообще все перевернуть с GTID.
• В MariaDB 10.0 будет другой дизайн

More Related Content

What's hot

Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Ontico
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Ontico
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
odnoklassniki.ru
 
Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)
Andrew Avdeev
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Ontico
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Ontico
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Ontico
 
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Ontico
 

What's hot (20)

Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
Семантическое ядро рунета - высоконагруженная сontent-based рекомендательная ...
 
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
Производительность запросов в PostgreSQL - шаг за шагом / Илья Космодемьянски...
 
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
Tempesta FW: challenges, internals, use cases / Александр Крижановский (Tempe...
 
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
PostgreSQL - Ups, DevOps..., Алексей Лесовский (PostgreSQL-Consulting)
 
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
DPDK в виртуальном коммутаторе Open vSwitch / Александр Джуринский (Selectel)
 
обзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторингаобзор архитектуры и подсистем деплоя и мониторинга
обзор архитектуры и подсистем деплоя и мониторинга
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
Введение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийВведение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложений
 
Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)Реализация восстановления после аварий / Сергей Бурладян (Avito)
Реализация восстановления после аварий / Сергей Бурладян (Avito)
 
Mysql vs postgresql
Mysql vs postgresqlMysql vs postgresql
Mysql vs postgresql
 
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
Мониторинг ожиданий в PostgreSQL / Курбангалиев Ильдус (Postgres Professional)
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
Эволюция программно-аппаратного обеспечения хранения фотографий в Badoo / Дми...
 
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
Мониторинг в высоконагруженных (и не только) проектах: сравнительный анализ с...
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
MyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDBMyRocks: табличный движок для MySQL на основе RocksDB
MyRocks: табличный движок для MySQL на основе RocksDB
 
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
Что нового и полезного в PostgreSQL 9.5 / Илья Космодемьянский (PostgreSQL-Co...
 

Similar to Devconf2013 new-features-in-mysql-and-mariadb

Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
Alex Chistyakov
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012
Alex Chistyakov
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
phpdevby
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Sveta Smirnova
 
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Open Source SQL-базы данных вступили в эру миллионов запросов в секунду / Фед...
Ontico
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Sveta Smirnova
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
Ontico
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
Nikita Borzykh
 
Devconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-featuresDevconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-features
Sergey Petrunya
 

Similar to Devconf2013 new-features-in-mysql-and-mariadb (20)

pgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresqlpgconf.ru 2015 avito postgresql
pgconf.ru 2015 avito postgresql
 
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
SQL-ник DevDay. Рубцов. Новое в Percona Server и MariaDB в сравнении с MySQL 5.5
 
Обзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий НасретдиновОбзор перспективных баз данных для highload / Юрий Насретдинов
Обзор перспективных баз данных для highload / Юрий Насретдинов
 
Практический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQLПрактический опыт использования некоторых современных решений репликации MySQL
Практический опыт использования некоторых современных решений репликации MySQL
 
Mysql replication DevConf 2012
Mysql replication DevConf 2012Mysql replication DevConf 2012
Mysql replication DevConf 2012
 
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...MongoDB. Области применения, преимущества и узкие места, тонкости использован...
MongoDB. Области применения, преимущества и узкие места, тонкости использован...
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Deployment to production with an unexpected load
Deployment to production with an unexpected loadDeployment to production with an unexpected load
Deployment to production with an unexpected load
 
"Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7""Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7"
 
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потеряхМониторинг и отладка MySQL: максимум информации при минимальных потерях
Мониторинг и отладка MySQL: максимум информации при минимальных потерях
 
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
 
High Load
High LoadHigh Load
High Load
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
Российская СУБД Postgres Pro
Российская СУБД Postgres ProРоссийская СУБД Postgres Pro
Российская СУБД Postgres Pro
 
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow Zabbix в сервисной компании  ОНЛАНТА -  Zabbix Meetup Moscow
Zabbix в сервисной компании  ОНЛАНТА - Zabbix Meetup Moscow
 
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
MyRocks Табличный Движок для MySQL / Алексей Майков (Facebook) / Сергей Петру...
 
Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.Истинный DevOps. Секрет 42.
Истинный DevOps. Секрет 42.
 
Devconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-featuresDevconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-features
 
Kopytov
KopytovKopytov
Kopytov
 

More from Sergey Petrunya

More from Sergey Petrunya (20)

New optimizer features in MariaDB releases before 10.12
New optimizer features in MariaDB releases before 10.12New optimizer features in MariaDB releases before 10.12
New optimizer features in MariaDB releases before 10.12
 
MariaDB's join optimizer: how it works and current fixes
MariaDB's join optimizer: how it works and current fixesMariaDB's join optimizer: how it works and current fixes
MariaDB's join optimizer: how it works and current fixes
 
Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8
 
Improving MariaDB’s Query Optimizer with better selectivity estimates
Improving MariaDB’s Query Optimizer with better selectivity estimatesImproving MariaDB’s Query Optimizer with better selectivity estimates
Improving MariaDB’s Query Optimizer with better selectivity estimates
 
JSON Support in MariaDB: News, non-news and the bigger picture
JSON Support in MariaDB: News, non-news and the bigger pictureJSON Support in MariaDB: News, non-news and the bigger picture
JSON Support in MariaDB: News, non-news and the bigger picture
 
Optimizer Trace Walkthrough
Optimizer Trace WalkthroughOptimizer Trace Walkthrough
Optimizer Trace Walkthrough
 
ANALYZE for Statements - MariaDB's hidden gem
ANALYZE for Statements - MariaDB's hidden gemANALYZE for Statements - MariaDB's hidden gem
ANALYZE for Statements - MariaDB's hidden gem
 
Optimizer features in recent releases of other databases
Optimizer features in recent releases of other databasesOptimizer features in recent releases of other databases
Optimizer features in recent releases of other databases
 
MariaDB 10.4 - что нового
MariaDB 10.4 - что новогоMariaDB 10.4 - что нового
MariaDB 10.4 - что нового
 
Using histograms to get better performance
Using histograms to get better performanceUsing histograms to get better performance
Using histograms to get better performance
 
MariaDB Optimizer - further down the rabbit hole
MariaDB Optimizer - further down the rabbit holeMariaDB Optimizer - further down the rabbit hole
MariaDB Optimizer - further down the rabbit hole
 
Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4
 
Lessons for the optimizer from running the TPC-DS benchmark
Lessons for the optimizer from running the TPC-DS benchmarkLessons for the optimizer from running the TPC-DS benchmark
Lessons for the optimizer from running the TPC-DS benchmark
 
MariaDB 10.3 Optimizer - where does it stand
MariaDB 10.3 Optimizer - where does it standMariaDB 10.3 Optimizer - where does it stand
MariaDB 10.3 Optimizer - where does it stand
 
MyRocks in MariaDB | M18
MyRocks in MariaDB | M18MyRocks in MariaDB | M18
MyRocks in MariaDB | M18
 
New Query Optimizer features in MariaDB 10.3
New Query Optimizer features in MariaDB 10.3New Query Optimizer features in MariaDB 10.3
New Query Optimizer features in MariaDB 10.3
 
MyRocks in MariaDB
MyRocks in MariaDBMyRocks in MariaDB
MyRocks in MariaDB
 
Histograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQLHistograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQL
 
Say Hello to MyRocks
Say Hello to MyRocksSay Hello to MyRocks
Say Hello to MyRocks
 
Common Table Expressions in MariaDB 10.2
Common Table Expressions in MariaDB 10.2Common Table Expressions in MariaDB 10.2
Common Table Expressions in MariaDB 10.2
 

Devconf2013 new-features-in-mysql-and-mariadb

  • 1. 14:551 Новые фичи в MariaDB и в MySQL что общего и в чем разница DevConf 2013, Сергей Петруня, Monty Program Ab
  • 2. 14:562 Что такое MariaDB • Это ветка (branch) субд MySQL • Лицензия - GPL • Полностью совместима c «основным» MySQL – форматы файлов – соединения master<->slave* – имена бинарников, init-скрипты и тд. • Отличия от MySQL – Собственные фичи – Percona's XtraDB (vanilla InnoDB то же есть, как plugin) – Интегрированы разные патчи от Percona, Sphinx, и других авторов
  • 3. 14:563 История релизов MariaDB и MySQL • 2012 – MariaDB 5.5 – это MySQL 5.5 + еще фичи • 2013 – MySQL 5.6 • 2013? – MariaDB 10.0 = важное из MySQL 5.6 + фичи + альтернативные реализации
  • 5. 14:565 Направления разработки • InnoDB • Репликация • Оптимизатор • PERFORMANCE_SCHEMA • NoSQL
  • 6. 14:566 Направления разработки • InnoDB • Репликация • Оптимизатор • PERFORMANCE_SCHEMA • NoSQL
  • 7. 14:567 InnoDB в MySQL 5.6 • Fulltext index • Производительность – Масштабируемость на многоядерных системах (16+ ядер) – Более равномерный cброс данных на диск (adaptive flushing) – Настройки сброса для SSD/HDD – Read-only транзакции • Высокая доступность – Online ALTER TABLE для многих операций – Transportable tablespaces – Сохранение/загрузка содержимого Buffer Pool • как в XtraDB (в Percona Server 5.5, MariaDB 5.5)
  • 8. 14:568 InnoDB в MySQL 5.6 (2) • Сжатие данных – Настройка компрессии, уровень 1...9 – Обработка провалов компрессии – Диагностика компрессии для каждого индекса • Redo log > 4G • и т. д..
  • 9. 14:569 Направления разработки • InnoDB • Репликация • Оптимизатор • PERFORMANCE_SCHEMA • NoSQL
  • 10. 14:5610 Репликация : MariaDB 5.3/5.5 • Group Commit ( Percona Server)→ – Писать в binlog и InnoDB надо синхронно – Писать надо группами • Контрольные суммы событий в binlog – бекпорт из MySQL 5.6 • RBR: текст исходного запроса в binlog • RBR: оптимизация работы с таблицами без PK – использование индексов
  • 11. 14:5611 Репликация: MySQL 5.6 • Group commit – Похож на MariaDB – из-за разных InnoDB пока не сравнить • RBR: Batch Applier для таблиц без PK • Контрольные суммы событий в binlog • RBR: текст исходного запроса в binlog • Global Transaction IDs • Параллельный slave • RBR: partial row images • Slave crash safety • Утилиты для администрирования – mysqlrpl*
  • 12. 14:5612 Репликация: MySQL 5.6: Параллельный slave • Базовое предположение Изменения в разных БД (schema) можно применять в любом порядке • Линейное ускорение, если транзакции размазаны по разным БД. • MariaDB: альтернативная идея – Group commit помечает, какие он делал группы – Транзакции-члены группы были совместно “готовы к коммиту” • Конфликтов нет – Slave может применять членов группы параллельно
  • 13. 14:5613 Репликация: MySQL 5.6: GTID • Вместо binlog position – set<server-uuid:trx-no> • Цели – Простое администрирование CHANGE MASTER TO MASTER_AUTO_POSITION=1 – Простая смена мастера – master->slave promotion – ... • Проблемы – Репликация между GTID и не-GTID серверами невозможна – В случае ошибки починить будет нелегко – ... • MariaDB: будет другая реализация
  • 14. 14:5614 Репликация в MariaDB 10.0 • Своя реализация GTID – Вместо set<server-uuid:trx-no> set<domain:server-id:trx-no> – Домен – последовательность транзакций, в которой должен сохраняется порядок • Между доменами порядок не сохраняется – Возможность репликации между GTID и не GTID • Multi-Source – Slave с несколькими masters – Предполагается отсутствие конфликтов – На основе кода от TaoBao.
  • 15. 14:5615 Направления разработки • InnoDB • Репликация • Оптимизатор • PERFORMANCE_SCHEMA • NoSQL
  • 16. 14:5616 Оптимизатор – общие корни “Новые фичи”
  • 18. 14:5618 Новые фичи - подзапросы • “Не используйте в MySQL подзапросы” • В Facebook их запретили на уровне парсера • Причина – Отсутствие оптимизатора – “Наивное” выполнение подзапросов
  • 19. 14:5619 Наивное выполнение подзапросов (1) • Подзапрос IN (SELECT ...) select * from hotel where hotel.country='USA' and hotel.name IN (select hotel_stays.hotel from hotel_stays where hotel_stays.customer='John Smith') for (each hotel in USA ) { if (John Smith stayed here) { … } } • Наивное выполнение: • Медленно!
  • 20. 14:5620 Наивное выполнение подзапросов (2) • Подзапрос FROM (SELECT ...) select * from (select * from hotel where hotel.rooms > 500 ) as big_hotel where big_hotel.nearest_aiport='HEL' • Наивное выполнение 1. Найти все отели, у которых rooms>500, записать во временную таблицу big_hotel 2. Просмотреть big_hotel и выбрать отели, для которых nearest_aiport='HEL' • Медленно!
  • 23. 14:5623 Оптимизации для подзапросов • Большая работа • Оптимизации для – IN (SELECT…) – FROM (SELECT …) – И многих других случаев • Сравнивали support cases с PostgreSQL – До: ~1000 раз медленнее – После: такой же порядок • => Подзапросы работают как join'ы • Релизы – MariaDB 5.3 (все) – MySQL 5.6 (подмножество)
  • 25. 14:5625 Batched Key Access - зачем • Большие, аналитические join'ы работали медленно – DBT-3 scale=10, 30G data, аналитика есть запросы >24 часов • Причина? – Nested Loops Join – Random disk IO
  • 26. 14:5626 Batched Key Access - идея Причины ускорения • Вращающийся диск – одно движение головки • Дружественно к кешам • Дружественно к prefetch Nested Loops Join Batched Key Access
  • 27. 14:5627 Batched Key Access benchmark Запускаем с • Разными размерами @@join_buffer_size • Разными размерами промежутка $DATE1...$DATE2 set join_cache_level=6; – enable BKA select max(l_extendedprice) from orders, lineitem where l_orderkey=o_orderkey and o_orderdate between $DATE1 and $DATE2
  • 28. 14:5628 Batched Key Access benchmark (2) -2,000,000 3,000,000 8,000,000 13,000,000 18,000,000 23,000,000 28,000,000 33,000,000 0 500 1000 1500 2000 2500 3000 BKA join performance depending on buffer size query_size=1, regular query_size=1, BKA query_size=2, regular query_size=2, BKA query_size=3, regular query_size=3, BKA Buffer size, bytes Querytime,sec Время выполнения без BKA Если дать BKA достаточно большой буфер...
  • 29. 14:5629 Результат • 4 GB RAM • DBT-3 benchmark, scale=10, InnoDB – 30GB data (InnoDB) – 20 “decision-support” аналитических запросов До После avg 3.24 hrs 5.91 min median 0.32 hrs 4.48 min max 25.97 hrs* 22.92 min * - надоело ждать
  • 30. 14:5630 Batched Key Access - детали • MariaDB 5.3 – “Key-ordered scan” (см предыдущий пример) – “Rowid-ordered scan” • MySQL 5.6 – “Using MRR” - не работает для clustered PK • How-to – Лучше использовать MariaDB :-) – Надо настроить параметры (kb.askmonty.org).
  • 32. 14:5632 Index Condition Pushdown alter table lineitem add index s_r (l_shipdate, l_receiptdate); select count(*) from lineitem where l_shipdate between '1993-01-01' and '1993-02-01' and datediff(l_receiptdate,l_shipdate) > 25 and l_quantity > 40 • Еще одна “общая” фича MariaDB 5.3 и MySQL 5.6 +----+-------------+----------+-------+---------------+------+---------+------+--------+------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+---------------+------+---------+------+--------+------------------------------------+ | 1 | SIMPLE | lineitem | range | s_r | s_r | 4 | NULL | 158854 | Using index condition; Using where | +----+-------------+----------+-------+---------------+------+---------+------+--------+------------------------------------+ 1. Читать индекс в диапазоне l_shipdate between '1993-01-01' and '1993-02-01' 2. Проверить условие на колонки из индекса datediff(l_receiptdate,l_shipdate) > 25 3. Читать полные записи 4. Проверить оставшуюся часть WHERE l_quantity > 40 ← Новое! Уменьшает число← читаемых записей
  • 33. 14:5633 Index Condition Pushdown - итого • MariaDB 5.3 MySQL 5.6→ • Работает для любого чтения через индекс (ref, range, eq_ref) • Проверяет часть WHERE до чтения полной записи – Можно иметь “почти Using index” • Ускорение – IO-bound – 5x-10x – CPU-bound: 2x.
  • 35. 14:5635 Extended Keys (расширенные индексы?) col1 col2 pk1 pk2 • Раньше: бОльшая часть оптимизатора про “xвост” не знала • MariaDB 5.5, повтор в MySQL 5.6: – Все части оптимизатора могут ипользовать “хвост”. CREATE TABLE tbl ( pk1 sometype, pk2 sometype, ... col1 sometype, col2 sometype, ... KEY indexA (col1, col2) ... PRIMARY KEY (pk1, pk2) ) ENGINE=InnoDB indexA col1 col2 pk1 pk2 • У каждого индекса в InnoDB есть невидимый “хвост”
  • 37. 14:5637 MySQL 5.6: улучшения в EXPLAIN • EXPLAIN UPDATE/DELETE/INSERT … SELECT mysql> explain update customer set c_acctbal = c_acctbal - 100 where c_custkey=12354; +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+ | 1 | SIMPLE | customer | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where | +----+-------------+----------+-------+---------------+---------+---------+------+------+-------------+ • EXPLAIN FORMAT=JSON – Выдает EXPLAIN в JSON – Показывает, куда прицеплены части WHERE – Показывает, зачем используются “Using temporary” и “Using filesort” – А так, тот же EXPLAIN, вид сбоку.
  • 38. 14:5638 Что такое “части WHERE” explain select count(*) from orders, customer where customer.c_custkey=orders.o_custkey and customer.c_mktsegment='BUILDING' and orders.o_totalprice > customer.c_acctbal and orders.o_orderpriority='1-URGENT' +----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+ | 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 1509871 | Using where | | 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 | dbt3sf10.customer.c_custkey | 7 | Using where | +----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
  • 39. 14:5639 { "query_block": { "select_id": 1, "nested_loop": [ { "table": { "table_name": "customer", "access_type": "ALL", "possible_keys": [ "PRIMARY" ], "rows": 1509871, "filtered": 100, "attached_condition": "(`dbt3sf10`.`customer`.`c_mktsegment` = 'BUILDING')" } }, { "table": { "table_name": "orders", "access_type": "ref", "possible_keys": [ "i_o_custkey" ], "key": "i_o_custkey", "used_key_parts": [ "o_custkey" ], "key_length": "5", "ref": [ "dbt3sf10.customer.c_custkey" ], "rows": 7, "filtered": 100, "attached_condition": "((`dbt3sf10`.`orders`.`o_orderpriority` = '1-URGENT') and (`dbt3sf10`.`orders`.`o_totalprice` > `dbt3sf10`.`customer`.`c_acctbal`))" } } ] } } +----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+ | 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 1509871 | Using where | | 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 | dbt3sf10.customer.c_custkey | 7 | Using where | +----+-------------+----------+------+---------------+-------------+---------+-----------------------------+---------+-------------+
  • 41. 14:5641 Статистика по индексамselect count(*) from customer, orders where customer.c_custkey=orders.o_custkey and customer.c_mktsegment='BUILDING'; +------+-------------+----------+------+---------------+-------------+---------+--------------------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+----------+------+---------------+-------------+---------+--------------------+--------+-------------+ | 1 | SIMPLE | customer | ALL | PRIMARY | NULL | NULL | NULL | 148305 | Using where | | 1 | SIMPLE | orders | ref | i_o_custkey | i_o_custkey | 5 | customer.c_custkey | 7 | Using index | +------+-------------+----------+------+---------------+-------------+---------+--------------------+--------+-------------+ MariaDB > show table status like 'orders'G *************************** 1. row *************************** Name: orders Engine: InnoDB Version: 10 Row_format: Compact Rows: 1495152 ............. MariaDB > show keys from orders where key_name='i_o_custkey'G *************************** 1. row *************************** Table: orders Non_unique: 1 Key_name: i_o_custkey Seq_in_index: 1 Column_name: o_custkey Collation: A Cardinality: 212941 Sub_part: NULL ................. ? 1495152 / 212941 = 7 7 заказов/ заказчик
  • 42. 14:5642 Проблемы со статистикой MySQL 5.5, InnoDB • Статистика вычисляется на лету – Когда отркрывается таблица (перезапуск сервера, ALTER TABLE) – После изменения n% записей – … • Статистика вычисляется методом случайных проб – @@innodb_stats_sample_pages • Результат – Статистика меняется без предупреждения => А с ней и планы запросов тоже • DBT-3 benchmark – 22 аналитических запросов – Планов на запрос: avg=2.8, max=7.с
  • 43. 14:5643 Решение проблем со статистикой Persistent statistics v1 • Percona Server 5.5 (спортировано в MariaDB 5.5) – Надо включить: innodb_use_sys_stats_table=1 • Статистика хранится внутри InnoDB – Можно посмотреть (но не менять) через information_schema.innodb_sys_stats • Можно отключить авто-перевычисление: innodb_stats_auto_update=OFF Persistent statistics v2 • MySQL 5.6 – Включена по умолчанию (innodb_stats_persistent=1) • Хранится в обычных таблицах (engine=InnoDB) – mysql.innodb_table_stats, mysql.innodb_index_stats • Можно отключить авто-перевычисление: innodb_stats_auto_recalc=OFF • Можно настраивать статистику для каждой таблицы
  • 44. 14:5644 Статистика – текущее состояние • Проблема #2: Статистики не хватает. Есть только – Число записей в таблице – Число разных значений в *индексе* • Сначала в Percona, потом в MySQL – Хранение статистики – Запрет авто-обновления • Проблема #1: метод случайных проб – DBT-3 – Scale=30 – Гоняем EXPLAINы – Считаем планы
  • 45. 14:5645 MariaDB 10.0: Engine independent statistics • Собирается/используется на SQL уровне – mysql.{table,index,column}_stat • Автообновления нет – ANALYZE TABLE • 100% точная, детерминированная статистика • Больше данных – Статистика по индексам (уже есть) – Статистика по таблицам (уже есть) – Статистика по колонкам • MIN/MAX значение • Число NULL / not-NULL – Гистограммы нескольких типов => Оптимизатор будет умен и предсказуем.
  • 46. 14:5646 Направления разработки • InnoDB • Репликация • Оптимизатор • PERFORMANCE_SCHEMA • NoSQL
  • 47. 14:5647 PERFORMANCE_SCHEMA • Новое средство диагностики – “На каких lock'ах ждет соединение X?” – “На каких lock'ах вообще ждут?” – “Сколько MB/sec (или rows/sec) мы пишем/читаем в таблицу/index $NAME?” – ... • Появилось в MySQL 5.5, доработано в 5.6 • Оверхед стал меньше – Но все еще есть (5%...15%)
  • 48. 14:5648 Направления разработки • InnoDB • Репликация • Оптимизатор • PERFORMANCE_SCHEMA • NoSQL
  • 49. 14:5649 NoSQL • MariaDB 5.3 – Handlersocket плагин – Dynamic columns • MySQL 5.6 – Memcached плагин для InnoDB • MariaDB 10.0 – Поддержка имен колонок в Dynamic Columns • В 5.5 в качестве имен были integers. – Табличный движок Cassandra – Табличный движок Сonnect.
  • 51. 14:5651 Итого • Oracle движет вперед InnoDB – Некоторые идеи подает Percona • Oracle движет вперед PERFORMANCE_SCHEMA – В 5.6 она стала интересной. • MariaDB 5.5 имеет продвинутый оптимизатор – Даже MySQL 5.6 не догнал • В репликации – MariaDB 5.5 двинулась вперед – MySQL 5.6 решил вообще все перевернуть с GTID. • В MariaDB 10.0 будет другой дизайн