Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQL Innovation & Cloud Day - Document Store a...

lefred
November 16, 2022

MySQL Innovation & Cloud Day - Document Store avec MySQL HeatWave Database Service

Découvrez un nouveau monde où l'on peut gérer ses données sans la moindre ligne de SQL.
MySQL Document Store utilise le nouveau protocol MySQL X, qui est également présent avec MySQL Database Service sur OCI, et permet aux développeurs d'écrire du code simple et efficace.
Mais attention, si nécessaire, MySQL Document Store peut également traiter les document JSON comme s'ils étaient des tables relationnelles et permettre des requêtes très poussées...

lefred

November 16, 2022
Tweet

More Decks by lefred

Other Decks in Programming

Transcript

  1. Frédéric Descamps Community Manager Oracle MySQL Novembre 2022 Document Store

    avec MySQL Document Store avec MySQL HeatWave Database Service HeatWave Database Service MySQL Innovation & Cloud Day MySQL Innovation & Cloud Day
  2. Frédéric Descamps @lefred animateur de la Communauté MySQL utilisateur de

    MySQL depuis la version 3.20 fervant adepte du vrai devops habite dans la contrée de la bière, du chocolat et des frites h ps://lefred.be Copyright @ 2022 Oracle and/or its affiliates. 3
  3. MySQL 8.0 Document Store MySQL 8.0 Document Store à la

    découverte du nouveau monde ! à la découverte du nouveau monde ! Copyright @ 2022 Oracle and/or its affiliates. 4
  4. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... Copyright @ 2022 Oracle and/or its affiliates. 5
  5. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Copyright @ 2022 Oracle and/or its affiliates. 5
  6. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible Copyright @ 2022 Oracle and/or its affiliates. 5
  7. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés Copyright @ 2022 Oracle and/or its affiliates. 5
  8. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel Copyright @ 2022 Oracle and/or its affiliates. 5
  9. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented Copyright @ 2022 Oracle and/or its affiliates. 5
  10. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented JSON Copyright @ 2022 Oracle and/or its affiliates. 5
  11. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented JSON proche du frontend Copyright @ 2022 Oracle and/or its affiliates. 5
  12. NoSQL Document Store Sans structure (schemaless) pas de conception de

    schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented JSON proche du frontend apprentissage aisé Copyright @ 2022 Oracle and/or its affiliates. 5
  13. par les DBAs par les développeurs { { "GNP" "GNP"

    : : 249704 249704, , "Name" "Name" : : "Belgium" "Belgium", , "government" "government" : : { { "GovernmentForm" "GovernmentForm" : : "Constitutional Monarchy, Federation" "Constitutional Monarchy, Federation", , "HeadOfState" "HeadOfState" : : "Philippe I" "Philippe I" } }, , "_id" "_id" : : "BEL" "BEL", , "IndepYear" "IndepYear" : : 1830 1830, , "demographics" "demographics" : : { { "Population" "Population" : : 10239000 10239000, , "LifeExpectancy" "LifeExpectancy" : : 77.8000030517578 77.8000030517578 } }, , } } Percection des données Copyright @ 2022 Oracle and/or its affiliates. 6
  14. Il faut quand-même toujours réaliser des analyses SQL SQL SQL

    Copyright @ 2022 Oracle and/or its affiliates. 7
  15. ... mais...comment ? ? SQL SQL SQL Copyright @ 2022

    Oracle and/or its affiliates. 8
  16. Et s'il y avait un moyen de fournir à la

    fois SQL et NoSQL sur une plateforme stable qui a prouvé sa stabilité sur une technologie bien connue disposant d'une grande communauté et un écosystème diversi é ? Copyright @ 2022 Oracle and/or its affiliates. 10
  17. RDBMS ou NoSQL ? Pourquoi pas les deux ? Copyright

    @ 2022 Oracle and/or its affiliates. 11
  18. MySQL Document Store ! Où le SQL est optionnel ?!

    Copyright @ 2022 Oracle and/or its affiliates. 12
  19. Utilisation de MySQL Document Store ! SQL SQL SQL Copyright

    @ 2022 Oracle and/or its affiliates. 14
  20. La Solution La Solution MySQL Document Store MySQL Document Store

    Copyright @ 2022 Oracle and/or its affiliates. 15
  21. Bâti sur le type de données JSON et la solide

    technologie de MySQL Server Fournit un JSON Document Store exible en terme de schéma Aucune connaissance de SQL requise Pas besoin de dé nir tous les a ributs possibles, les tables, etc. Utilise la nouvelle interface X DevAPI Possibilité d'indexation des données Un document peut avoir une taille de ~1GB ! Permet l'utilisation des nouveaux styles de programmation moderne Possibilité de ne plus avoir de requêtes SQL intégrées dans le code Code plus facile à lire Fonctionne également aves les tables relationnelles Compatible avec les solutions existantes pour MySQL Copyright @ 2022 Oracle and/or its affiliates. 16
  22. Installation de MySQL Document Store installer MySQL 8.0 installer MySQL

    Shell Copyright @ 2022 Oracle and/or its affiliates. 19
  23. Installation de MySQL Document Store installer MySQL 8.0 installer MySQL

    Shell installer un connecteur pour votre langage de programmation Copyright @ 2022 Oracle and/or its affiliates. 19
  24. Installation de MySQL Document Store installer MySQL 8.0 installer MySQL

    Shell installer un connecteur pour votre langage de programmation php-pecl-mysql-xdevapi pour PHP mysql-connector-python pour Python ... Copyright @ 2022 Oracle and/or its affiliates. 19
  25. Installation de MySQL Document Store installer MySQL 8.0 installer MySQL

    Shell installer un connecteur pour votre langage de programmation php-pecl-mysql-xdevapi pour PHP mysql-connector-python pour Python ... Et rien d'autre, pas besoin d'installer d'autre composant ou de charger un plugin. Assurez- vous simplement que votre pare-feu vous perme e de vous connecter au port 33060 (X Protocol). Copyright @ 2022 Oracle and/or its affiliates. 19
  26. MySQL HeatWave Database Service MySQL HeatWave Database Service sur OCI

    est le seul service dans le Cloud perme ant d'utiliser le X Protocol. Copyright @ 2022 Oracle and/or its affiliates. 20
  27. Migration de MongoDB vers MySQL DS Pour cet example, j'utilise

    la collection restaurants de MongoDB: $ mongoexport $ mongoexport -c -c restaurants restaurants > > restaurants.json restaurants.json connected to: connected to: 127.0 127.0.0.1 .0.1 exported exported 25359 25359 records records Copyright @ 2022 Oracle and/or its affiliates. 21
  28. Migration de MongoDB vers MySQL DS Pour cet example, j'utilise

    la collection restaurants de MongoDB: $ mongoexport $ mongoexport -c -c restaurants restaurants > > restaurants.json restaurants.json connected to: connected to: 127.0 127.0.0.1 .0.1 exported exported 25359 25359 records records JS JS> > util util. .importJson importJson( ('restaurants.json' 'restaurants.json', ,{ {convertBsonOid convertBsonOid: : true true} }) ) Importing from file Importing from file "restaurants.json" "restaurants.json" to collection to collection ` `docstore docstore` `. .` `restaurants restaurants` ` in in MySQL Server at localhost MySQL Server at localhost: :33060 33060 . .. . 25359. 25359.. . 25359 25359 Processed Processed 15.60 15.60 MB MB in in 25359 25359 documents documents in in 0.9976 0.9976 sec sec ( (25 25. .36K documents 36K documents/ /s s) ) Total successfully imported documents Total successfully imported documents 25359 25359 ( (25 25. .36K documents 36K documents/ /s s) ) Copyright @ 2022 Oracle and/or its affiliates. 21
  29. Faisons une requête JS > restaurants.find() C'est beaucoup trop d'enrgistrements

    pour les a cher ici... limitons-les Copyright @ 2022 Oracle and/or its affiliates. 26
  30. Et pour les développeurs ? $session $session = = mysql_xdevapi

    mysql_xdevapi\ \getSession getSession( ("mysqlx://fred:MyP@ssw0rd%@localhost" "mysqlx://fred:MyP@ssw0rd%@localhost") ); ; $schema $schema = = $session $session-> ->getSchema getSchema( ("docstore" "docstore") ); ; $collection $collection = = $schema $schema-> ->getCollection getCollection( ("restaurants" "restaurants") ); ; $results $results = = $collection $collection-> ->find find( ($search $search) )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; ... ... foreach foreach ( ($results $results as as $doc $doc) ) { { echo echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>" "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"; ; echo echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>" "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"; ; } } Copyright @ 2022 Oracle and/or its affiliates. 32
  31. Et pour les développeurs ? $session $session = = mysql_xdevapi

    mysql_xdevapi\ \getSession getSession( ("mysqlx://fred:MyP@ssw0rd%@localhost" "mysqlx://fred:MyP@ssw0rd%@localhost") ); ; $schema $schema = = $session $session-> ->getSchema getSchema( ("docstore" "docstore") ); ; $collection $collection = = $schema $schema-> ->getCollection getCollection( ("restaurants" "restaurants") ); ; $results $results = = $collection $collection-> ->find find( ($search $search) )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; ... ... foreach foreach ( ($results $results as as $doc $doc) ) { { echo echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>" "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"; ; echo echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>" "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"; ; } } Facile, en utilisant uniquement des opérations CRUD ! Copyright @ 2022 Oracle and/or its affiliates. 32
  32. Et pour les développeurs ? $session $session = = mysql_xdevapi

    mysql_xdevapi\ \getSession getSession( ("mysqlx://fred:MyP@ssw0rd%@localhost" "mysqlx://fred:MyP@ssw0rd%@localhost") ); ; $schema $schema = = $session $session-> ->getSchema getSchema( ("docstore" "docstore") ); ; $collection $collection = = $schema $schema-> ->getCollection getCollection( ("restaurants" "restaurants") ); ; $results $results = = $collection $collection-> ->find find( ($search $search) )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; ... ... foreach foreach ( ($results $results as as $doc $doc) ) { { echo echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>" "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"; ; echo echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>" "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"; ; } } Facile, en utilisant uniquement des opérations CRUD ! Pas une seule instruction SQL ! Copyright @ 2022 Oracle and/or its affiliates. 32
  33. En import import * *; ; class class Main Main

    { { public public static static void void main main( (String String args args[ [] ]) ) { { Session Session mySession mySession = = new new SessionFactory SessionFactory( () ) . .getSession getSession( ("mysqlx://localhost:33060/docstore?user=resto&password=Passw0rd!" "mysqlx://localhost:33060/docstore?user=resto&password=Passw0rd!") ); ; Schema Schema myDb myDb = = mySession mySession. .getSchema getSchema( ("docstore" "docstore") ); ; Collection Collection myColl myColl = = myDb myDb. .getCollection getCollection( ("restaurants" "restaurants") ); ; DocResult DocResult myDocs myDocs = = myColl myColl. .find find( ("name like :param" "name like :param") ). .limit limit( (1 1) ) . .bind bind( ("param" "param", , "Green%" "Green%") ). .execute execute( () ); ; System System. .out out. .println println( (myDocs myDocs. .fetchOne fetchOne( () )) ); ; mySession mySession. .close close( () ); ; } } } } Copyright @ 2022 Oracle and/or its affiliates. com com. .mysql mysql. .cj cj. .xdevapi xdevapi. . 33
  34. Opérations CRUD L'acronyme informatique anglais CRUD (pour Create, Read, Update,

    Delete) désigne les quatre opérations de base pour la persistance des données, en particulier le stockage d'informations en base de données. Copyright @ 2022 Oracle and/or its affiliates. 34
  35. Opérations CRUD relatives aux collections Ajout d'un document collection collection.

    .add add( ({ { name name: : 'fred' 'fred', , age age: : 46 46 } }) ) . .add add( ({ { name name: : 'scott' 'scott', , age age: : 47 47 } }) ) . .execute execute( () ) collection collection. .add add( ([ [ { { name name: : 'dimo' 'dimo', , age age: : 50 50 } }, , { { name name: : 'kenny' 'kenny', , age age: : 25 25 } } ] ]) ). .execute execute( () ) Copyright @ 2022 Oracle and/or its affiliates. 35
  36. collection collection. .modify modify( ('name = :name' 'name = :name')

    ) . .bind bind( ('name' 'name', , 'fred' 'fred') ) . .set set( ('age' 'age', , 43 43) ) . .sort sort( ('name ASC' 'name ASC') ) . .limit limit( (1 1) ) . .execute execute( () ) collection collection. .modify modify( ('name = :name' 'name = :name') ) . .bind bind( ('name' 'name', , 'fred' 'fred') ) . .patch patch( ({ { age age: : 43 43, , active active: : false false } }) ) . .sort sort( ('name DESC' 'name DESC') ) . .limit limit( (1 1) ) . .execute execute( () ) Opérations CRUD relatives aux collections Modi cation d'un document Copyright @ 2022 Oracle and/or its affiliates. 36
  37. Opérations CRUD relatives aux collections Suppression d'un document collection collection.

    .remove remove( ('name = :name' 'name = :name') ) . .bind bind( ('name' 'name', , 'fred' 'fred') ) . .sort sort( ('age ASC' 'age ASC') ) . .limit limit( (1 1) ) . .execute execute( () ) Copyright @ 2022 Oracle and/or its affiliates. 37
  38. Tout ce dont vous avez besoin, se trouve ici: h

    ps://dev.mysql.com/doc/x-devapi-userguide/en/crud-operations-overview.html Copyright @ 2022 Oracle and/or its affiliates. 39
  39. MySQL Document Store MySQL Document Store est entièrement conforme à

    la norme ACID est entièrement conforme à la norme ACID nous nous soucions de vos données nous nous soucions de vos données Copyright @ 2022 Oracle and/or its affiliates. 40
  40. Document Store entièrement ACID ! Ce e solution s'appuie sur

    la force et la robustesse éprouvée de MySQL InnoDB Copyright @ 2022 Oracle and/or its affiliates. 41
  41. Document Store entièrement ACID ! Ce e solution s'appuie sur

    la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 Copyright @ 2022 Oracle and/or its affiliates. 41
  42. Document Store entièrement ACID ! Ce e solution s'appuie sur

    la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON Copyright @ 2022 Oracle and/or its affiliates. 41
  43. Document Store entièrement ACID ! Ce e solution s'appuie sur

    la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON sync_binlog = 1 Copyright @ 2022 Oracle and/or its affiliates. 41
  44. Document Store entièrement ACID ! Ce e solution s'appuie sur

    la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON sync_binlog = 1 transaction_isolation = REPEATABLE-READ|READ-COMMITTED|... Copyright @ 2022 Oracle and/or its affiliates. 41
  45. Document Store entièrement ACID ! Ce e solution s'appuie sur

    la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON sync_binlog = 1 transaction_isolation = REPEATABLE-READ|READ-COMMITTED|... Nous nous soucions de vos données ! Copyright @ 2022 Oracle and/or its affiliates. 41
  46. OK nous avons le Document Store, OK nous avons le

    Document Store, les opérations CRUD et la norme ACID les opérations CRUD et la norme ACID mais qu'est-ce qui rend le MySQL Document Store unique mais qu'est-ce qui rend le MySQL Document Store unique ? ? Copyright @ 2022 Oracle and/or its affiliates. 44
  47. Challenge: listez les meilleurs restaurants de chaque type de nourriture

    et a chez le top 10, avec le meilleur en premier ! n'oubliez pas que tous ces restaurants ne sont que des documents JSON Copyright @ 2022 Oracle and/or its affiliates. 45
  48. Traiter le NoSQL comme du SQL - agrégation Copyright @

    2022 Oracle and/or its affiliates. 46
  49. Traiter le NoSQL comme du SQL - agrégation Copyright @

    2022 Oracle and/or its affiliates. 47
  50. Traiter le NoSQL comme du SQL - agrégation Copyright @

    2022 Oracle and/or its affiliates. 48
  51. Traiter le NoSQL comme du SQL - agrégation Copyright @

    2022 Oracle and/or its affiliates. 49
  52. NoSQL ou SQL Vous avez la possibilité d'écrire un code

    propre et soigné : Copyright @ 2022 Oracle and/or its affiliates. 50
  53. NoSQL ou SQL Vous avez la possibilité d'écrire un code

    propre et soigné : $results $results = = $collection $collection-> ->find find( ('cuisine like "italian"' 'cuisine like "italian"') )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; Copyright @ 2022 Oracle and/or its affiliates. 50
  54. NoSQL ou SQL Vous avez la possibilité d'écrire un code

    propre et soigné : $results $results = = $collection $collection-> ->find find( ('cuisine like "italian"' 'cuisine like "italian"') )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; Et n'utilisez SQL que lorsque c'est vraiment nécessaire : Copyright @ 2022 Oracle and/or its affiliates. 50
  55. NoSQL ou SQL Vous avez la possibilité d'écrire un code

    propre et soigné : $results $results = = $collection $collection-> ->find find( ('cuisine like "italian"' 'cuisine like "italian"') )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; Et n'utilisez SQL que lorsque c'est vraiment nécessaire : $results $results = = $session $session-> ->sql sql( ('WITH cte1 AS (SELECT doc->>"$.name" AS name, 'WITH cte1 AS (SELECT doc->>"$.name" AS name, doc->>"$.cuisine" AS cuisine, doc->>"$.cuisine" AS cuisine, (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT PATH "$.score")) AS r) AS avg_score FROM docstore.restaurants) SELECT *, RANK() PATH "$.score")) AS r) AS avg_score FROM docstore.restaurants) SELECT *, RANK() OVER ( PARTITION BY cuisine ORDER BY avg_score) AS `rank` OVER ( PARTITION BY cuisine ORDER BY avg_score) AS `rank` FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;' FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;') )-> ->execute execute( () ); ; Copyright @ 2022 Oracle and/or its affiliates. 50
  56. Tout cela dans la même session MySQL X ! Copyright

    @ 2022 Oracle and/or its affiliates. 51
  57. Aller plus loin ! Le meilleur des deux mondes: Copyright

    @ 2022 Oracle and/or its affiliates. 53
  58. Aller plus loin ! Le meilleur des deux mondes: Et

    le résultat en action: Copyright @ 2022 Oracle and/or its affiliates. 53
  59. Aller plus loin ! Le meilleur des deux mondes: Et

    le résultat en action: Copyright @ 2022 Oracle and/or its affiliates. 53
  60. Conclusion Conclusion qu'est ce que j'y gagne ? qu'est ce

    que j'y gagne ? Copyright @ 2022 Oracle and/or its affiliates. 55
  61. absence de schéma structure de données exible apprentissage facile (CRUD)

    Conclusion Le meilleur des deux mondes en un seul produit ! Intégrité des données Conforme à la norme ACID Transactions SQL Copyright @ 2022 Oracle and/or its affiliates. 56