Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий Долгов (Mindojo)

395 views

Published on

Чтобы добиться от системы максимальной производительности, необходимо учитывать структуру данных, с которыми вы работаете. Проблемы возникают, если данные очень неоднородные, и один из способов решения этих проблем - использовать возможности современных реляционных БД для хранения данных в документо-ориентированной форме.

Этот подход имеет свои плюсы и минусы, которые будут обсуждаться в докладе на примерах PostgreSQL/MySQL/MariaDB etc.

Основные вопросы:
* конечно, производительность тех или иных решений и подходов - чего необходимо избегать, а чего бояться не стоит (бенчмарки для разных конфигураций и видов нагрузки);
* способы безболезненного переноса данных в такой формат.

Published in: Engineering

NoSQL внутри SQL: приземленные вопросы практического применения / Дмитрий Долгов (Mindojo)

  1. 1. nosql внутри sql приземленные вопросы практического применения Дмитрий Долгов
  2. 2. Дмитрий Долгов, Mindojo  github.com/erthalion  @erthalion  9erthalion6 at gmail dot com 1
  3. 3. Данные 2
  4. 4. Данные 2
  5. 5. Данные 2
  6. 6. Данные нужно хранить в соответствующем формате: 3
  7. 7. Данные нужно хранить в соответствующем формате: Отдельные хранилища, единый интерфейс 3
  8. 8. Данные нужно хранить в соответствующем формате: Отдельные хранилища, единый интерфейс Единое хранилище, разные форматы 3
  9. 9. Отдельные хранилища 4
  10. 10. Отдельные хранилища Конкретный формат обрабатывается наилучщим образом  4
  11. 11. Отдельные хранилища Конкретный формат обрабатывается наилучщим образом  Производительность, дублирование  4
  12. 12. Отдельные хранилища Конкретный формат обрабатывается наилучщим образом  Производительность, дублирование  Вопросы интеграции компонентов  4
  13. 13. Единое хранилище 5
  14. 14. Единое хранилище Не требует интеграции  5
  15. 15. Единое хранилище Не требует интеграции  Производительность, дублирование  5
  16. 16. Единое хранилище Не требует интеграции  Производительность, дублирование  Поддержка со стороны БД  5
  17. 17. 6
  18. 18. Кто? Postgresql (hstore/json/jsonb) MySQL (json) Oracle MSSql db2 7
  19. 19. Легкий способ начать бегать по утрам использовать документы в реляционной базе 8
  20. 20. -- PG since 9.4 select jsonb_build_object( ’id’, 1, ’data’, ’aaa’ ); -- MySQL since 5.7 select json_object( ’id’, 1, ’data’, ’aaa’ ); 9
  21. 21. -- PG since 9.4 select jsonb_agg(query) from ( select id, data from jsonb_table ) query; -- MySQL since 8 select json_objectagg(‘key‘, val) as ‘key_val‘ from t1; 10
  22. 22. -- PG copy table_name(jsonb_column_name) from ’data.json’; -- MySQL load data infile ’data.json’ into table table_name (json_column_name); 11
  23. 23. Загрузка дампа из внешних источников Некорректные данные с валидной структурой – json5 Битые данные – ручное исправление, линтеры 12
  24. 24. производительность
  25. 25. Факторы 14
  26. 26. Факторы Структура данных на диске 14
  27. 27. Факторы Структура данных на диске Сериализация данных 14
  28. 28. Факторы Структура данных на диске Сериализация данных Поддержка индексов 14
  29. 29. Bson 15
  30. 30. bson.dumps({”a”: 3, ”b”: u”xyz”}) 16
  31. 31. Jsonb 17
  32. 32. select pg_relation_filepath(oid), relpages from pg_class where relname = ’table_name’; pg_relation_filepath | relpages ----------------------+---------- base/40960/325477 | 0 (1 row) 18
  33. 33. MySQL json 19
  34. 34. Сериализация данных MongoDB – дерево Document -> Elements Postgresql – JsonbValue со списком элементов MySQL – древовидная структура 20
  35. 35. Индексы MongoDB – индексы для полей Postgresql – общий индекс, индексы для полей MySQL – виртуальные колонки для индексирования 21
  36. 36. тестирование
  37. 37. 23
  38. 38. YCSB 0.8, 106 Postgresql 9.5.4 MongoDB 3.2.9 MySQL 5.7.9 AWS EC2 m4.xlarge 16GB memory, 4 core 2.3GHz 24
  39. 39. Воспроизводимость erthalion/YCSB erthalion/ansible-ycsb 25
  40. 40. Конфигурация shared_buffers effective_cache_size innodb_buffer_pool_size write concern transaction_sync, method 26
  41. 41. Простая выборка по ключу с jsonb_path_ops индексом ”Маленький документ” 10 полей без вложенности 27
  42. 42. 28
  43. 43. 29
  44. 44. Простая выборка по ключу с Btree индексом ”Маленький документ” 10 полей без вложенности 30
  45. 45. 31
  46. 46. 32
  47. 47. Простая выборка по ключу с Btree индексом ”Сложный документ” 3 уровня вложенности/4 потомка 33
  48. 48. 34
  49. 49. 35
  50. 50. Срез по документу ”Большой документ” 100 полей Из документа выбирается одно поле 36
  51. 51. 37
  52. 52. Срез по документу ”Большой документ” 100 полей Из документа выбирается 10 полей 38
  53. 53. 39
  54. 54. 40
  55. 55. 41
  56. 56. Вставка документов ”Маленький документ” 10 полей без вложенности journaled 42
  57. 57. 43
  58. 58. Выборка 50%, обновление 50% ”Маленький документ” 10 полей без вложенности обновление одного поля transaction_sync 44
  59. 59. 45
  60. 60. 46
  61. 61. Выборка 50%, обновление 50% ”Маленький документ” 10 полей без вложенности обновление одного поля journaled 47
  62. 62. 48
  63. 63. Выборка 50%, обновление 50% ”Большой документ” 100 полей удвоенной длины обновление одного поля без вложенности 49
  64. 64. 50
  65. 65. 51
  66. 66. Вопросы? 52

×