MySQL 5.7 - NoSQL Возможности - Percona · Петр Зайцев CEO, Percona 8 November...

Preview:

Citation preview

MySQL 5.7 - NoSQL ВозможностиNoSQL, JSON, PluginX

Петр ЗайцевCEO, Percona

8 November 2016

2

О презентации

КраткооNoSQL

ИсторияNoSQLвMySQL

НовыевозможностиMySQL5.7

Кратко о NoSQL

4

Определение NoSQL обычно состоит из

•НереляционнаяМодельДанных

•НеSQLЯзыкДоступа

5

NoSQL Модели Данных

Key-Value DocumentStores

Wide-ColumnStores

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 протоколMySQLCluster(NDB)2004

• ПоддержкаMemcacheD протоколавMySQL(Community)MyCacheD2009

• СвойNoSQLпротоколHandlerSocket2010

• Для Innodb andNDBОфициальнаяподдержкаMemcacheD протокола 2011

• НовыйпротоколподдерживающийSQLиCRUDProtocolX2016

15

История поддержки NoSQL Модели Данных

ХранимСериализованные объектыв BLOB/TEXT

ПоддержкаXpath в MySQL(2005)

Динамическиеколонкив MariaDB (2012)

JSONUDF функцииСветыСмирновой (2013)

ПоддержкатипаданныхJSONMySQL5.7(2015)

Тип JSON в MySQL 5.7

17

Архитектурные основы поддержки JSON

Нативный JSONтипданных

Поддержкаиндексовнеоснованныхнаколонке

ПоддержкадоступакполямвсинтаксисеSQL

18

Нативный JSON тип

Бинарныйформатхранения

Парсинг ивалидация толькопривставке

Индексдлябыстрогодоступакполямиэлементаммассивов

Поддержкарезервацииместаиобновлениянаместе (Вбудущем)

19

Поддержка Типов

ВсестандартныеJSONтипы

•Номера•Строки•БулевскийТип•Вложенныедокументы•Массивы

Расширеннаяподдержкатипов

•Дата•Время•DateTime

20

Поддержка вычислимых колонок

• sidecDOUBLEAS(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_virtualGROUP BY Flight_dayofweek

22

mysql> EXPLAIN SELECT carrier, count(*)

FROM ontime_sm_virtual

WHERE Flight_dayofweek = 7 group by carrier\G

*************************** 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

Пример использования типа JSONmysql> 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 1\G*************************** 1. row ***************************

id: 1select_type: SIMPLE

table: json_testpartitions: NULL

type: ALLpossible_keys: NULL

key: NULLkey_len: NULL

ref: NULLrows: 996823

filtered: 100.00Extra: Using where

mysql> alter table json_testadd 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

Поддержка индексов для JSONmysql> explain select * from json_test where data->'$.type' = 'Point' limit 1\G*************************** 1. row ***************************

id: 1select_type: SIMPLE

table: json_testpartitions: NULL

type: refpossible_keys: data_type

key: data_typekey_len: 258

ref: constrows: 1

filtered: 100.00Extra: NULL

Новый протокол доступа (Protocol X)

28

А хотелось бы не использовать SQL Вообще

ProtocolXдобавленвMySQL5.7

МножествоулучшенийпомимоNoSQL

ПоддержкаSQLиCRUDодновременно

НовыйCLIклиент– MySQLShell

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/document-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 данныеводномтранзакционномхранилище

Новоев MySQL5.7– ведетсяактивнаяразработка

Нерешаетпроблем“ScaleOut”какряддругих NoSQLрешений

41

Percona Live: Call for Papers Deadline - November 13

PerconaLiveSantaClaratotakeplaceApril24-27inSantaClara,CA.

Submission Guidelines:http://bit.ly/2exss8u

Submission Form: http://bit.ly/2e01oT2

42

Thank You!

Recommended