The document discusses MySQL 8.0 introducing a document store functionality with all the benefits of a transactional relational database. It provides a schema flexible JSON document store without requiring SQL. Developers can use modern programming styles without embedded SQL strings. The document store relies on the proven transactional capabilities of MySQL InnoDB for full ACID compliance.
3. MySQL 8.0
a Document Store with all the benefits of a transactional RDBMS
Frédéric Descamps - MySQL Community Manager - Oracle
3 / 130
4.
Safe Harbor Statement
The following is intended to outline our general product direction. It is intended for
information purpose only, and may not be incorporated into any contract. It is not a
commitment to deliver any material, code, or functionality, and should not be relied up in
making purchasing decisions. The development, release and timing of any features or
functionality described for Oracle´s product remains at the sole discretion of Oracle.
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
4 / 130
5. about me - http://about.me/lefred
Who am I ?
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
5 / 130
15. Relational Databases
Data Integrity
normalization
constraints (foreign keys, ...)
Atomicity, Consistency, Isolation, Durability
ACID compliant
transactions
SQL
powerful query language
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
15 / 130
16. NoSQL & MySQL
NoSQL Databases
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
16 / 130
17. NoSQL or Document Store
Schemaless
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
17 / 130
18. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
18 / 130
19. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
19 / 130
20. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
20 / 130
21. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
21 / 130
22. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
valid solution when natural data can´t be modelized optimaly into a relational
model
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
22 / 130
23. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
valid solution when natural data can´t be modelized optimaly into a relational
model
objects persistance without the use of any ORM - mapping object-oriented
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
23 / 130
24. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
valid solution when natural data can´t be modelized optimaly into a relational
model
objects persistance without the use of any ORM - mapping object-oriented
JSON
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
24 / 130
25. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
valid solution when natural data can´t be modelized optimaly into a relational
model
objects persistance without the use of any ORM - mapping object-oriented
JSON
close to frontend
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
25 / 130
26. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
valid solution when natural data can´t be modelized optimaly into a relational
model
objects persistance without the use of any ORM - mapping object-oriented
JSON
close to frontend
native in JS
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
26 / 130
27. NoSQL or Document Store
Schemaless
no schema design, no normalization, no foreign keys, no data types, ...
very quick initial development
Flexible data structure
embedded arrays or objects
valid solution when natural data can´t be modelized optimaly into a relational
model
objects persistance without the use of any ORM - mapping object-oriented
JSON
close to frontend
native in JS
easy to learn
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
27 / 130
28. How DBAs see data
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
28 / 130
29. How DBAs see data How Developers see data
{
"GNP" : 249704,
"Name" : "Belgium",
"government" : {
"GovernmentForm" :
"Constitutional Monarchy, Federation",
"HeadOfState" : "Philippe I"
},
"_id" : "BEL",
"IndepYear" : 1830,
"demographics" : {
"Population" : 10239000,
"LifeExpectancy" : 77.8000030517578
},
"geography" : {
"Region" : "Western Europe",
"SurfaceArea" : 30518,
"Continent" : "Europe"
}
}
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
29 / 130
30. What if there was a way to provide both SQL
and NoSQL on one stable platform that has
proven stability on well know technology with
a large Community and a diverse ecosystem ?
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
30 / 130
31. DBMS or NoSQL ?
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
31 / 130
32. DBMS or NoSQL ?
Why not both ?
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
32 / 130
33. The MySQL Document Store !
SQL is now optional !
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
33 / 130
34. SQL is now optional !
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
34 / 130
35. Developers:
[x] schemaless
[x] rapid prototying/simpler APIs
[x] document model
[x] transactions
Operations:
[x] performance
management/visibility
[x] robust replication, backup,
restore
[x] comprehensive tooling
ecosystem
[x] simpler application schema
upgrades
Business Owner:
[x] don't lose my data == ACID trx
[x] capture all my data =
extensible/schemaless
[x] product on schedule/time to
market = rapid developement
A solution for all
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
35 / 130
36. MySQL Document Store
the Solution
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
36 / 130
37. Built on
the MySQL
JSON Data
type and
Proven
MySQL
Server
Technology
Provides a schema flexible JSON Document Store
No SQL required
No need to define all possible attributes, tables, etc.
Uses new X DevAPI
Can leverage generated column to extract JSON values
into materialized columns that can be indexed for fast
SQL searches.
Document can be ~1GB
It's a column in a row of a table
It cannot exceed max_allowed_packet
Allows use of modern programming styles
No more embedded strings of SQL in your code
Easy to read
Also works with relational Tables
Proven MySQL Technology
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
37 / 130
38. X DevAPI Connectors for
C++, Java, .Net, Node.js, Python, PHP
working with Communities to help them supporting
it too
New MySQL Shell
Command Completion
Python, JavaScrips & SQL modes
Admin functions
New Util object
A new high-level session concept that can scale from
single MySQL Server to a multiple server environment
Non-blocking, asynchronous calls follow common
language patterns
Supports CRUD operations
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
38 / 130
39. X DevAPI
plenty of
sessions
during
Oracle
Code ONE
Developing Modern Applications with the MySQL
Document Store and NodeJS [HOL1706], Tue Oct 23,
11:15
Connector/J Beyond JDBC: The X DevAPI for Java and
MySQL as a Document Store [DEV6233], Tue Oct 23,
12:30
Develop Python Applications with MySQL
Connector/Python [DEV5957], Wed Oct 24, 9.00
Develop PHP Applivations with MySQL X Dev API
[DEV5981] - Wed Oct 24, 10.30
Python and the MySQL Document Store [DEV5959], Wed
Oct 24, 3:15pm
Node.js and the MySQL Document Store [DEV5986], Wed
Oct 24, 1.30pm
MySQL Connector/Node.js and X DevAPI [DEV5985], Thu
Oct 25, 10.00
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
39 / 130
40. Starting using MySQL DS in few minutes
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
00:05
40 / 130
42. Migration from MongoDB to MySQL DS
For this example, I will use the well known restaurants collection:
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
42 / 130
43. Migration from MongoDB to MySQL DS
For this example, I will use the well known restaurants collection:
We need to dump the data to a file and we will use MySQL Shell with the Python
interpreter to load the data.
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
43 / 130
44. Dump and load using MySQL Shell & Python
The following example is inspired by @datacharmer's work:
https://www.slideshare.net/datacharmer/mysql-documentstore
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
44 / 130
45. Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
00:05
45 / 130
46. Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
46 / 130
47. Even better since MySQL Shell 8.0.13
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
00:05
47 / 130
57. CRUD operations for collections
Add a document
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
57 / 130
58. CRUD operations for collections
Add a document
collection.add({ name: 'fred', age: 42 })
.add({ name: 'dave', age: 23 })
.execute()
collection.add([
{ name: 'dimo', age: 50 },
{ name: 'kenny', age: 25 }
]).execute()
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
58 / 130
59. CRUD operations for collections
Modify a document
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
59 / 130
60. CRUD operations for collections
Modify a document
collection.modify('name = :name')
.bind('name', 'fred')
.set('age', 43)
.sort('name ASC')
.limit(1)
.execute()
collection.modify('name = :name')
.bind('name', 'fred')
.patch({ age: 43, active: false })
.sort('name DESC')
.limit(1)
.execute()
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
60 / 130
61. CRUD operations for collections
Remove a document
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
61 / 130
62. CRUD operations for collections
Remove a document
collection.remove('name = :name')
.bind('name', 'fred')
.sort('age ASC')
.limit(1)
.execute()
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
62 / 130
63. MySQL Document Store Objects Summary
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
63 / 130
64. Document Store Full ACID !
It relies on the proven MySQL InnoDB´s strength & robustness:
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
64 / 130
65. Document Store Full ACID !
It relies on the proven MySQL InnoDB´s strength & robustness:
innodb_ ush_log_at_trx_commit = 1
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
65 / 130
66. Document Store Full ACID !
It relies on the proven MySQL InnoDB´s strength & robustness:
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
66 / 130
67. Document Store Full ACID !
It relies on the proven MySQL InnoDB´s strength & robustness:
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
sync_binlog = 1
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
67 / 130
68. Document Store Full ACID !
It relies on the proven MySQL InnoDB´s strength & robustness:
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
sync_binlog = 1
transaction_isolation = REPEATABLE-READ|READ-
COMMITTED|...
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
68 / 130
69. Document Store Full ACID !
It relies on the proven MySQL InnoDB´s strength & robustness:
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
sync_binlog = 1
transaction_isolation = REPEATABLE-READ|READ-
COMMITTED|...
We do care about your data !
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
69 / 130
70. MySQL DS Full ACID - Transactions support
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
00:05
70 / 130
71. Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
71 / 130
72. what about my old SQL ?
The hidden part of the iceberg
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
72 / 130
73. JSON datatype is behind the scene
native datatype (since 5.7.8)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
73 / 130
74. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
74 / 130
75. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Conversion from "native" SQL types to JSON values
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
75 / 130
76. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Conversion from "native" SQL types to JSON values
JSON manipulation functions (JSON_EXTRACT, JSON_KEYS, JSON_SEARCH,
JSON_TABLES, ...)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
76 / 130
77. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Conversion from "native" SQL types to JSON values
JSON manipulation functions (JSON_EXTRACT, JSON_KEYS, JSON_SEARCH,
JSON_TABLES, ...)
Generated/virtual columns
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
77 / 130
78. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Conversion from "native" SQL types to JSON values
JSON manipulation functions (JSON_EXTRACT, JSON_KEYS, JSON_SEARCH,
JSON_TABLES, ...)
Generated/virtual columns
Indexing JSON data
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
78 / 130
79. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Conversion from "native" SQL types to JSON values
JSON manipulation functions (JSON_EXTRACT, JSON_KEYS, JSON_SEARCH,
JSON_TABLES, ...)
Generated/virtual columns
Indexing JSON data
Foreign Keys to JSON data
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
79 / 130
80. JSON datatype is behind the scene
native datatype (since 5.7.8)
JSON values are stored in MySQL tables using UTF8MB4
Conversion from "native" SQL types to JSON values
JSON manipulation functions (JSON_EXTRACT, JSON_KEYS, JSON_SEARCH,
JSON_TABLES, ...)
Generated/virtual columns
Indexing JSON data
Foreign Keys to JSON data
SQL Views to JSON data
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
80 / 130
81. How does the MySQL Document Store work ?
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
81 / 130
82. What does a collection look like on the server ?
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
82 / 130
83. _id Every document has a unique identifier called the document
ID, which can be thought of as the equivalent of a table´s
primary key. The document ID value can be manually assigned
when adding a document. If no value is assigned, a document
ID is generated and assigned to the document automatically !
Use getDocumentId() or getDocumentIds() to
get _ids(s)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
83 / 130
84. Mapping to SQL examples
createCollection('mycollection')
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
84 / 130
85. Mapping to SQL examples
createCollection('mycollection')
CREATE TABLE `test`.`mycoll` (
doc JSON,
_id VARCHAR(32)
GENERATED ALWAYS AS (doc->>'$._id') STORED
PRIMARY KEY
) CHARSET utf8mb4;
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
85 / 130
86. Mapping to SQL examples
createCollection('mycollection')
CREATE TABLE `test`.`mycoll` (
doc JSON,
_id VARCHAR(32)
GENERATED ALWAYS AS (doc->>'$._id') STORED
PRIMARY KEY
) CHARSET utf8mb4;
mycollection.add({'test': 1234})
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
86 / 130
87. Mapping to SQL examples
createCollection('mycollection')
CREATE TABLE `test`.`mycoll` (
doc JSON,
_id VARCHAR(32)
GENERATED ALWAYS AS (doc->>'$._id') STORED
PRIMARY KEY
) CHARSET utf8mb4;
mycollection.add({'test': 1234})
INSERT INTO `test`.`mycoll` (doc)
VALUES (
JSON_OBJECT('_id','663807fe367ee6114e0e5458bdac28bf',
'test',1234)
);
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
87 / 130
88. Mapping to SQL examples (2)
mycollection.find("test > 100")
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
88 / 130
89. Mapping to SQL examples (2)
mycollection.find("test > 100")
SELECT doc
FROM `test`.`mycoll`
WHERE (JSON_EXTRACT(doc,'$.test') > 100);
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
89 / 130
90. SQL and JSON Example
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
90 / 130
91. SQL and JSON Example
same as:
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
91 / 130
92. SQL and JSON Example
same as:
we can use it in SQL:
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
92 / 130
93. SQL and JSON Example (2): validation
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
93 / 130
94. SQL and JSON Example (2): validation
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
94 / 130
95. SQL and JSON Example (2): validation
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
95 / 130
96. SQL and JSON Example (3): explain
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
96 / 130
97. SQL and JSON Example (3): explain
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
97 / 130
98. SQL and JSON Example (4): add index
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
98 / 130
99. SQL and JSON Example (4): add index
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
99 / 130
100. Indexes in Document Store
It's also possible to create indexes without using SQL syntax:
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
100 / 130
101. Indexes in Document Store
It's also possible to create indexes without using SQL syntax:
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
101 / 130
102. SQL and JSON Example (5): arrays
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
102 / 130
103. SQL and JSON Example (5): arrays
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
103 / 130
104. SQL and JSON Example (5): arrays
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
104 / 130
105. SQL and JSON Example (5): arrays
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
105 / 130
107. NoSQL as SQL (2)
JSON_TABLE
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
107 / 130
108. NoSQL as SQL - aggregation
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
108 / 130
109. Challenge: list the best restaurant of each type
of food and show the top 10, with the best one
first !
don't forget that all these restaurants are just JSON documents
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
109 / 130
110. NoSQL as SQL - aggregation (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
110 / 130
111. NoSQL as SQL - aggregation (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
111 / 130
112. NoSQL as SQL - aggregation (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
112 / 130
113. SQL and NoSQL - JOINS
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
113 / 130
114. SQL and NoSQL - JOINS
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
114 / 130
115. SQL and NoSQL - JOINS
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
115 / 130
116. SQL and NoSQL - JOINS (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
116 / 130
117. SQL and NoSQL - JOINS (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
117 / 130
118. SQL and NoSQL - JOINS (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
118 / 130
119. SQL and NoSQL - and back to JSON Document
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
119 / 130
120. NoSQL or SQL
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
120 / 130
121. MySQL Shell is for DBAs and Developers
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
00:05
121 / 130
122. MySQL Shell is for DBAs and Developers (2)
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
00:05
122 / 130
123. Tuesday
HOL1706 - Developing Modern
Applications with the MySQL
Document Store and Node.js
DEV6233 - Connector/J Beyond
JDBC: The X DevAPI for Java and
MySQL as a Document Store
Wednesday
DEV5957 - Develop Python
Application with MySQL
Connector/Python
DEV5981 - Develop PHP
Applications with MySQL X DevAPI
DEV5986 - Node.js and the MySQL
Document Store
DEV5959 - Python and the MySQL
Document Store
Thursday
DEV5985 - MySQL
Connector/Node.js and the X
DevAPI
More at the conference:
catch up on yesterday's sessions
PRO3056 - Introduction to the MySQL Document Store
HOL1703 - A Practical Introduction to the MySQL Document Store
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
123 / 130
124. what do I gain ?
Conclusion
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
124 / 130
125. schemaless
flexible data structure
easy to start (CRUD)
Conclusion
This is the best of the two worlds in one product !
Data integrity
ACID Compliant
Transactions
SQL
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
125 / 130
129. Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
129 / 130
130. Thank you !
Any Questions ?
share your 💕 for MySQL on social media using @mysql #MySQL8isGreat
#OOW18
Copyright @ 2018 Oracle and/or its affiliates. All rights reserved.
130 / 130