devconf2010 mariadb-extra-features

37
Ветка MySQL c большими возможностями Сергей Петруня ([email protected]) Monty Program Ab

Upload: sergey-petrunya

Post on 01-Jul-2015

376 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Devconf2010 mariadb-extra-features

Ветка MySQL c большими возможностями

Сергей Петруня ([email protected])Monty Program Ab

Page 2: Devconf2010 mariadb-extra-features

ветка MySQL сдополнительными возможностями

• Совместима с MySQL (в отличие от Drizzle)• “Branch” а не “fork”

● изменения из MySQL периодически мержатся• Включает разработки

● Sun/MySQL• Более открытый процесс разработки

● *Весь* исходный код на launchpad.net● Более открыты для приема сторонних патчей

• Еще имя "Maria" носит один из табличных движков, поставляющихся в составе MariaDB.

● Monty Program Ab ● Третьих сторон

Page 3: Devconf2010 mariadb-extra-features

Текущее состояние MariaDB• MariaDB 5.1

– MariaDB 5.1.32 Beta – 20.04.2009– MariaDB 5.1.38 Beta – 29.10.2009– MariaDB 5.1.39 Beta – 15.11.2009– MariaDB 5.1.41 RC – 13.01.2010 – MariaDB 5.1.42 Stable – 01.02.2010– MariaDB 5.1.44 Stable – 24.03.2010

• MariaDB 5.2– MariaDB 5.2.0 Beta - 10.04.2010

• MariaDB 5.3– Активная разработка (доступно только дерево)

Page 4: Devconf2010 mariadb-extra-features

Дополнительные возможности в MariaDB 5.1

• Табличный движок XtraDB• Больше статистики в Slow query log• В processlist время указывается с точностью

до микросекунды• Оптимизация Table Elimination• Табличный движок PBXT• Табличный движок Maria• Поддержка пула тредов• utf8_croatian_ci, ucs2_croatian_ci collations• Табличный движок FederatedX.

Page 5: Devconf2010 mariadb-extra-features

Дополнительные возможности в MariaDB 5.1

• Табличный движок XtraDB• Больше статистики в Slow query log• В processlist время указывается с точностью

до микросекунды• Оптимизация Table Elimination• Табличный движок PBXT• Табличный движок Maria• Поддержка пула тредов• utf8_croatian_ci, ucs2_croatian_ci collations• Табличный движок FederatedX.

Page 6: Devconf2010 mariadb-extra-features

Табличный движок ХtraDB – история• Состояние до 2005 г

– MySQL Ab разрабатывает MySQL– Innobase Oy разрабатывает InnoDB– InnoDB включен в поставку MySQL

InnoDB

MySQL

• 2007 г – Google выпускает “google patch”– Патч затрагивает и MySQL и InnoDB– InnoDB часть включает– Улучшения производительности– Транзакционную репликацию

MySQL

GoogleInnoDB

Page 7: Devconf2010 mariadb-extra-features

Табличный движок ХtraDB – история (2)

• Апрель 2008: Oracle/Innobase выпускает InnoDB plugin некоторыми изменениями на основе google patch

InnoDB

MySQL

MySQL

InnoDBplugin

InnoDBplugin

• Декабрь 2008: Percona, Inc выпускает XtraDB– Это InnoDB Plugin с дополнительными

улучшениями

InnoDB

MySQL

MySQL

XtraDB

XtraDB

InnoDB

MySQL

MySQL

XtraDB

XtraDB

Page 8: Devconf2010 mariadb-extra-features

Табличный движок ХtraDB – история (3)• 2009 г: Monty Program включает XtraDB

в состав MariaDB

InnoDB

MySQL

MySQL

InnoDBplugin

InnoDBplugin

InnoDB

MySQL

MySQL

XtraDB

XtraDB

InnoDB

MySQL

MySQL

XtraDB

XtraDB

MySQL

XtraDB

MariaDB

XtraDB

Page 9: Devconf2010 mariadb-extra-features

Отличия InnoDB Plugin от InnoDB

На самом деле

• Быстрое создание/удаление индексов

• Улучшенная производительность при высокой нагрузке и большом числе параллельных транзакций

• Новые способы хранения данных– Компрессия дисковых даных

– управляемые upgrade/downgrade

• Больше диагностики через INFORMATION_SCHEMA

• Прочие улучшения

– TRUNCATE TABLE освобождает место

– innodb_strict_mode – ошибки вместо warnings.

На первый взгляд, никаких:

CREATE TABLE tbl (...) engine=innodb;

Page 10: Devconf2010 mariadb-extra-features

Отличия XtraDB

На самом деле:

• Дальнейшие улучшения производительности при параллельной работе– Больше настраиваемых параметров

– Fuzzy checkpointing (более ровная производительность)

• Более быстрое восстановление после сбоев

• Еще больше диагностической информации

• Возможность сохранить/восстановить buffer pool– Можно избежать “холодных стартов”

• Куча более мелких улучшений, ориентированных продвинутых DBA.

Опять: на первый взгляд, никаких:

CREATE TABLE tbl (...) engine=innodb;

Page 11: Devconf2010 mariadb-extra-features

Дополнительные возможности в MariaDB 5.1

• Табличный движок XtraDB• Больше статистики в Slow query log• В processlist время указывается с

точностью до микросекунды• Оптимизация Table Elimination• Табличный движок PBXT• Табличный движок Maria• Поддержка пула тредов• utf8_croatian_ci, ucs2_croatian_ci collations• Табличный движок FederatedX

Page 12: Devconf2010 mariadb-extra-features

Больше информации в slow query log (1) # my.cnf slow_query_log=/path/to/slow.log+log_slow_verbosity=query_plan+log_slow_filter=name,name,...+log_slow_rate_limit=n

name:− admin− filesort, filesort_on_disk, − full_join,− full_scan− query_cache,query_cache_miss,− tmp_table, tmp_table_on_disk.

n: каждый n-ый запрос

Page 13: Devconf2010 mariadb-extra-features

Больше информации в slow query log (2)MySQL # Time: ...# User@Host: root[root] @ localhost []# Query_time: 3.480293  Lock_time: 0.000754 Rows_sent: 1  Rows_examined: 10use test;SET timestamp=...;select count(*) from one_k A, one_k B, ten C where A.a < B.a;

# Time: ...# User@Host: root[root] @ localhost []# Thread_id: 1  Schema: test  QC_hit: No# Query_time: 4.605642  Lock_time: 0.000964  Rows_sent: 1  Rows_examined: 10# Full_scan: Yes  Full_join: Yes  Tmp_table: No  Tmp_table_on_disk: No# Filesort: No  Filesort_on_disk: No  Merge_passes: 0SET timestamp=...;select count(*) from one_k A, one_k B, ten C where A.a < B.a;

MariaDB

Page 14: Devconf2010 mariadb-extra-features

Микросекунды в PROCESSLIST• Основано на microsec_process.patch от Percona• PROCESSLIST показывает микросекунды

– Полезно, когда есть множество мелких запросов

MySQL [(test)]> select * from information_schema.processlist;+­­­­+­­­­­­+­­­­­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­...­+| ID | USER | HOST      | DB   | COMMAND | TIME | STATE        | INFO      |+­­­­+­­­­­­+­­­­­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­­­­+­­­­­­­...­+|  2 | root | localhost | test | Query   |    2 | Sending data | select    |

MariaDB [(test)]> select * from information_schema.processlist;+­­­­+­­­­­­+­­­­­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­+­­­­­­­...­+­­­­­­­­­­+| ID | USER | HOST      | DB   | COMMAND | TIME | STATE     | INFO      | TIME_MS  |+­­­­+­­­­­­+­­­­­­­­­­­+­­­­­­+­­­­­­­­­+­­­­­­+­­­­­­­­­­­+­­­­­­­...­+­­­­­­­­­­+|  2 | root | localhost | test | Query   |    0 | executing | select    |    1.363 |

MariaDB:

MySQL:

Page 15: Devconf2010 mariadb-extra-features

Дополнительные возможности в MariaDB 5.1

• Табличный движок XtraDB• Больше статистики в Slow query log• В processlist время указывается с точностью

до микросекунды• Оптимизация Table Elimination• Табличный движок PBXT• Табличный движок Maria• Поддержка пула тредов• utf8_croatian_ci, ucs2_croatian_ci collations• Табличный движок FederatedX

Page 16: Devconf2010 mariadb-extra-features

Оптимизация Table Elimination• Применима к запросам к сильно нормализованным данным• Реализована в Oracle, SQL Server, etc

– И будет в PostgreSQL 9.0, называется “join removal”• Идея:

SELECT tbl1.*FROM   tbl1 LEFT JOIN tbl2 ON tbl2.primary_key=tbl1.id

WHERE  condition(tbl1.*)

Найти OUTER JOIN'ы, у которых внутренняя часть “не используется”, и удалить эти внутренние части

Page 17: Devconf2010 mariadb-extra-features

Оптимизация Table Elimination

SELECT tbl1.*FROM   tbl1 LEFT JOIN tbl2 ON tbl2.primary_key=tbl1.id

WHERE  condition(tbl1.*)

Найти OUTER JOIN'ы, у которых внутренняя часть “не используется”, и удалить эти внутренние части

Для каждой записи из tbl1:1. tbl2 будет иметь максимум одну соответсвующую запись

(из-за условия tbl2.primary_key=...)2. если в tbl2 не будет соответствующей записи, OUTER

JOIN сгенерирует запись с NULL'ами3. для результата запроса не важно, реализуется ли #1 или

#2.

Page 18: Devconf2010 mariadb-extra-features

Когда применима Table Elimination (1)• Высокая степень нормализации, например

actor(name, date_of_birth, rating)

представляется как

create table ac_anchor(AC_ID int primary key);

create table ac_name(AC_ID int, ACNAM_name char(N), primary key(AC_ID));

create table ac_dob(AC_ID int, ACDOB_birthdate date, primary key(AC_ID));

create table ac_rating(AC_ID int, ACRAT_rating int, ACRAT_fromdate date, primary key(AC_ID, ACRAT_fromdate));

Page 19: Devconf2010 mariadb-extra-features

Когда применима Table Elimination (2)• Выборка в денорма-

лизованном виде:

select ac_anchor.AC_ID, ACNAM_Name, ACDOB_birthdate, ACRAT_ratingfrom ac_anchor left join ac_name on ac_anchor.AC_ID=ac_name.AC_ID left join ac_dob on ac_anchor.AC_ID=ac_dob.AC_ID left join ac_rating on (ac_anchor.AC_ID=ac_rating.AC_ID and ac_rating.ACRAT_fromdate = (select max(sub.ACRAT_fromdate) from ac_rating sub where sub.AC_I=ac_rating.AC_ID))

create view actors as select * from

select ACRAT_rating from actors where ACNAM_name=’Gary Oldman’;

Page 20: Devconf2010 mariadb-extra-features

explain select ACRAT_rating from actors where ACNAM_name='Gary Oldman';+­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..| id | select_type        | table     | type   | possible_keys | key     | key_len | ref               +­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..|  1 | PRIMARY            | ac_anchor | index  | PRIMARY       | PRIMARY | 4       | NULL            | |  1 | PRIMARY            | ac_name   | eq_ref | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID | |  1 | PRIMARY            | ac_rating | ref    | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID | |  3 | DEPENDENT SUBQUERY | sub       | ref    | PRIMARY       | PRIMARY | 4       | ac_rating.AC_ID | +­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..

explain select ACDOB_birthdate from actors where ACNAM_name='Gary Oldman';+­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..| id | select_type | table     | type   | possible_keys | key     | key_len | ref                  +­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..|  1 | PRIMARY     | ac_anchor | index  | PRIMARY       | PRIMARY | 4       | NULL            |    |  1 | PRIMARY     | ac_name   | eq_ref | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID |    |  1 | PRIMARY     | ac_dob    | eq_ref | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID |    +­­­­+­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..

explain select ACRAT_rating, ACDOB_birthdate from actors where ACNAM_name='Gary Oldman';+­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..| id | select_type        | table     | type   | possible_keys | key     | key_len | ref               +­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..|  1 | PRIMARY            | ac_anchor | index  | PRIMARY       | PRIMARY | 4       | NULL            | |  1 | PRIMARY            | ac_name   | eq_ref | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID | |  1 | PRIMARY            | ac_dob    | eq_ref | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID |    |  1 | PRIMARY            | ac_rating | ref    | PRIMARY       | PRIMARY | 4       | ac_anchor.AC_ID | |  3 | DEPENDENT SUBQUERY | sub       | ref    | PRIMARY       | PRIMARY | 4       | ac_rating.AC_ID | +­­­­+­­­­­­­­­­­­­­­­­­­­+­­­­­­­­­­­+­­­­­­­­+­­­­­­­­­­­­­­­+­­­­­­­­­+­­­­­­­­­+­­­­­­­­­­­­­­­­­+­..

Table Elimination - примеры

Page 21: Devconf2010 mariadb-extra-features

Table elimination – выводы

• Покрывает следующий сценарий использования:– Необязательные и/или версионированные

колонки хранятся в отдельных таблицах– Имеется VIEW c денормализованным

представлением• При этом

– Можно писать простые запросы к VIEW– Неиспользуемые колонки не будут замедлять

работу.

Page 22: Devconf2010 mariadb-extra-features

Дополнительные возможности в MariaDB 5.1

• Табличный движок XtraDB• Больше статистики в Slow query log• В processlist время указывается с точностью

до микросекунды• Оптимизация Table Elimination• Табличный движок PBXT• Табличный движок Maria• Поддержка пула тредов• utf8_croatian_ci, ucs2_croatian_ci collations• Табличный движок FederatedX

Page 23: Devconf2010 mariadb-extra-features

Табличный движок PBXT• Разрабатывается PrimeBase technologies• Выполняет требования ACID• Архитектура основана на логах

– нет in-place updates

• Показывает хорошую производительность при большом числе клиентов и CPU-bound загрузке

• Дальнейшая информация на http://primebase.org.

Page 24: Devconf2010 mariadb-extra-features

Табличный движок Maria• Основан на MyISAM

– Поддерживает fulltext и GIS индексы

• Отличия от MyISAM:– Наличие Page Сache (в MyISAM только key

cache)– Crash-safety– Полная транзакционность – в планах

• В MariaDB используется вместо MyISAM для временных таблиц– ./configure имеет параметр для выбора между

использованием Maria и MyISAM.

Page 25: Devconf2010 mariadb-extra-features

Пул тредов• Традиционная модель MySQL: сервер это один процесс,

каждому клиентскому соединению выделяется тред• Пул тредов: все соединения обслуживаются пулом из N=const

тредов.

# my.cnfthread­handling=  one­thread­per­connectionthread­pool­size= 20

extra­port=#extra­max­connections=#

• Известные недостатки– Если запрос ожидает I/O или блокировки, выполняющий

его тред не возвращается обратно в пул– При большом числе клиентов производительность может

быть ниже, чем у традиционной модели.

Page 26: Devconf2010 mariadb-extra-features

Табличный движок FederatedX

• Это Federated из MySQL 5.1 с некоторыми исправленными ошибками.

Page 27: Devconf2010 mariadb-extra-features

Дополнительные возможности в MariaDB 5.1

• Табличный движок XtraDB• Больше статистики в Slow query log• В processlist время указывается с точностью

до микросекунды• Оптимизация Table Elimination• Табличный движок PBXT• Табличный движок Maria• Поддержка пула тредов• utf8_croatian_ci, ucs2_croatian_ci collations• Табличный движок FederatedX

Все это доступно в Stable версии

Page 28: Devconf2010 mariadb-extra-features

Cовместимость с MySQL

* - имена утилит, программ, библиотек одинаковы, поэтому нельзя установить одновременно MySQL и MariaDB

** - Если не используются фичи, специфичные для MariaDB (например PBXT или croatian_utf8_ci)

Библиотека libmysql Да

Клиент-серверный протокол Да

Имена и синтаксис аргументов утилит Да*

Диалект SQL Да

Плагины сервера Не проверяли

Репликация Да**

Data directory (заменить бинарник MariaDB на MySQL и запустить)

Туда: ДаОбратно: Да**

Page 29: Devconf2010 mariadb-extra-features

MariaDB 5.2Цель релиза:

включить известные испытанные патчи, а также собственные небольшие и/или безопасные фичи

Новые возможности• Включен userstatsv2 патч

• Виртуальные колонки

• mysqlbinlog поддерживает –rewrite-db

• Partitioned MyISAM key cache

• Поддержка атрибутов колонок/индексов/таблиц

• Поддержка плагинов аутентификации

• Обновления XtraDB и PBXT.

Page 30: Devconf2010 mariadb-extra-features

MariaDB 5.2, userstats v2 patch (1)MariaDB > set global userstat=1;      ...MariaDB > select * from information_schema.user_statistics;*************************** 1. row ***************************                  USER: web     TOTAL_CONNECTIONS: 1CONCURRENT_CONNECTIONS: 0        CONNECTED_TIME: 4             BUSY_TIME: 0.004146              CPU_TIME: 0.0036062        BYTES_RECEIVED: 61            BYTES_SENT: 169             ROWS_READ: 0             ROWS_SENT: 2          ROWS_DELETED: 0         ROWS_INSERTED: 0          ROWS_UPDATED: 0       SELECT_COMMANDS: 2       UPDATE_COMMANDS: 0        OTHER_COMMANDS: 0         ...MariaDB > flush user_statistics;

Page 31: Devconf2010 mariadb-extra-features

MariaDB 5.2, userstats v2 patch (2)Доступны таблицы• USER_STATISTICS

– Статистика по MySQL-пользователям

• CLIENT_STATISTICS– То же, что предыдущее но по клиентским хостам

• INDEX_STATISTICS– ROWS_READ для каждого использовавшегося

индекса

• TABLE_STATISTICS– ROWS_READ, ROWS_CHANGED и

ROWS_CHANGED_X_INDEXES для каждой таблицы.

Page 32: Devconf2010 mariadb-extra-features

MariaDB 5.2 - Виртуальные колонки

Поддерживается два типа• VIRTUAL: не хранятся, всегда вычисляются

на лету– На текущий момент не могут быть

индексированы• PERSISTENT: хранятся в таблице

– могут быть частью индексов.

create table tbl (  …  column typename AS (expression) [VIRTUAL|PERSISTENT],  … );

Page 33: Devconf2010 mariadb-extra-features

MariaDB 5.2 – остальные фичи• mysqlbinlog поддерживает --rewrite-db

– Это аналог опции –replicate-rewrite-db у slave– Можно “залить” row-based binary log в другую бд

• SegmentedPartitioned MyISAM Key Cache– За счет разбивки на части снижается конкуренция

за мьютексы

• Поддержка атрибутов колонок/индексов/таблиц• Поддержка плагинов аутентификации• Обновления XtraDB и PBXT

Page 34: Devconf2010 mariadb-extra-features

MariaDB 5.2 Beta• userstatsv2 патч• Виртуальные колонки• mysqlbinlog поддерживает –rewrite-db• Partitioned MyISAM key cache• Поддержка атрибутов колонок/индексов/таблиц• Поддержка плагинов аутентификации• Обновления XtraDB и PBXT

Page 35: Devconf2010 mariadb-extra-features

MariaDB 5.3• Находится в фазе активной разработки• Основной фокус на оптимизации

подзапросов– В первую очередь: expr IN (SELECT …)– Во вторую:

SELECT … FROM (SELECT …)– В третью: любые коррелированные

подзапросы

• Еще могут быть фичи– Улучшения в системе репликации– Что-то другое.

Page 36: Devconf2010 mariadb-extra-features

MariaDB - выводы• Испытанные патчи и новые фичи

собраны и выпущены в виде исходников и бинарников

• MariaDB 5.1 – уже давно Stable• MariaDB 5.2 – Beta• Совместима с MySQL, можно

– Использовать MySQL-клиенты– Мигрировать туда-обратно– Подключить MariaDB как replication slave– => легко попробовать.

Page 37: Devconf2010 mariadb-extra-features

Ссылки• MariaDB manual and downloads http://askmonty.org

• “Дополнительные возможности InnoDB и XtraDB” http://askmonty.org/wiki/Image:Std2010-innodb-xtradb.pdf

• Эти слайды: http://askmonty.org/wiki/Image:devconf2010-mariadb.pdf