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!