Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
MySQL 5.7 - NoSQL Возможности
NoSQL, JSON, PluginX
Петр Зайцев
CEO, Percona
8 November 2016
2
О презентации
Кратко о NoSQL
История NoSQL в MySQL
Новые возможности MySQL 5.7
Кратко о NoSQL
4
Определение NoSQL обычно состоит из
•Не реляционная
Модель
Данных
•Не SQL
Язык
Доступа
5
NoSQL Модели Данных
Key-Value
Document
Stores
Wide-Column
Stores
Graph Multi-Model
6
Другая расшифровка NoSQL
7
Преимущества NoSQL
Скорость Разработки
Простота
Производительность
Масштабируемость
Более удобная модель для ряда приложений
NoSQL в MySQL
9
Фокус в MySQL
Гибкая схема
CRUD доступ
10
Пример JSON Документа
11
CRUD
CREATE – Создавать документ
READ – Читать документ
UPDATE – Изменять документ
DELETE – Удалять документ
12
SQL vs CRUD - Insert
• SQL • CRUD
13
SQL vs CRUD - Search
14
NoSQL протокол доступа в MySQL
• Доступ через стандартный протокол MySQLHANDLER Команда
• Свой NoSQL протоколMySQL Cluster (NDB) 2004
• Поддержка MemcacheD протокола в MySQL (Community)MyCacheD 2009
• Свой NoSQL протоколHandlerSocket 2010
• Для Innodb and NDB
Официальная поддержка
MemcacheD протокола 2011
• Новый протокол поддерживающий SQL и CRUDProtocol X 2016
15
История поддержки NoSQL Модели Данных
Храним Сериализованные объекты в BLOB/TEXT
Поддержка Xpath в MySQL (2005)
Динамические колонки в MariaDB (2012)
JSON UDF функции Светы Смирновой (2013)
Поддержка типа данных JSON MySQL 5.7 (2015)
Тип JSON в MySQL 5.7
17
Архитектурные основы поддержки JSON
Нативный JSON тип данных
Поддержка индексов не основанных на колонке
Поддержка доступа к полям в синтаксисе SQL
18
Нативный JSON тип
Бинарный формат хранения
Парсинг и валидация только при вставке
Индекс для быстрого доступа к полям и элементам массивов
Поддержка резервации места и обновления на месте (В будущем)
19
Поддержка Типов
Все стандартные JSON
типы
•Номера
•Строки
•Булевский Тип
•Вложенные документы
•Массивы
Расширенная поддержка
типов
•Дата
•Время
•DateTime
20
Поддержка вычислимых колонок
• sidec DOUBLE AS (SQRT(sidea * sidea +
sideb * sideb))
Значение колонки
вычисляется на базе
других колонок
• Вычисляется при доступе или хранится
копия вычисленного значения
Можем быть VIRTUAL
или STORED
• Как STORED так и VIRTUALМожно индексировать
21
Вычислимые колонки
CREATE TABLE `ontime` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`YearD` year(4) NOT NULL,
`FlightDate` datetime DEFAULT NULL,
`Carrier` char(2) DEFAULT NULL,
`OriginAirportID` int(11) DEFAULT NULL,
`OriginCityName` varchar(100) DEFAULT NULL,
`OriginState` char(2) DEFAULT NULL,
`DestAirportID` int(11) DEFAULT NULL,
`DestCityName` varchar(100) DEFAULT NULL,
`DestState` char(2) DEFAULT NULL,
...
`Flight_dayofweek` tinyint(4)
GENERATED ALWAYS AS (dayofweek(FlightDate)) VIRTUAL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
alter table ontime add key (Flight_dayofweek);
https://www.percona.com/blog/2015/04/29/generated-virtual-columns-in-mysql-5-7-labs/
https://dev.mysql.com/worklog/task/?id=8114
Не храним колонку но индексируем
SELECT Flight_dayofweek, count(*)
FROM ontime_sm_virtual
GROUP BY Flight_dayofweek
22
mysql> EXPLAIN SELECT carrier, count(*)
FROM ontime_sm_virtual
WHERE Flight_dayofweek = 7 group by carrierG
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: ontime_sm_virtual
partitions: NULL
type: ref
possible_keys: Flight_dayofweek
key: Flight_dayofweek
key_len: 2
ref: const
rows: 165409
filtered: 100.00
Extra: Using where; Using temporary; Using filesort
1 row in set, 1 warning (0.00 sec)
Используется индекс
Вычислимые колонки
23
Нужен удобный SQL синтаксис
• Использование JSON функция для доступа к полу очень неудобно
24
Пример использования типа JSON
mysql> create table json_test (
id int primary key auto_increment,
data json
) engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)
mysql> select * from json_test where data->'$.type' = 'Point' limit 1;
+----+-------------------------------------------------------------+
| id | data |
+----+-------------------------------------------------------------+
| 1 | {"type": "Point", "coordinates": [-87.9101245, 41.7585879]} |
+----+-------------------------------------------------------------+
То же самое как
JSON_EXTRACT(data,"$.type”)
www.percona.com
Поддержка Индексов для JSON
mysql> explain select * from json_test where data->'$.type' = 'Point' limit 1G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: json_test
partitions: NULL
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 996823
filtered: 100.00
Extra: Using where
mysql> alter table json_test
add data_type varchar(255) GENERATED ALWAYS AS (data->'$.type') VIRTUAL;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table json_test add key (data_type);
Query OK, 0 rows affected (2.51 sec)
Records: 0 Duplicates: 0 Warnings: 0
www.percona.com
Поддержка индексов для JSON
mysql> explain select * from json_test where data->'$.type' = 'Point' limit 1G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: json_test
partitions: NULL
type: ref
possible_keys: data_type
key: data_type
key_len: 258
ref: const
rows: 1
filtered: 100.00
Extra: NULL
Новый протокол доступа
(Protocol X)
28
А хотелось бы не использовать SQL Вообще
Protocol X добавлен в MySQL 5.7
Множество улучшений помимо NoSQL
Поддержка SQL и CRUD одновременно
Новый CLI клиент – MySQL Shell
29
Инсталлируем MySQL Shell
…
• apt-get install mysql-apt-config
• apt-get install mysql-shell
• mysqlsh -u root -h localhost -p --classic
--dba enableXProtocol
• mysqlsh -u root --sql --recreate-schema
world_x < /tmp/world_x-db/world_x.sql
https://dev.mysql.com/doc/refman/5.7/en/docu
ment-store-setting-up.html
30
Используем MySQL Shell
mysql-js> db = session.getSchema('world_x')
<Schema:world_x>
mysql-js> db.getCollections()
{
"CountryInfo": <Collection:CountryInfo>
}
31
.Find()
32
.Modify()
33
А как же это все работает внутри ?
• Каждая коллекция представляет собой таблицу
• Бонус: Работает с разными Storage Engines
34
Выполняем запрос
35
Если посмотреть в MySQL General Log
• Видим:
 2016-05-17T21:02:21.213899Z 186 Query SELECT doc FROM
`world_x`.`CountryInfo` WHERE (JSON_EXTRACT(doc,'$.Name') =
'United States') LIMIT 1
• MySQL конвертирует CRUD в SQL на низком уровне
36
Создаем Индекс
37
Достоинства и недостатки такого дизайна
Плюсы
• Новый интерфейс для
разработчиков но
администраторам баз данных
не нужно учить новый язык
• Все существующие
инструменты работают
Минусы
• Сконвертированные запросы
тяжело понимать
• Сложно понять из какого
места в приложении такие
запросы приходят
38
Так же стоит иметь в виду
• Поддержка возможностей обеспечения консистентности данных
 Транзакции
 Режимы изоляции
 Точки сохранения (Savepoints)
• Можно использовать CRUD и SQL в одной транзакции
• Можно использовать разные Storage Engines
• Инструментация с Performance Schema
• Поддержка MySQL Replication и Percona XtraDB Cluster
39
Поддержка в языках программирования
•C/C++
•Java
•Node.JS
•Python
•.NET
Только
некоторые языки
поддерживаются
на данный
момент
https://dev.mysql.com/doc/index-connectors.html
40
Подведем итоги
MySQL позволяет использовать CRUD и SQL интерфейс доступа к данным
Можно хранить реляционные и JSON данные в одном транзакционном
хранилище
Новое в MySQL 5.7 – ведется активная разработка
Не решает проблем “Scale Out” как ряд других NoSQL решений
41
Percona Live: Call for Papers Deadline - November 13
Percona Live Santa Clara to take place April 24-27 in Santa Clara, CA.
Submission Guidelines:
http://bit.ly/2exss8u
Submission Form:
http://bit.ly/2e01oT2
42
Thank You!

More Related Content

MySQL 5.7 - NoSQL - JSON, Protocol X, Document Store / Петр Зайцев (Percona)

  • 1. MySQL 5.7 - NoSQL Возможности NoSQL, JSON, PluginX Петр Зайцев CEO, Percona 8 November 2016
  • 2. 2 О презентации Кратко о NoSQL История NoSQL в MySQL Новые возможности MySQL 5.7
  • 4. 4 Определение NoSQL обычно состоит из •Не реляционная Модель Данных •Не SQL Язык Доступа
  • 9. 9 Фокус в MySQL Гибкая схема CRUD доступ
  • 11. 11 CRUD CREATE – Создавать документ READ – Читать документ UPDATE – Изменять документ DELETE – Удалять документ
  • 12. 12 SQL vs CRUD - Insert • SQL • CRUD
  • 13. 13 SQL vs CRUD - Search
  • 14. 14 NoSQL протокол доступа в MySQL • Доступ через стандартный протокол MySQLHANDLER Команда • Свой NoSQL протоколMySQL Cluster (NDB) 2004 • Поддержка MemcacheD протокола в MySQL (Community)MyCacheD 2009 • Свой NoSQL протоколHandlerSocket 2010 • Для Innodb and NDB Официальная поддержка MemcacheD протокола 2011 • Новый протокол поддерживающий SQL и CRUDProtocol X 2016
  • 15. 15 История поддержки NoSQL Модели Данных Храним Сериализованные объекты в BLOB/TEXT Поддержка Xpath в MySQL (2005) Динамические колонки в MariaDB (2012) JSON UDF функции Светы Смирновой (2013) Поддержка типа данных JSON MySQL 5.7 (2015)
  • 16. Тип JSON в MySQL 5.7
  • 17. 17 Архитектурные основы поддержки JSON Нативный JSON тип данных Поддержка индексов не основанных на колонке Поддержка доступа к полям в синтаксисе SQL
  • 18. 18 Нативный JSON тип Бинарный формат хранения Парсинг и валидация только при вставке Индекс для быстрого доступа к полям и элементам массивов Поддержка резервации места и обновления на месте (В будущем)
  • 19. 19 Поддержка Типов Все стандартные JSON типы •Номера •Строки •Булевский Тип •Вложенные документы •Массивы Расширенная поддержка типов •Дата •Время •DateTime
  • 20. 20 Поддержка вычислимых колонок • sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) Значение колонки вычисляется на базе других колонок • Вычисляется при доступе или хранится копия вычисленного значения Можем быть VIRTUAL или STORED • Как STORED так и VIRTUALМожно индексировать
  • 21. 21 Вычислимые колонки CREATE TABLE `ontime` ( `id` int(11) NOT NULL AUTO_INCREMENT, `YearD` year(4) NOT NULL, `FlightDate` datetime DEFAULT NULL, `Carrier` char(2) DEFAULT NULL, `OriginAirportID` int(11) DEFAULT NULL, `OriginCityName` varchar(100) DEFAULT NULL, `OriginState` char(2) DEFAULT NULL, `DestAirportID` int(11) DEFAULT NULL, `DestCityName` varchar(100) DEFAULT NULL, `DestState` char(2) DEFAULT NULL, ... `Flight_dayofweek` tinyint(4) GENERATED ALWAYS AS (dayofweek(FlightDate)) VIRTUAL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; alter table ontime add key (Flight_dayofweek); https://www.percona.com/blog/2015/04/29/generated-virtual-columns-in-mysql-5-7-labs/ https://dev.mysql.com/worklog/task/?id=8114 Не храним колонку но индексируем SELECT Flight_dayofweek, count(*) FROM ontime_sm_virtual GROUP BY Flight_dayofweek
  • 22. 22 mysql> EXPLAIN SELECT carrier, count(*) FROM ontime_sm_virtual WHERE Flight_dayofweek = 7 group by carrierG *************************** 1. row *************************** id: 1 select_type: SIMPLE table: ontime_sm_virtual partitions: NULL type: ref possible_keys: Flight_dayofweek key: Flight_dayofweek key_len: 2 ref: const rows: 165409 filtered: 100.00 Extra: Using where; Using temporary; Using filesort 1 row in set, 1 warning (0.00 sec) Используется индекс Вычислимые колонки
  • 23. 23 Нужен удобный SQL синтаксис • Использование JSON функция для доступа к полу очень неудобно
  • 24. 24 Пример использования типа JSON mysql> create table json_test ( id int primary key auto_increment, data json ) engine=InnoDB; Query OK, 0 rows affected (0.02 sec) mysql> select * from json_test where data->'$.type' = 'Point' limit 1; +----+-------------------------------------------------------------+ | id | data | +----+-------------------------------------------------------------+ | 1 | {"type": "Point", "coordinates": [-87.9101245, 41.7585879]} | +----+-------------------------------------------------------------+ То же самое как JSON_EXTRACT(data,"$.type”)
  • 25. www.percona.com Поддержка Индексов для JSON mysql> explain select * from json_test where data->'$.type' = 'Point' limit 1G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: json_test partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 996823 filtered: 100.00 Extra: Using where mysql> alter table json_test add data_type varchar(255) GENERATED ALWAYS AS (data->'$.type') VIRTUAL; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> alter table json_test add key (data_type); Query OK, 0 rows affected (2.51 sec) Records: 0 Duplicates: 0 Warnings: 0
  • 26. www.percona.com Поддержка индексов для JSON mysql> explain select * from json_test where data->'$.type' = 'Point' limit 1G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: json_test partitions: NULL type: ref possible_keys: data_type key: data_type key_len: 258 ref: const rows: 1 filtered: 100.00 Extra: NULL
  • 28. 28 А хотелось бы не использовать SQL Вообще Protocol X добавлен в MySQL 5.7 Множество улучшений помимо NoSQL Поддержка SQL и CRUD одновременно Новый CLI клиент – MySQL Shell
  • 29. 29 Инсталлируем MySQL Shell … • apt-get install mysql-apt-config • apt-get install mysql-shell • mysqlsh -u root -h localhost -p --classic --dba enableXProtocol • mysqlsh -u root --sql --recreate-schema world_x < /tmp/world_x-db/world_x.sql https://dev.mysql.com/doc/refman/5.7/en/docu ment-store-setting-up.html
  • 30. 30 Используем MySQL Shell mysql-js> db = session.getSchema('world_x') <Schema:world_x> mysql-js> db.getCollections() { "CountryInfo": <Collection:CountryInfo> }
  • 33. 33 А как же это все работает внутри ? • Каждая коллекция представляет собой таблицу • Бонус: Работает с разными Storage Engines
  • 35. 35 Если посмотреть в MySQL General Log • Видим:  2016-05-17T21:02:21.213899Z 186 Query SELECT doc FROM `world_x`.`CountryInfo` WHERE (JSON_EXTRACT(doc,'$.Name') = 'United States') LIMIT 1 • MySQL конвертирует CRUD в SQL на низком уровне
  • 37. 37 Достоинства и недостатки такого дизайна Плюсы • Новый интерфейс для разработчиков но администраторам баз данных не нужно учить новый язык • Все существующие инструменты работают Минусы • Сконвертированные запросы тяжело понимать • Сложно понять из какого места в приложении такие запросы приходят
  • 38. 38 Так же стоит иметь в виду • Поддержка возможностей обеспечения консистентности данных  Транзакции  Режимы изоляции  Точки сохранения (Savepoints) • Можно использовать CRUD и SQL в одной транзакции • Можно использовать разные Storage Engines • Инструментация с Performance Schema • Поддержка MySQL Replication и Percona XtraDB Cluster
  • 39. 39 Поддержка в языках программирования •C/C++ •Java •Node.JS •Python •.NET Только некоторые языки поддерживаются на данный момент https://dev.mysql.com/doc/index-connectors.html
  • 40. 40 Подведем итоги MySQL позволяет использовать CRUD и SQL интерфейс доступа к данным Можно хранить реляционные и JSON данные в одном транзакционном хранилище Новое в MySQL 5.7 – ведется активная разработка Не решает проблем “Scale Out” как ряд других NoSQL решений
  • 41. 41 Percona Live: Call for Papers Deadline - November 13 Percona Live Santa Clara to take place April 24-27 in Santa Clara, CA. Submission Guidelines: http://bit.ly/2exss8u Submission Form: http://bit.ly/2e01oT2
  • 42. 42