SlideShare a Scribd company logo
1 of 42
Download to read offline
MariaDB 5.5
    ветка MySQL с эволюционными
         и революционными
            изменениями

     DevConf 2012, Сергей Петруня, Monty Program Ab




1                                                     19:06
Что такое MariaDB
    • Это ветка (branch) субд MySQL
    • Лицензия - GPL
    • Полностью совместима c «основным» MySQL
       – форматы файлов
       – соединения master<->slave
       – имена бинарников, init-скрипты и тд.
    • Отличия от MySQL
       – Собственные фичи
       – По умолчанию вместо InnoDB - Percona's XtraDB
       – Интегрированы разные патчи от Percona и других авторов


2                                                                 19:06
Релизы MariaDB и MySQL




    • Работа над MariaDB 5.3 заняла более года
    • Cразу после MariaDB 5.3 вышла MariaDB 5.5
    • Cтабильная версия MySQL 5.5, есть “milestone releases”
      (беты) MySQL 5.6
3                                                              19:06
Что попало в MariaDB 5.5




4                              19:06
Репликация в
    MariaDB 5.3/5.5



5                     19:06
Репликация в MariaDB 5.3/5.5
                                           Percona Server 5.5
    
        Group commit for binary log
    • Annotations for RBR events              MySQL 5.6
    • Checksums for binlog events
    • Неблокирующий mysqldump –single-transaction
      --master-data
    • Optimized RBR for tables          Percona's patch
      without primary key
    • @@skip_replication
    • Множество мелких улучшений
6                                                       19:06
Что такое Group Commit
    • Для обеспечения транзакционной работы СУБД должна в
      момент commit'a фиксировать сделанные изменения




    • Если фиксировать всех отдельно - ~200 коммитов/сек.


7                                                           19:06
Идея Group Commit
    • фиксировать изменения для групп, а не отдельных
      транзакций.




8                                                       19:06
Фиксация изменений в MySQL
    • Фиксировать нужно:
       – В InnoDB: innodb_flush_log_at_trx_commit=1
       – В binlog'е: sync_binlog=1
    • Если включить оба, group commit не работает:

                                        1600                   Another workload
                                        1400

                                        1200

                                        1000



                                       TPS
                                         800                                                trx+binlog
                                                                                            No-sync
                                         600
                                                                                            trx
                                         400

                                         200

                                             0
                                                 0   20   40   60    80   100   120   140

                                                                Threads

9                                                                                            19:06
Почему не работает group commit?
     • Нужен один и тот же порядок записи транзакций




10                                                     19:06
Почему не работает group commit (2)?
     • Свойство один-и-тот-же порядок достигается за счет
       блокировок




11                                                          19:06
Group Commit c binlog'ом




     • Реализации от: Facebook, MariaDB, preview tree от Oracle
     • Общая идея
        – При записи в binlog фиксируется очередность
        – Потом, в InnoDB фиксируются изменения в том же порядке

12                                                           19:06
Производительность c binlog'ом
    • По последним данным, MariaDB 5.3/5.5 лучше
        – Она же спортирована в Percona Server 5.5




13 * график из “Group commit in MariaDB is fast” поста Mark Callaghan   19:06
Аннотации RBR events в MariaDB
     К каждой RBR-записи в binlog'е приписывается текст исходного запроса
               • mysqld --binlog_annotate_row_events
MariaDB [test]> show binlog events in 'pslp.000299';
+-------------+-----+---------------+-----------+-------------+-------------------------------------------------+
| Log_name    | Pos | Event_type    | Server_id | End_log_pos | Info                                            |
+-------------+-----+---------------+-----------+-------------+-------------------------------------------------+
| pslp.000299 |   4 | Format_desc   |         1 |         245 | Server ver: 5.3.4-MariaDB-rc-log, Binlog ver: 4 |
| pslp.000299 | 245 | Query         |         1 |         313 | BEGIN                                           |
| pslp.000299 | 313 | Annotate_rows |         1 |         379 | /* app1 */ insert into t1 values('foo'),('bar') |
| pslp.000299 | 379 | Table_map     |         1 |         422 | table_id: 15 (test.t1)                          |
| pslp.000299 | 422 | Write_rows    |         1 |         461 | table_id: 15 flags: STMT_END_F                  |
| pslp.000299 | 461 | Query         |         1 |         530 | COMMIT                                          |
| pslp.000299 | 530 | Query         |         1 |         598 | BEGIN                                           |
| pslp.000299 | 598 | Annotate_rows |         1 |         664 | /* app2 */ update t1 set a='test' where a='foo' |
| pslp.000299 | 664 | Table_map     |         1 |         707 | table_id: 15 (test.t1)                          |
| pslp.000299 | 707 | Update_rows   |         1 |         759 | table_id: 15 flags: STMT_END_F                  |
+-------------+-----+---------------+-----------+-------------+-------------------------------------------------+




 # at 379
 # at 422
 #120203 16:25:11 server id   1    end_log_pos 379   Annotate_rows:
 #Q> /* app1 */ insert into   t1   values('foo'),('bar')
 #120203 16:25:11 server id   1    end_log_pos 422   Table_map: `test`.`t1` mapped to number 15
 #120203 16:25:11 server id   1    end_log_pos 461   Write_rows: table id 15 flags: STMT_END_F

 BINLOG '
14
 J9IrTxMBAAAAKwAAAKYBAAAAAA8AAAAAAAEABHRlc3QAAnQxAAEPAgwAAQ==                                               19:06
MySQL 5.6 тоже будет поддерживать аннотации
     • Реализация очень схожа с реализацией в MariaDB
     • “интерфейс” другой
        – mysqld --binlog-rows-query-log-events

 MySQL [test]> show binlog events;
 +-------------+-----+-------------+-----------+-------------+---------------------------------------------------+
 | Log_name    | Pos | Event_type | Server_id | End_log_pos | Info                                               |
 +-------------+-----+-------------+-----------+-------------+---------------------------------------------------+
 | pslp.000001 |   4 | Format_desc |         1 |         114 | Server ver: 5.6.5-m8-debug-log, Binlog ver: 4     |
 | pslp.000001 | 114 | Query       |         1 |         215 | use `test`; create table t1 (a varchar(12))       |
 | pslp.000001 | 215 | Query       |         1 |         283 | BEGIN                                             |
 | pslp.000001 | 283 | Rows_query |          1 |         350 | # /* app1 */ insert into t1 values('foo'),('bar') |
 | pslp.000001 | 350 | Table_map   |         1 |         393 | table_id: 66 (test.t1)                            |
 | pslp.000001 | 393 | Write_rows |          1 |         432 | table_id: 66 flags: STMT_END_F                    |
 | pslp.000001 | 432 | Xid         |         1 |         459 | COMMIT /* xid=5 */                                |
 | pslp.000001 | 459 | Query       |         1 |         527 | BEGIN                                             |
 | pslp.000001 | 527 | Rows_query |          1 |         594 | # /* app2 */ update t1 set a='test' where a='foo' |
 | pslp.000001 | 594 | Table_map   |         1 |         637 | table_id: 66 (test.t1)                            |
 | pslp.000001 | 637 | Update_rows |         1 |         678 | table_id: 66 flags: STMT_END_F                    |
 | pslp.000001 | 678 | Xid         |         1 |         705 | COMMIT /* xid=6 */                                |
 +-------------+-----+-------------+-----------+-------------+---------------------------------------------------+




15                                                                                                          19:06
Назревающая проблема совместимости
     • В MariaDB 5.3 добавили Annotate_rows
     • В MySQL 5.6 добавили Rows_query
     • Это разные типы записей
        – MariaDB 5.3/5.5 не понимает Rows_query
        – MySQL 5.6 не понимает Annotate_rows
     • При встрече неизвестной записью в binlog, репликация
       остановится с ошибкой (продолжать было бы небезопасно)
     • В MySQL 5.6 будет флаг “эту запись можно игнорировать”
        – Мы его сразу же смержим в MariaDB
        – И binary logs станут опять совместимы


16                                                              19:06
Оптимизация RBR для таблиц без primary key
     • Row Based Replication пишет в binlog записи вида:

         with table
              $tbl=`dbname.tablename` (col1 INT, col2 CHAR(N),...)
         do
              delete in $tbl row with (col1,col2) = (10, 'foo')


     •   До MariaDB 5.3, для поиска записи использовался первый индекс в
          – Если есть PRIMARY KEY, он первый
          – Если его нету – могли выбрать плохой индекс
     •   В MariaDB 5.3
          – Если есть PRIMARY KEY, использовать его
          – или первый UNIQUE INDEX без NULL-ов
          – Или, наиболее селективный не-fulltext индекс
17                                                                         19:06
Изменения в
     Оптимизаторе



18                  19:06
Изменения в оптимизаторе
     • Переписана оптимизация
       подзапросов
        – WHERE … IN (SELECT ..)
        – FROM (SELECT ...)
        – прочих
     • Добавлены оптимизации для
       “больших” запросов
        – Batched Key Access
        – Hash Join
        – Index Condition Pushdown
        – Улучшенный Index Merge
19                                   19:06
Оптимизация подзапросов: FROM
     • Часто используется для “структурирования” запроса:
     SELECT * FROM
       (SELECT * FROM City WHERE Population > 10*1000) AS big_city
     WHERE
       big_city.Country='DEU'
                                    • Выполнение в MySQL:
                                       1.Материализовать таблицу
                                         big_city
                                       2.Вычислять запрос дальше
                                    • Вывод пользователей:
                                      не писать FROM-запросов



20                                                             19:06
Оптимизация FROM в MariaDB
     В MariaDB (и в будущем, в MySQL 5.6)
     • Если можно, FROM-подзапросы “сливаются” со
       своими родителями
     • Если без материализации не обойтись,
       рассматривается вариант с добавлением индекса на
       материализованную таблицу




21                                                        19:06
Оптимизация подзапросов: WHERE … IN (SELECT...)
      • По статистике, самые часто используемые

     select * from customer
     where
       customer.c_acctbal < 0 and
       customer.c_custkey in (select orders.o_custkey
                               from orders
                               where orders.o_orderDATE between $DAY1 and $DAY2
                             )


     • В MySQL: вычисление только “снаружи-внутрь”:
+----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+--------
| id | select_type        | table    | type           | possible_keys | key         | key_len | ref | rows     | Extra
+----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+--------
| 1 | PRIMARY             | customer | ALL            | NULL          | NULL        | NULL    | NULL | 1494351 | Using w
| 2 | DEPENDENT SUBQUERY | orders    | index_subquery | ...           | i_o_custkey | 5       | func |       7 | Using w
+----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+--------




22                                                                                                            19:06
Выполнение подзапроса WHERE … IN (SELECT...)
     select * from customer
     where
       customer.c_acctbal < 0 and
       customer.c_custkey in (select orders.o_custkey
                               from orders
                               where orders.o_orderDATE between $DAY1 and $DAY2
                             )




23                                                                         19:06
Выполнение подзапроса WHERE … IN (SELECT...)
     select * from customer
     where
       customer.c_acctbal < 0 and
       customer.c_custkey in (select orders.o_custkey
                               from orders
                               where orders.o_orderDATE between $DAY1 and $DAY2
                             )



                                                         Снаружи-во-внутрь:
                                                         перебираем слишком
                                                         много customer'ов




24                                                                         19:06
Выполнение подзапроса WHERE … IN (SELECT...)
     select * from customer
     where
       customer.c_acctbal < 0 and
       customer.c_custkey in (select orders.o_custkey
                               from orders
                               where orders.o_orderDATE between $DAY1 and $DAY2
                             )

                                                      Изнутри наружу:
                                                      - Второй вариант
                                                      - Стал возможен в
                                                        MariaDB 5.3/MySQL 5.6




25                                                                         19:06
Два варианта выполнения
      select * from customer
      where
        customer.c_acctbal < 0 and
        customer.c_custkey in (select orders.o_custkey
                                from orders
                                where orders.o_orderDATE between $DAY1 and $DAY2
                              )

  MySQL 5.1: только снаружи-внутрь
+----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+--------
| id | select_type        | table    | type           | possible_keys | key         | key_len | ref | rows     | Extra
+----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+--------
| 1 | PRIMARY             | customer | ALL            | NULL          | NULL        | NULL    | NULL | 1494351 | Using w
| 2 | DEPENDENT SUBQUERY | orders    | index_subquery | ...           | i_o_custkey | 5       | func |       7 | Using w
+----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+--------



 MariaDB 5.5 (и MySQL 5.6, когда выпустят): добавляются стратегии изнутри-наружу
+----+--------------+-------------+--------+---------------+---------------+---------+------------------+-------+-------
| id | select_type | table        | type   | possible_keys | key           | key_len | ref              | rows | Extra
+----+--------------+-------------+--------+---------------+---------------+---------+------------------+-------+-------
| 1 | PRIMARY       | <subquery2> | ALL    | distinct_key | NULL           | NULL    | NULL             | 22906 |
| 1 | PRIMARY       | customer    | eq_ref | PRIMARY       | PRIMARY       | 4       | orders.o_custkey |     1 | Using
| 2 | MATERIALIZED | orders       | range | ...            | i_o_orderdate | 4       | NULL             | 22906 | Using
+----+--------------+-------------+--------+---------------+---------------+---------+------------------+-------+-------

26                                                                                                            19:06
WHERE … IN (SELECT...), итого
     • Теперь оптимизатор может выбрать порядок
       выполнения
     • Если запрос можно переписать как JOIN, он
       будет автоматически переписан.
     • Оптимизация и скорость – теперь похожи на
       JOIN'ы




27                                                 19:06
Оптимизация подзапросов: другие виды
     • Еще бывают подзапросы
       – expr IN (SELECT …) не во WHERE
       – EXISTS (SELECT …)
       – Просто (SELECT …) в скалярном контексте
     • Для их обработки добавлены
       – Materialization для IN(SELECT …)
        (в MySQL 5.6 – ее подмножество)
       – Subquery cache


28                                                 19:06
Карта оптимизаций
                   • В MySQL 5.1 для
                     каждого типа
                     подзапроса была
                     только одна
                     стратегия
                     выполнения




29                                 19:06
Карта оптимизаций
                  •   В MySQL 5.6
                      добавлены
                      оптимизации для
                      самых важных
                      случаев
                  •   В MariaDB 5.3/5.5
                      добавлены
                      оптимизации для
                      всех видов
                      подзапросов




30                                        19:06
Подзапросы: итого
     • На основе выборки “что попалось”:
       – Были в ~1000 раз медленнее PostgreSQL
       – Стали: тот же порядок
     • MariaDB 5.5 сейчас имеет надмножество
       того, что будет в MySQL 5.6




31                                               19:06
Оптимизации для больших
            запросов



32                             19:06
Что это и зачем
     • Проекты начинают с базовых вещей
       – Раздача контента
       – Обработка транзакций (OLTP)
     • SQL запросы
       – Либо затрагивают одну запись:
         SELECT * FROM web_pages WHERE key=...
         UPDATE user SET score=score+1 WHERE user.id=...
     • Либо просматривают небольшие интервалы:
       SELECT * FROM forum_posts WHERE thread_id=123
         ORDER BY post_date DESC LIMIT 10
     • MySQL такие запросы обрабатывает хорошо
33                                                         19:06
Что это и зачем (2)
     Дальше хочется отчетов и аналитики
     • Данных становится больше
       – данные за сегодня → вся история
     • Запросы просматривают много данных
       – “какова общая сумма в заказе X?” →
         “Какой процент заказов был на сумму > 5000 руб?”
     • Запросы становятся сложными
       – “Выдать содержимое заказа Х” →
         “Выдать список товаров, которые часто покупают
         вместе с товарами X, Y, Z”
     • “MySQL не тянет большие запросы”
34                                                          19:06
MariaDB- комплексное решение

     • Подзапросы всех видов
        – (уже осветили)
     • Оптимизации доступа к диску
        – Index Condition Pushdown
        – Batched Key Access
        – Hash join
        – Index Merge/sort-intersect


35                                      19:06
Запуск больших запросов на MariaDB

     • Новые стратегии выполнения требуют
       больше памяти
     • Бесполезны для мелких запросов
       – Могут даже вызвать замедление
     • => Выключены по умолчанию
       – Включайте их перед тяжелыми запросами
         • Перед сбором аналитики, отчетов и т д.


36                                                  19:06
Оптимизации доступа к диску
      • Могут вызвать замедление на маленьких запросах
         – И поэтому выключены
         – Надо включать (перед аналитикой/отчетами)
      • http://kb.askmonty.org/en/big-query-settings/

     # Batched Key Access
     optimizer_switch='mrr=on'                       # HASH join
     optimizer_switch='mrr_cost_based=off        +   join_cache_level=8
     '
     join_cache_level = 6
     join_buffer_space_limit = 300M
     join_buffer_size = 100M

     # Index Merge sort-intersect
     optimizer_switch='index_merge_sort_intersection=on
     '
37                                                                        19:06
Результат
     • 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

     * - надоело ждать
38                                                       19:06
Еще пара интересных фич из MariaDB 5.5
     • Aсинхронное клиентское API
       – “Родная” клиентская библиотека libmysql
         поддерживает асинхронный режим работы
          • Можно установить несколько соединений (с MariaDB
            и/или MySQL серверами)
          • И параллельно запустить несколько запросов.
     • Thread pool в сервере
       – Для всех платформ, включая Windows
       – У Oracle – только в Enterprise-версии
         (распространяется за плату и без исходного кода)

39                                                          19:06
LIMIT ROWS EXAMINED
     • В MySQL есть @@max_join_size
       MariaDB [test]> select * from big_table where col=10;
       ERROR 1104 (42000): The SELECT would examine more than
       MAX_JOIN_SIZE rows...
        – Использует *оценку* числа прочитанных записей
        – Не учитывает подзапросы и т д.

     • LIMIT ROWS EXAMINED n – задает максимальное число
       записей, которое разрешено просмотреть
        – Ограничение времени выполнения. Действует на весь запрос
        MariaDB [test]> select * from big_table
                     ->   where col=10 limit rows examined 100;
        ...
        Warning (Code 1931): Query execution was interrupted. The
        query examined at least 101 rows, which exceeds LIMIT ROWS
        EXAMINED (100). The query result may be incomplete.
40                                                              19:06
Миграция между MySQL и MariaDB
     • “Drop-in replacement”
       – Просто запустите новый сервер с тем же --datadir
       – Репликация: цепляйте MariaDB slave к MySQL master и наоборот
       – Клиент-серверный протокол такой же, как и у MySQL
     • Почти все фичи оптимизатора выключаемые
      set optimizer_switch='optimization_name=off'
       – По умолчанию включены только безопасные




41                                                                  19:06
Дальнейшая информация
     • MariaDB Knowledgebase
       http://kb.askmonty.org/
     • https://lists.launchpad.net/maria-developers/
     • irc: #maria на FreeNode




42                                                     19:06

More Related Content

What's hot

Отладка производительности СУБД MySQL
Отладка производительности СУБД MySQLОтладка производительности СУБД MySQL
Отладка производительности СУБД MySQLSveta Smirnova
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINAlexey Ermakov
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1Nikolay Samokhvalov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
Архитектура и новые возможности B-tree
Архитектура и новые возможности B-treeАрхитектура и новые возможности B-tree
Архитектура и новые возможности B-treeAnastasia Lubennikova
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Fwdays
 
IBM FlexSystem Chassis (October 2013) (RUS)
IBM FlexSystem Chassis (October 2013) (RUS)IBM FlexSystem Chassis (October 2013) (RUS)
IBM FlexSystem Chassis (October 2013) (RUS)Yury Alexeev
 

What's hot (7)

Отладка производительности СУБД MySQL
Отладка производительности СУБД MySQLОтладка производительности СУБД MySQL
Отладка производительности СУБД MySQL
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAIN
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
Архитектура и новые возможности B-tree
Архитектура и новые возможности B-treeАрхитектура и новые возможности B-tree
Архитектура и новые возможности B-tree
 
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
Aleksei Milovidov "Let's optimize one aggregate function in ClickHouse"
 
IBM FlexSystem Chassis (October 2013) (RUS)
IBM FlexSystem Chassis (October 2013) (RUS)IBM FlexSystem Chassis (October 2013) (RUS)
IBM FlexSystem Chassis (October 2013) (RUS)
 

Viewers also liked

Fosdem2012 mariadb-5.3-query-optimizer-r2
Fosdem2012 mariadb-5.3-query-optimizer-r2Fosdem2012 mariadb-5.3-query-optimizer-r2
Fosdem2012 mariadb-5.3-query-optimizer-r2Sergey Petrunya
 
Fosdem2012 replication-features-of-2011
Fosdem2012 replication-features-of-2011Fosdem2012 replication-features-of-2011
Fosdem2012 replication-features-of-2011Sergey Petrunya
 
ANALYZE for executable statements - a new way to do optimizer troubleshooting...
ANALYZE for executable statements - a new way to do optimizer troubleshooting...ANALYZE for executable statements - a new way to do optimizer troubleshooting...
ANALYZE for executable statements - a new way to do optimizer troubleshooting...Sergey Petrunya
 
Uc subqueries to the people
Uc subqueries to the peopleUc subqueries to the people
Uc subqueries to the peopleSergey Petrunya
 
How mysql handles ORDER BY, GROUP BY, and DISTINCT
How mysql handles ORDER BY, GROUP BY, and DISTINCTHow mysql handles ORDER BY, GROUP BY, and DISTINCT
How mysql handles ORDER BY, GROUP BY, and DISTINCTSergey Petrunya
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetOntico
 
12c In Memory Management - Saurabh Gupta
12c In Memory Management - Saurabh Gupta 12c In Memory Management - Saurabh Gupta
12c In Memory Management - Saurabh Gupta pasalapudi123
 
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ OracleUnderstanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ OracleGuatemala User Group
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...Ontico
 
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...Ontico
 

Viewers also liked (10)

Fosdem2012 mariadb-5.3-query-optimizer-r2
Fosdem2012 mariadb-5.3-query-optimizer-r2Fosdem2012 mariadb-5.3-query-optimizer-r2
Fosdem2012 mariadb-5.3-query-optimizer-r2
 
Fosdem2012 replication-features-of-2011
Fosdem2012 replication-features-of-2011Fosdem2012 replication-features-of-2011
Fosdem2012 replication-features-of-2011
 
ANALYZE for executable statements - a new way to do optimizer troubleshooting...
ANALYZE for executable statements - a new way to do optimizer troubleshooting...ANALYZE for executable statements - a new way to do optimizer troubleshooting...
ANALYZE for executable statements - a new way to do optimizer troubleshooting...
 
Uc subqueries to the people
Uc subqueries to the peopleUc subqueries to the people
Uc subqueries to the people
 
How mysql handles ORDER BY, GROUP BY, and DISTINCT
How mysql handles ORDER BY, GROUP BY, and DISTINCTHow mysql handles ORDER BY, GROUP BY, and DISTINCT
How mysql handles ORDER BY, GROUP BY, and DISTINCT
 
Aлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreetAлександр Зайцев, LifeStreet
Aлександр Зайцев, LifeStreet
 
12c In Memory Management - Saurabh Gupta
12c In Memory Management - Saurabh Gupta 12c In Memory Management - Saurabh Gupta
12c In Memory Management - Saurabh Gupta
 
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ OracleUnderstanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
Understanding Query Optimization with ‘regular’ and ‘Exadata’ Oracle
 
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...NoSQL внутри SQL: приземленные вопросы практического применения /  Дмитрий До...
NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий До...
 
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
Адаптивная оптимизация запросов в реляционных СУБД / Олег Иванов (Postgres Pr...
 

Similar to Devconf2012 what-is-mariadb-5.5

Devconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbDevconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbSergey Petrunya
 
"Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7""Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7"Badoo Development
 
Обзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВС
Обзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВСОбзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВС
Обзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВСCisco Russia
 
Devconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-featuresDevconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-featuresSergey Petrunya
 
Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...
Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...
Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...Cisco Russia
 
Построение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологийПостроение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологийDmitry Moskvin
 
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.5DevDay
 
Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...
Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...
Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...Cisco Russia
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.Sergey Petrunya
 
Поддержка Segment Routing на IOS XR
Поддержка Segment Routing на IOS XRПоддержка Segment Routing на IOS XR
Поддержка Segment Routing на IOS XRCisco Russia
 
Эффективная отладка репликации MySQL
Эффективная отладка репликации MySQLЭффективная отладка репликации MySQL
Эффективная отладка репликации MySQLSveta Smirnova
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Ontico
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)AvitoTech
 
Вычислительная система Cisco UCS - обзор, преимущества и стратегия развития
Вычислительная система Cisco UCS - обзор, преимущества и стратегия развитияВычислительная система Cisco UCS - обзор, преимущества и стратегия развития
Вычислительная система Cisco UCS - обзор, преимущества и стратегия развитияCisco Russia
 
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.Cisco Russia
 
Решения Cisco для сетей хранения данных: обзор, преимущества, новинки
Решения Cisco для сетей хранения данных: обзор, преимущества, новинки Решения Cisco для сетей хранения данных: обзор, преимущества, новинки
Решения Cisco для сетей хранения данных: обзор, преимущества, новинки Cisco Russia
 
Мониторинг проектов: сравнительный анализ существующих решений
Мониторинг проектов:  сравнительный анализ существующих решенийМониторинг проектов:  сравнительный анализ существующих решений
Мониторинг проектов: сравнительный анализ существующих решенийAnton Baranov
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspbGonchik Tsymzhitov
 

Similar to Devconf2012 what-is-mariadb-5.5 (20)

Devconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadbDevconf2013 new-features-in-mysql-and-mariadb
Devconf2013 new-features-in-mysql-and-mariadb
 
"Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7""Новые возможности MySQL 5.7"
"Новые возможности MySQL 5.7"
 
Обзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВС
Обзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВСОбзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВС
Обзор коммутаторов Catalyst 4500-X уровня распределения корпоративных ЛВС
 
Devconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-featuresDevconf2010 mariadb-extra-features
Devconf2010 mariadb-extra-features
 
Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...
Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...
Cisco Nexus 7700 и Cisco Catalyst 6800. Особенности применения в корпоративно...
 
MySQL 8.0
MySQL 8.0MySQL 8.0
MySQL 8.0
 
Построение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологийПостроение ИТ-инфраструктуры компании с использованием облачных технологий
Построение ИТ-инфраструктуры компании с использованием облачных технологий
 
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
 
Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...
Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...
Обзор моделей коммутаторов для построения корпоративных ЛВС и новости продукт...
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Поддержка Segment Routing на IOS XR
Поддержка Segment Routing на IOS XRПоддержка Segment Routing на IOS XR
Поддержка Segment Routing на IOS XR
 
Эффективная отладка репликации MySQL
Эффективная отладка репликации MySQLЭффективная отладка репликации MySQL
Эффективная отладка репликации MySQL
 
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)Эффективная отладка репликации MySQL / Света Смирнова (Percona)
Эффективная отладка репликации MySQL / Света Смирнова (Percona)
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)
 
Вычислительная система Cisco UCS - обзор, преимущества и стратегия развития
Вычислительная система Cisco UCS - обзор, преимущества и стратегия развитияВычислительная система Cisco UCS - обзор, преимущества и стратегия развития
Вычислительная система Cisco UCS - обзор, преимущества и стратегия развития
 
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
Nexus 7000 – архитектура передачи данных. Поиск и устранение неисправностей.
 
Решения Cisco для сетей хранения данных: обзор, преимущества, новинки
Решения Cisco для сетей хранения данных: обзор, преимущества, новинки Решения Cisco для сетей хранения данных: обзор, преимущества, новинки
Решения Cisco для сетей хранения данных: обзор, преимущества, новинки
 
Мониторинг проектов: сравнительный анализ существующих решений
Мониторинг проектов:  сравнительный анализ существующих решенийМониторинг проектов:  сравнительный анализ существующих решений
Мониторинг проектов: сравнительный анализ существующих решений
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspb
 
Summit x460 g2
Summit x460 g2Summit x460 g2
Summit x460 g2
 

More from Sergey Petrunya

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.12Sergey Petrunya
 
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 fixesSergey Petrunya
 
Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8Improved histograms in MariaDB 10.8
Improved histograms in MariaDB 10.8Sergey Petrunya
 
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 estimatesSergey Petrunya
 
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 pictureSergey Petrunya
 
Optimizer Trace Walkthrough
Optimizer Trace WalkthroughOptimizer Trace Walkthrough
Optimizer Trace WalkthroughSergey Petrunya
 
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 gemSergey Petrunya
 
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 databasesSergey Petrunya
 
MariaDB 10.4 - что нового
MariaDB 10.4 - что новогоMariaDB 10.4 - что нового
MariaDB 10.4 - что новогоSergey Petrunya
 
Using histograms to get better performance
Using histograms to get better performanceUsing histograms to get better performance
Using histograms to get better performanceSergey Petrunya
 
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 holeSergey Petrunya
 
Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4Query Optimizer in MariaDB 10.4
Query Optimizer in MariaDB 10.4Sergey Petrunya
 
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 benchmarkSergey Petrunya
 
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 standSergey Petrunya
 
MyRocks in MariaDB | M18
MyRocks in MariaDB | M18MyRocks in MariaDB | M18
MyRocks in MariaDB | M18Sergey Petrunya
 
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.3Sergey Petrunya
 
Histograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQLHistograms in MariaDB, MySQL and PostgreSQL
Histograms in MariaDB, MySQL and PostgreSQLSergey Petrunya
 
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.2Sergey 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
 

Devconf2012 what-is-mariadb-5.5

  • 1. MariaDB 5.5 ветка MySQL с эволюционными и революционными изменениями DevConf 2012, Сергей Петруня, Monty Program Ab 1 19:06
  • 2. Что такое MariaDB • Это ветка (branch) субд MySQL • Лицензия - GPL • Полностью совместима c «основным» MySQL – форматы файлов – соединения master<->slave – имена бинарников, init-скрипты и тд. • Отличия от MySQL – Собственные фичи – По умолчанию вместо InnoDB - Percona's XtraDB – Интегрированы разные патчи от Percona и других авторов 2 19:06
  • 3. Релизы MariaDB и MySQL • Работа над MariaDB 5.3 заняла более года • Cразу после MariaDB 5.3 вышла MariaDB 5.5 • Cтабильная версия MySQL 5.5, есть “milestone releases” (беты) MySQL 5.6 3 19:06
  • 4. Что попало в MariaDB 5.5 4 19:06
  • 5. Репликация в MariaDB 5.3/5.5 5 19:06
  • 6. Репликация в MariaDB 5.3/5.5 Percona Server 5.5  Group commit for binary log • Annotations for RBR events MySQL 5.6 • Checksums for binlog events • Неблокирующий mysqldump –single-transaction --master-data • Optimized RBR for tables Percona's patch without primary key • @@skip_replication • Множество мелких улучшений 6 19:06
  • 7. Что такое Group Commit • Для обеспечения транзакционной работы СУБД должна в момент commit'a фиксировать сделанные изменения • Если фиксировать всех отдельно - ~200 коммитов/сек. 7 19:06
  • 8. Идея Group Commit • фиксировать изменения для групп, а не отдельных транзакций. 8 19:06
  • 9. Фиксация изменений в MySQL • Фиксировать нужно: – В InnoDB: innodb_flush_log_at_trx_commit=1 – В binlog'е: sync_binlog=1 • Если включить оба, group commit не работает: 1600 Another workload 1400 1200 1000 TPS 800 trx+binlog No-sync 600 trx 400 200 0 0 20 40 60 80 100 120 140 Threads 9 19:06
  • 10. Почему не работает group commit? • Нужен один и тот же порядок записи транзакций 10 19:06
  • 11. Почему не работает group commit (2)? • Свойство один-и-тот-же порядок достигается за счет блокировок 11 19:06
  • 12. Group Commit c binlog'ом • Реализации от: Facebook, MariaDB, preview tree от Oracle • Общая идея – При записи в binlog фиксируется очередность – Потом, в InnoDB фиксируются изменения в том же порядке 12 19:06
  • 13. Производительность c binlog'ом • По последним данным, MariaDB 5.3/5.5 лучше – Она же спортирована в Percona Server 5.5 13 * график из “Group commit in MariaDB is fast” поста Mark Callaghan 19:06
  • 14. Аннотации RBR events в MariaDB К каждой RBR-записи в binlog'е приписывается текст исходного запроса • mysqld --binlog_annotate_row_events MariaDB [test]> show binlog events in 'pslp.000299'; +-------------+-----+---------------+-----------+-------------+-------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +-------------+-----+---------------+-----------+-------------+-------------------------------------------------+ | pslp.000299 | 4 | Format_desc | 1 | 245 | Server ver: 5.3.4-MariaDB-rc-log, Binlog ver: 4 | | pslp.000299 | 245 | Query | 1 | 313 | BEGIN | | pslp.000299 | 313 | Annotate_rows | 1 | 379 | /* app1 */ insert into t1 values('foo'),('bar') | | pslp.000299 | 379 | Table_map | 1 | 422 | table_id: 15 (test.t1) | | pslp.000299 | 422 | Write_rows | 1 | 461 | table_id: 15 flags: STMT_END_F | | pslp.000299 | 461 | Query | 1 | 530 | COMMIT | | pslp.000299 | 530 | Query | 1 | 598 | BEGIN | | pslp.000299 | 598 | Annotate_rows | 1 | 664 | /* app2 */ update t1 set a='test' where a='foo' | | pslp.000299 | 664 | Table_map | 1 | 707 | table_id: 15 (test.t1) | | pslp.000299 | 707 | Update_rows | 1 | 759 | table_id: 15 flags: STMT_END_F | +-------------+-----+---------------+-----------+-------------+-------------------------------------------------+ # at 379 # at 422 #120203 16:25:11 server id 1 end_log_pos 379 Annotate_rows: #Q> /* app1 */ insert into t1 values('foo'),('bar') #120203 16:25:11 server id 1 end_log_pos 422 Table_map: `test`.`t1` mapped to number 15 #120203 16:25:11 server id 1 end_log_pos 461 Write_rows: table id 15 flags: STMT_END_F BINLOG ' 14 J9IrTxMBAAAAKwAAAKYBAAAAAA8AAAAAAAEABHRlc3QAAnQxAAEPAgwAAQ== 19:06
  • 15. MySQL 5.6 тоже будет поддерживать аннотации • Реализация очень схожа с реализацией в MariaDB • “интерфейс” другой – mysqld --binlog-rows-query-log-events MySQL [test]> show binlog events; +-------------+-----+-------------+-----------+-------------+---------------------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +-------------+-----+-------------+-----------+-------------+---------------------------------------------------+ | pslp.000001 | 4 | Format_desc | 1 | 114 | Server ver: 5.6.5-m8-debug-log, Binlog ver: 4 | | pslp.000001 | 114 | Query | 1 | 215 | use `test`; create table t1 (a varchar(12)) | | pslp.000001 | 215 | Query | 1 | 283 | BEGIN | | pslp.000001 | 283 | Rows_query | 1 | 350 | # /* app1 */ insert into t1 values('foo'),('bar') | | pslp.000001 | 350 | Table_map | 1 | 393 | table_id: 66 (test.t1) | | pslp.000001 | 393 | Write_rows | 1 | 432 | table_id: 66 flags: STMT_END_F | | pslp.000001 | 432 | Xid | 1 | 459 | COMMIT /* xid=5 */ | | pslp.000001 | 459 | Query | 1 | 527 | BEGIN | | pslp.000001 | 527 | Rows_query | 1 | 594 | # /* app2 */ update t1 set a='test' where a='foo' | | pslp.000001 | 594 | Table_map | 1 | 637 | table_id: 66 (test.t1) | | pslp.000001 | 637 | Update_rows | 1 | 678 | table_id: 66 flags: STMT_END_F | | pslp.000001 | 678 | Xid | 1 | 705 | COMMIT /* xid=6 */ | +-------------+-----+-------------+-----------+-------------+---------------------------------------------------+ 15 19:06
  • 16. Назревающая проблема совместимости • В MariaDB 5.3 добавили Annotate_rows • В MySQL 5.6 добавили Rows_query • Это разные типы записей – MariaDB 5.3/5.5 не понимает Rows_query – MySQL 5.6 не понимает Annotate_rows • При встрече неизвестной записью в binlog, репликация остановится с ошибкой (продолжать было бы небезопасно) • В MySQL 5.6 будет флаг “эту запись можно игнорировать” – Мы его сразу же смержим в MariaDB – И binary logs станут опять совместимы 16 19:06
  • 17. Оптимизация RBR для таблиц без primary key • Row Based Replication пишет в binlog записи вида: with table $tbl=`dbname.tablename` (col1 INT, col2 CHAR(N),...) do delete in $tbl row with (col1,col2) = (10, 'foo') • До MariaDB 5.3, для поиска записи использовался первый индекс в – Если есть PRIMARY KEY, он первый – Если его нету – могли выбрать плохой индекс • В MariaDB 5.3 – Если есть PRIMARY KEY, использовать его – или первый UNIQUE INDEX без NULL-ов – Или, наиболее селективный не-fulltext индекс 17 19:06
  • 18. Изменения в Оптимизаторе 18 19:06
  • 19. Изменения в оптимизаторе • Переписана оптимизация подзапросов – WHERE … IN (SELECT ..) – FROM (SELECT ...) – прочих • Добавлены оптимизации для “больших” запросов – Batched Key Access – Hash Join – Index Condition Pushdown – Улучшенный Index Merge 19 19:06
  • 20. Оптимизация подзапросов: FROM • Часто используется для “структурирования” запроса: SELECT * FROM (SELECT * FROM City WHERE Population > 10*1000) AS big_city WHERE big_city.Country='DEU' • Выполнение в MySQL: 1.Материализовать таблицу big_city 2.Вычислять запрос дальше • Вывод пользователей: не писать FROM-запросов 20 19:06
  • 21. Оптимизация FROM в MariaDB В MariaDB (и в будущем, в MySQL 5.6) • Если можно, FROM-подзапросы “сливаются” со своими родителями • Если без материализации не обойтись, рассматривается вариант с добавлением индекса на материализованную таблицу 21 19:06
  • 22. Оптимизация подзапросов: WHERE … IN (SELECT...) • По статистике, самые часто используемые select * from customer where customer.c_acctbal < 0 and customer.c_custkey in (select orders.o_custkey from orders where orders.o_orderDATE between $DAY1 and $DAY2 ) • В MySQL: вычисление только “снаружи-внутрь”: +----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+-------- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra +----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+-------- | 1 | PRIMARY | customer | ALL | NULL | NULL | NULL | NULL | 1494351 | Using w | 2 | DEPENDENT SUBQUERY | orders | index_subquery | ... | i_o_custkey | 5 | func | 7 | Using w +----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+-------- 22 19:06
  • 23. Выполнение подзапроса WHERE … IN (SELECT...) select * from customer where customer.c_acctbal < 0 and customer.c_custkey in (select orders.o_custkey from orders where orders.o_orderDATE between $DAY1 and $DAY2 ) 23 19:06
  • 24. Выполнение подзапроса WHERE … IN (SELECT...) select * from customer where customer.c_acctbal < 0 and customer.c_custkey in (select orders.o_custkey from orders where orders.o_orderDATE between $DAY1 and $DAY2 ) Снаружи-во-внутрь: перебираем слишком много customer'ов 24 19:06
  • 25. Выполнение подзапроса WHERE … IN (SELECT...) select * from customer where customer.c_acctbal < 0 and customer.c_custkey in (select orders.o_custkey from orders where orders.o_orderDATE between $DAY1 and $DAY2 ) Изнутри наружу: - Второй вариант - Стал возможен в MariaDB 5.3/MySQL 5.6 25 19:06
  • 26. Два варианта выполнения select * from customer where customer.c_acctbal < 0 and customer.c_custkey in (select orders.o_custkey from orders where orders.o_orderDATE between $DAY1 and $DAY2 ) MySQL 5.1: только снаружи-внутрь +----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+-------- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra +----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+-------- | 1 | PRIMARY | customer | ALL | NULL | NULL | NULL | NULL | 1494351 | Using w | 2 | DEPENDENT SUBQUERY | orders | index_subquery | ... | i_o_custkey | 5 | func | 7 | Using w +----+--------------------+----------+----------------+---------------+-------------+---------+------+---------+-------- MariaDB 5.5 (и MySQL 5.6, когда выпустят): добавляются стратегии изнутри-наружу +----+--------------+-------------+--------+---------------+---------------+---------+------------------+-------+------- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra +----+--------------+-------------+--------+---------------+---------------+---------+------------------+-------+------- | 1 | PRIMARY | <subquery2> | ALL | distinct_key | NULL | NULL | NULL | 22906 | | 1 | PRIMARY | customer | eq_ref | PRIMARY | PRIMARY | 4 | orders.o_custkey | 1 | Using | 2 | MATERIALIZED | orders | range | ... | i_o_orderdate | 4 | NULL | 22906 | Using +----+--------------+-------------+--------+---------------+---------------+---------+------------------+-------+------- 26 19:06
  • 27. WHERE … IN (SELECT...), итого • Теперь оптимизатор может выбрать порядок выполнения • Если запрос можно переписать как JOIN, он будет автоматически переписан. • Оптимизация и скорость – теперь похожи на JOIN'ы 27 19:06
  • 28. Оптимизация подзапросов: другие виды • Еще бывают подзапросы – expr IN (SELECT …) не во WHERE – EXISTS (SELECT …) – Просто (SELECT …) в скалярном контексте • Для их обработки добавлены – Materialization для IN(SELECT …) (в MySQL 5.6 – ее подмножество) – Subquery cache 28 19:06
  • 29. Карта оптимизаций • В MySQL 5.1 для каждого типа подзапроса была только одна стратегия выполнения 29 19:06
  • 30. Карта оптимизаций • В MySQL 5.6 добавлены оптимизации для самых важных случаев • В MariaDB 5.3/5.5 добавлены оптимизации для всех видов подзапросов 30 19:06
  • 31. Подзапросы: итого • На основе выборки “что попалось”: – Были в ~1000 раз медленнее PostgreSQL – Стали: тот же порядок • MariaDB 5.5 сейчас имеет надмножество того, что будет в MySQL 5.6 31 19:06
  • 32. Оптимизации для больших запросов 32 19:06
  • 33. Что это и зачем • Проекты начинают с базовых вещей – Раздача контента – Обработка транзакций (OLTP) • SQL запросы – Либо затрагивают одну запись: SELECT * FROM web_pages WHERE key=... UPDATE user SET score=score+1 WHERE user.id=... • Либо просматривают небольшие интервалы: SELECT * FROM forum_posts WHERE thread_id=123 ORDER BY post_date DESC LIMIT 10 • MySQL такие запросы обрабатывает хорошо 33 19:06
  • 34. Что это и зачем (2) Дальше хочется отчетов и аналитики • Данных становится больше – данные за сегодня → вся история • Запросы просматривают много данных – “какова общая сумма в заказе X?” → “Какой процент заказов был на сумму > 5000 руб?” • Запросы становятся сложными – “Выдать содержимое заказа Х” → “Выдать список товаров, которые часто покупают вместе с товарами X, Y, Z” • “MySQL не тянет большие запросы” 34 19:06
  • 35. MariaDB- комплексное решение • Подзапросы всех видов – (уже осветили) • Оптимизации доступа к диску – Index Condition Pushdown – Batched Key Access – Hash join – Index Merge/sort-intersect 35 19:06
  • 36. Запуск больших запросов на MariaDB • Новые стратегии выполнения требуют больше памяти • Бесполезны для мелких запросов – Могут даже вызвать замедление • => Выключены по умолчанию – Включайте их перед тяжелыми запросами • Перед сбором аналитики, отчетов и т д. 36 19:06
  • 37. Оптимизации доступа к диску • Могут вызвать замедление на маленьких запросах – И поэтому выключены – Надо включать (перед аналитикой/отчетами) • http://kb.askmonty.org/en/big-query-settings/ # Batched Key Access optimizer_switch='mrr=on' # HASH join optimizer_switch='mrr_cost_based=off + join_cache_level=8 ' join_cache_level = 6 join_buffer_space_limit = 300M join_buffer_size = 100M # Index Merge sort-intersect optimizer_switch='index_merge_sort_intersection=on ' 37 19:06
  • 38. Результат • 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 * - надоело ждать 38 19:06
  • 39. Еще пара интересных фич из MariaDB 5.5 • Aсинхронное клиентское API – “Родная” клиентская библиотека libmysql поддерживает асинхронный режим работы • Можно установить несколько соединений (с MariaDB и/или MySQL серверами) • И параллельно запустить несколько запросов. • Thread pool в сервере – Для всех платформ, включая Windows – У Oracle – только в Enterprise-версии (распространяется за плату и без исходного кода) 39 19:06
  • 40. LIMIT ROWS EXAMINED • В MySQL есть @@max_join_size MariaDB [test]> select * from big_table where col=10; ERROR 1104 (42000): The SELECT would examine more than MAX_JOIN_SIZE rows... – Использует *оценку* числа прочитанных записей – Не учитывает подзапросы и т д. • LIMIT ROWS EXAMINED n – задает максимальное число записей, которое разрешено просмотреть – Ограничение времени выполнения. Действует на весь запрос MariaDB [test]> select * from big_table -> where col=10 limit rows examined 100; ... Warning (Code 1931): Query execution was interrupted. The query examined at least 101 rows, which exceeds LIMIT ROWS EXAMINED (100). The query result may be incomplete. 40 19:06
  • 41. Миграция между MySQL и MariaDB • “Drop-in replacement” – Просто запустите новый сервер с тем же --datadir – Репликация: цепляйте MariaDB slave к MySQL master и наоборот – Клиент-серверный протокол такой же, как и у MySQL • Почти все фичи оптимизатора выключаемые set optimizer_switch='optimization_name=off' – По умолчанию включены только безопасные 41 19:06
  • 42. Дальнейшая информация • MariaDB Knowledgebase http://kb.askmonty.org/ • https://lists.launchpad.net/maria-developers/ • irc: #maria на FreeNode 42 19:06