NoSQL внутри SQL: приземленные вопросы практического...

Preview:

Citation preview

nosql внутри sqlприземленные вопросыпрактического примененияДмитрий Долгов

Дмитрий Долгов, Mindojo github.com/erthalion@erthalion 9erthalion6 at gmail dot com

1

Данные

2

Данные

2

Данные

2

Данные нужно хранить всоответствующем формате:

: Отдельные хранилища,единый интерфейс

: Единое хранилище,разные форматы

3

Данные нужно хранить всоответствующем формате:

: Отдельные хранилища,единый интерфейс

: Единое хранилище,разные форматы

3

Данные нужно хранить всоответствующем формате:

: Отдельные хранилища,единый интерфейс

: Единое хранилище,разные форматы

3

Отдельные хранилища

: Конкретный формат обрабатываетсянаилучщим образом

: Производительность, дублирование: Вопросы интеграции компонентов

4

Отдельные хранилища: Конкретный формат обрабатываетсянаилучщим образом

: Производительность, дублирование: Вопросы интеграции компонентов

4

Отдельные хранилища: Конкретный формат обрабатываетсянаилучщим образом

: Производительность, дублирование

: Вопросы интеграции компонентов

4

Отдельные хранилища: Конкретный формат обрабатываетсянаилучщим образом

: Производительность, дублирование: Вопросы интеграции компонентов

4

Единое хранилище

: Не требует интеграции: Производительность, дублирование: Поддержка со стороны БД

5

Единое хранилище: Не требует интеграции

: Производительность, дублирование: Поддержка со стороны БД

5

Единое хранилище: Не требует интеграции: Производительность, дублирование

: Поддержка со стороны БД

5

Единое хранилище: Не требует интеграции: Производительность, дублирование: Поддержка со стороны БД

5

6

Кто?: Postgresql (hstore/json/jsonb): MySQL (json): Oracle: MSSql: db2

7

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

8

-- PG since 9.4select jsonb_build_object(

’id’, 1,’data’, ’aaa’

);-- MySQL since 5.7select json_object(

’id’, 1,’data’, ’aaa’

);9

-- PG since 9.4select jsonb_agg(query) from (

select id, datafrom jsonb_table

) query;-- MySQL since 8select json_objectagg(‘key‘, val)as ‘key_val‘ from t1;

10

-- PGcopy table_name(jsonb_column_name)from ’data.json’;-- MySQLload data infile ’data.json’into table table_name (json_column_name);

11

: Загрузка дампа из внешних источников: Некорректные данные с валидной структурой –json5

: Битые данные – ручное исправление, линтеры

12

производительность

Факторы

: Структура данных на диске: Сериализация данных: Поддержка индексов

14

Факторы: Структура данных на диске

: Сериализация данных: Поддержка индексов

14

Факторы: Структура данных на диске: Сериализация данных

: Поддержка индексов

14

Факторы: Структура данных на диске: Сериализация данных: Поддержка индексов

14

Bson

15

bson.dumps({”a”: 3, ”b”: u”xyz”})

16

Jsonb

17

select pg_relation_filepath(oid),relpages from pg_classwhere relname = ’table_name’;

pg_relation_filepath | relpages----------------------+----------base/40960/325477 | 0(1 row)

18

MySQL json

19

Сериализация данных

: MongoDB – дерево Document -> Elements: Postgresql – JsonbValue со списком элементов: MySQL – древовидная структура

20

Индексы

: MongoDB – индексы для полей: Postgresql – общий индекс, индексы для полей: MySQL – виртуальные колонки для индексирования

21

тестирование

23

YCSB 0.8, 106

Postgresql 9.5.4MongoDB 3.2.9MySQL 5.7.9AWS EC2 m4.xlarge16GB memory, 4 core 2.3GHz

24

Воспроизводимостьerthalion/YCSBerthalion/ansible-ycsb

25

Конфигурацияshared_bufferseffective_cache_sizeinnodb_buffer_pool_sizewrite concerntransaction_sync, method

26

Простая выборка по ключу с jsonb_path_opsиндексом

”Маленький документ”10 полейбез вложенности

27

28

29

Простая выборка по ключу с Btree индексом”Маленький документ”10 полейбез вложенности

30

31

32

Простая выборка по ключу с Btree индексом”Сложный документ”3 уровня вложенности/4 потомка

33

34

35

Срез по документу”Большой документ”100 полейИз документа выбирается одно поле

36

37

Срез по документу”Большой документ”100 полейИз документа выбирается 10 полей

38

39

40

41

Вставка документов”Маленький документ”10 полейбез вложенностиjournaled

42

43

Выборка 50%, обновление 50%”Маленький документ”10 полейбез вложенностиобновление одного поляtransaction_sync

44

45

46

Выборка 50%, обновление 50%”Маленький документ”10 полейбез вложенностиобновление одного поляjournaled

47

48

Выборка 50%, обновление 50%”Большой документ”100 полей удвоенной длиныобновление одного полябез вложенности

49

50

51

Вопросы?

52

Recommended