Upload
andrey-tokarchuk
View
952
Download
2
Embed Size (px)
DESCRIPTION
Доклад Дмитрия Ленева на Moscow MySQL User Group.
Citation preview
<Insert Picture Here>
5.6 новая стабильная ветка MySQL Server.Дмитрий Ленев, Март 2013, Москва
2 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
MySQL 5.6
● Текущая версия – 5.6.10
● Это первая стабильная версия (GA) в 5.6 выпущена в начале февраля 2013 года
● До этого 3 RC версии с сентября 2012
● Базируется на Milestone Release версии 5.6.6-m9 (август 2012)
● Старые ветки 5.1 и 5.5 по прежнему поддерживаются
● Новая development ветка 5.7
3 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Основные направления улучшений в MySQL 5.6
● Оптимизатор/выполнение запросов
● InnoDB
● Репликация
● Расширение типов и новые операции
● Улучшения в безопасности
● performance_schema
● Memcached API для INNODB
4 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в оптимизаторе/выполнении запросов (скорость).
● Index Condition Pushdown
● Disk Sweep Multi-Range Read
● Batched Key Access для соединений (joins)
● Оптимизации выполнения подзапросов:
– Через материализацию
– Через semi-join
– Отложенная материализация для подзапросов из FROM/views
– Игнорирование клауз подзапроса не влияющих на результат
● Улучшение выполнения запросов с ORDER BY (filesort)
● Оптимизированный анализ селективности для IN
5 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Index Condition Pushdown
Storage engine при чтении по индексу проверяет часть условия которая зависит только от полей в индексе, не читая всю строку и не возвращая управление SQL-layer.
CREATE TABLE person ( personid INTEGER PRIMARY KEY,
firstname CHAR(20), lastname CHAR(20), postalcode INTEGER,
age INTEGER, KEY k1 (postalcode,age)
) ENGINE=InnoDB;
SELECT lastname, firstname FROM person
WHERE postalcode BETWEEN 5000 AND 5500 AND age BETWEEN 21 AND 22;
6 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Disk Sweep – Multi-Range Read
Чтение строк по индексу, в порядке расположения их на диске
пакетная обработка групп чтений по индексу:
CREATE TABLE items
( id INTEGER PRIMARY KEY, attr1 CHAR(20), keypart1 INTEGER,
keypart2 INTEGER, KEY k1 (keypart1, keypart2) ) ENGINE=InnoDB;
SELECT * FROM items
WHERE keypart1 BETWEEN 1000 AND 1100 AND keypart2 = 1200;
Без MRR получим один промежуток вида 1000 <= keypart1 <= 1100.
C MRR получим 100 промежутков для {keypart1, keypart2} – {1000, 1200}, {1001, 1200} … {1100, 1200}.
7 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Batched Key Access в соединениях
● Для соединений с доступом к одной из табличек по ключу
– Накопить строки из первой таблички в буфере
– Запросить строки из второй таблички, с ключем, одним запросом, используя DS MRR
– Получить строки по одной от storage engine для соединения (с ссылкой на элемент в буфере)
8 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Оптимизации в выполнении подзапросов
● Выполнение через материализацию
SELECT * FROM t1 WHERE t1.a IN (SELECT t2.b FROM t2 WHERE where_condition);
● Выполнение через semi-join
SELECT * FROM nation WHERE n_regionkey IN (SELECT r_regionkey FROM region WHERE r_name='AFRICA');
SELECT nation.* FROM nation SEMI JOIN region ON nation.n_regionkey = region.r_regionkey AND region.r_name='AFRICA';
● Отложенная материализация для подзапросов из FROM клаузы/views (лучше для EXPLAIN, может не потребоваться вообще)
● Игнорирование клауз подзапроса не влияющих на результат (SELECT * FROM … a IN (SELECT DISTINCT b FROM …) )
9 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Прочие улучшения в оптимизации/выполнении запросов
● Улучшение выполнения запросов с ORDER BY (filesort) (для запросов c ORDER BY non_indexed_column и LIMIT x, и случаев когда x строк помещаются в sort buffer)
● Оптимизированный анализ статистики для IN (параметр eq_range_index_dive_limit, определяет будем ли мы делать нырки в индекс или использовать статистику по индексу).
10 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в оптимизаторе/выполнении запросов (удобство в использовании)
● Optimizer trace (SET optimizer_trace=..., I_S.OPTIMIZER_TRACE)
● EXPLAIN для INSERT/UPDATE/DELETE
EXPLAIN UPDATE t1 SET c2=12345 WHERE (c1, c2) IN ((3, 1));
● EXPLAIN в JSON формате (EXPLAIN FORMAT=JSON ...)
● Определение стратегии обработки ORDER BY на этапе оптимизации
id select_type table type possible_keys key key_len ref row Extra
1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 1 Using where
11 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Новые возможности в InnoDB (1)
● Хранимая статистика для таблиц (сохраняется при рестарте, перестраивается ANALYZE TABLE, опции управления качеством).
● Поддержка полнотекстового поиска (таблицы I_S.INNODB_FT_*, переменные innodb_ft_*, предикат MATCH (col1, …, colN) AGAINST (expr [search_modifier]) )
● Новые таблицы в INFORMATION_SCHEMA (INNODB_METRICS, INNODB_SYS_*, INNODB_BUFFER_*)
● Ослаблено ограничение на размер колонки в ключе
● Появилось возможность журналирования всех deadlock-ов (--innodb_print_all_deadlocks)
12 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Новые возможности в InnoDB (2)
● Online ALTER
– все виды add/drop index
– add/drop column
– add/drop foreign key (без проверки)
– изменение nullability,
– изменение auto_increment,
– переименование столбцов
– ...
– не поддерживается смена типа
● Transportable tablespaces (FLUSH TABLE ... FOR EXPORT)
● Поддержка опции DATA DIRECTORY
13 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Производительность и масштабируемость в InnoDB (1)
● Оптимизация обработки read-only транзакций (non-locking autocommit SELECTs, START TRANSACTION READ ONLY, до 3х!)
● Увеличен максимальный размер REDO журнала (512Gb, --innodb-log-file-size=)
● Сохранение/восстановление содержимого buffer pool (innodb_buffer_pool_dump/load/*)
14 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Производительность и масштабируемость в InnoDB (2)
● Поддержка страниц уменьшенного размера (4K и 8К при 16К по умолчанию, SSD!, --innodb-page-size)
● Поддержка UNDO журнала в отдельных tablespace (SSD!, --innodb-undo-directory=)
● Поддержка аппаратного вычисления контрольных сумм для страниц (--innodb-checksum-algorithm=)
15 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Производительность и масштабируемость в InnoDB (3)
● Kernel mutex разбит на несколько mutexов
– Транзакции и MVCC views: trx_sys_t::lock (rw_lock) и trx_t::mutex
– Locking : lock_sys_t::mutex и lock_sys_t::wait_mutex
● Оптимизация использования блокировок при обращении к buffer pool
● Оптимизация использования блокировок во время commit
● Очистка кэша InnoDB таблиц (--table_definition_cache, LRU)
16 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Производительность и масштабируемость в InnoDB (4)
● Несколько purge ниток (--innodb_purge_threads, <=32)
● Отдельная нить для выталкивания страниц из buffer pool (вместо master thread), новый алгоритм выталкивания (DimitriK)
● Улучшен механизм управление нитями в InnoDB
● Оптимизировано использование кэша процессора (до 50% в OLTP-RO, до 6 раз в RO-S-Ranges)
17 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Производительность и масштабируемость InnoDB по сравнению с MySQL 5.5
18 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в репликации (1)
● Group Commit для Binary Log (--binlog-max-flush-queue-time)
● Поддержка Global Transaction Identifiers (GTID = source_id:transaction_id, CHANGE MASTER TO ... MASTER_AUTO_POSITION=1, --gtid_mode=on, @@gtid_ ...)
● Многопоточный slave (параллелизм для БД, --slave-parallel-workers=N)
● Crash-safe slave (автоматическое восстановление репликации после падения, crash safe binary log, файлы состояния, хранение состояния в таблицах)
● Поддержка контрольных сумм в binary log (--binlog-checksum=none|crc32)
19 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в репликации (2)
● Поддержка частичных образов в RBR (--binlog-row-image = full|minimal|noblob)
● Информационные события для RBR (--binlog-rows-query-log-events)
● Оптимизация RBR для таблиц без индексов
● UUID для идентификации серверов
● Репликация с задержкой (CHANGE MASTER TO .. MASTER_DELAY=N)
● Прямая работа с binary log для удаленного сервера mysqlbinlog –read-from-remote-server --host=host_name --raw --stop-never binlog.000130
20 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Расширения системы типов/операций
● Поддержка микросекунд для TIME, TIMESTAMP и DATETIME
● Поддержка DEFAULT NOW()/ON UPDATE NOW() для DATETIME и нескольких полей, новое поведение TIMESTAMP по умолчанию
● Поддержка OpenGIS/точных операций для GIS данных
● Поддержка Unicode 5.2 Collation Algorithm и нескольких новых collations (Вьетнамская, Хорватская, Бенгальская, …).
● Поддержка UTF-16LE и Unicode в Windows CLI
● TO_BASE64()/FROM_BASE64() и WEIGHT_STRING()
21 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в обработке ошибок
● GET DIAGNOSTICS
GET DIAGNOSTICS rows = ROW_COUNT;
GET DIAGNOSTICS CONDITION 1 code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
● Поведение обработчиков ошибок (HANDLER) в хранимых процедурах стало ближе к стандарту
22 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в безопасности
● SHA-256 хэширование для паролей (sha256_password plugin)
● Обфускация пароля (.mylogin.cnf/mysql_config_editor)
● ALTER USER … PASSWORD EXPIRE
● Plugin API для проверки качества пароля (CREATE USER, GRANT, SET PASSWORD, простой пример validate_password.cc)
23 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Улучшения в partitioning
● Улучшена работа с большим числом partition (partition pruning на этапе оптимизации, выигрыш до 5x и более на 1K partition, 8K теперь реальность!).
● Возможность явного задания partition в операторе
SELECT * FROM employees PARTITION (p0, p2);
DELETE FROM employees PARTITION (p0, p1);
UPDATE employees PARTITION (p0) SET store_id = 2
WHERE fname = 'Jill';
SELECT e.id, s.city FROM
employees AS e JOIN stores PARTITION (p1) AS s ...;
● Импорт/Экспорт в/из таблиц с partitioning
ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2;
24 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Новое в PERFORMANCE_SCHEMA
● PERFORMANCE_SCHEMA включена по умолчанию!
● Инструментированы блокировки таблиц, ввод-вывод в таблицы и сетевой ввод-вывод.
● Аггрегирование статистики для блокировок и ввода-вывода
● Инструментированы операторы
● Инструментированы этапы выполнения операторов
● Поддержка digests для операторов и аггрегирование по ним
● Фильтрация по пользователям, сессиям и таблицам
● P_S.HOST_CACHE
25 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
PERFORMANCE_SCHEMA: инструментирован ввод-вывод в таблицы
Таблицы table_io_waits_summary_by*:
SELECT OBJECT_SCHEMA, OBJECT_NAME, COUNT_STAR, COUNT_READ, SUM_TIMER_READ, COUNT_INSERT, SUM_TIMER_INSERT FROM performance_schema.table_io_waits_summary_by_table WHERE OBJECT_NAME='t1';
SELECT OBJECT_SCHEMA, OBJECT_NAME, INDEX_NAME, COUNT_STAR, COUNT_READ, SUM_TIMER_READ FROM performance_schema.table_io_waits_summary_by_index_usage WHERE OBJECT_NAME='t1';
OBJECT_SCHEMA
OBJECT_NAME COUNT_STAR COUNT_READ SUM_TIMER_READ COUNT_INSERT SUM_TIMER_INSERT
test t1 9 5 16071156 4 53219976
OBJECT_SCHEMA OBJECT_NAME INDEX_NAME COUNT_STAR COUNT_READ SUM_TIMER_READ
test t1 PRIMARY 0 0 0
test t1 j 4 4 101279076
test t1 NULL 4 0 0
26 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
PERFORMANCE_SCHEMA: инструментированы операторы
Таблицы events_statements_*, events_statements_summary_*:
SELECT THREAD_ID, EVENT_NAME, TIMER_WAIT, SQL_TEXT, ROWS_SENT, ROWS_EXAMINED, CREATED_TMP_TABLES, NO_INDEX_USED FROM performance_schema.events_statements_history LIMIT 3, 3;
SELECT THREAD_ID, EVENT_NAME, SUM_TIMER_WAIT, AVG_TIMER_WAIT, SUM_ROWS_SENT, SUM_NO_INDEX_USED FROM performance_schema.events_statements_summary_by_thread_by_event_name WHERE THREAD_ID=16 LIMIT 1;
THREAD_ID
EVENT_NAME TIMER_WAIT SQL_TEXT ROWS_SENT
ROWS_EXAMINED
CREATED_TMP_TABLES
NO_INDEX_USED
16 statement/sql/create_table
1572757000 create table t1 (i int) 0 0 0 0
16 statement/sql/insert 1129054000 insert into t1 values (1), (2), (3)
0 0 0 0
16 statement/sql/select 678927000 select * from t1 where i = 2 1 3 0 1
THREAD_ID EVENT_NAME SUM_TIMER_WAIT AVG_TIMER_WAIT SUM_ROWS_SENT SUM_NO_INDEX_USED
16 statement/sql/select 1062565000 265641000 1 1
27 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
PERFORMANCE_SCHEMA: инструментированы этапы выполнения операторов
Таблицы event_stages_*, event_stages_summary_*:
SELECT EVENT_NAME, SOURCE, TIMER_START, TIMER_WAIT FROM performance_schema.events_stages_history WHERE THREAD_ID=16 AND NESTING_EVENT_ID=343 ORDER BY TIMER_WAIT DESC LIMIT 5;
EVENT_NAME SOURCE TIMER_START TIMER_WAIT
stage/sql/init sql_parse.cc:936 552715025748 66623746
stage/sql/Opening tables
sql_base.cc:4805 552788106302 29843681
stage/sql/preparing sql_select.cc:1977 552876811982 21863187
stage/sql/init sql_select.cc:3588 552831727471 20826223
stage/sql/System lock lock.cc:324 552817949983 13777488
28 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
PERFORMANCE_SCHEMA: добавлена поддержка digests для операторов и
аггрегирование по нимТаблица events_statements_summary_by_digest
SELECT SCHEMA_NAME, DIGEST, DIGEST_TEXT, COUNT_STAR, SUM_ROWS_SENT SUM_ROWS_EXAMINED, SUM_NO_INDEX_USED FROM performance_schema.events_statements_summary_by_digest LIMIT 1, 2;
SCHEMA_NAME
DIGEST DIGEST_TEXT COUNT_STAR
SUM_ROWS_EXAMINED
SUM_NO_INDEX_USE
D
test 449be9e4a75d65e7bf9cdc74fde1a406 INSERT INTO t1 VALUES (...) /* , ... */ 1 0 0
test 820da79addca10faffe250847d91961f SELECT * FROM t1 WHERE j IN (...) 1 2 0
29 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Кроме того
● Хранимые процедуры больше не ломаются параллельным DDL
● Table Cache разбит на несколько partitions
● Добавлена поддержка пользовательских аттрибутов для соединения (mysql_options(), P_S.session_connect_attrs)
● Изменены значения по умолчанию для многих параметров!
30 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
Memcached API для InnoDB
● Daemon plugin для MySQL
● Прямой доступ к InnoDB
● Поддерживает бинарный и текстовый протокол
● Поддерживает значения из нескольких полей
● Опционально поддерживает локальное кэширование
● Поддерживает batch операции для чтения и записи
● Поддерживает простую аутентификацию через SASL
31 Copyright © 2012, Oracle and/or its affiliates. All rights reserved.
● Подробнее о MySQL-5.6:
– http://dev.mysql.com/doc/refman/5.6/en/mysql-nutshell.html
– http://dev.mysql.com/doc/refman/5.6/en/news-5-6-x.html
● Загрузить MySQL-5.6.10:
– http://dev.mysql.com/downloads/mysql/#downloads