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

Ubuntu Summit 2023 - What's Hot in MySQL: A Sneak Peek at Game Changing Features

lefred
November 04, 2023

Ubuntu Summit 2023 - What's Hot in MySQL: A Sneak Peek at Game Changing Features

Join us for an exciting presentation on the latest news relate to MySQL where we explore the latest advancements and features in MySQL, the most popular open source relational database management systems. In this session, we will delve into the key updates and enhancements that have been introduced in recent versions, showcasing how they contribute to improved performance, scalability, and ease of use.
We will also cover the new versioning policy that introduces Innovation and LTS releases.
Whether you're a seasoned MySQL user or just starting to explore its potential, this presentation will provide valuable insights into the latest innovations and solutions you may not yet know about. Don't miss this opportunity to stay ahead of the curve and discover what's new in MySQL!

lefred

November 04, 2023
Tweet

More Decks by lefred

Other Decks in Technology

Transcript

  1. Frédéric Descamps Community Manager Oracle MySQL Ubuntu Summit 2023 -

    Riga What's Hot in MySQL A Sneak Peek at Game Changing Features
  2. @lefred MySQL Evangelist using MySQL since version 3.20 devops believer

    living in h ps://lefred.be Frédéric Descamps Copyright @ 2023 Oracle and/or its affiliates. 3
  3. MySQL New Release Model Innovation Release Long Term Support Release

    (LTS) Agenda Copyright @ 2023 Oracle and/or its affiliates. 5
  4. MySQL New Release Model Innovation Release Long Term Support Release

    (LTS) InnoDB Improvements Runtime Disabling Redo Logs Parallel Threads for Online Operations Instant DDLs Clone Plugin New Redo Log Architecture GIPK Mode Agenda Copyright @ 2023 Oracle and/or its affiliates. 5
  5. MySQL Architectures Replication Improvements Binary Log Compression New All-in-One Solutions

    (HA, DR) Automatic Read/Write Spli ing MySQL Rest Service (MRS) Design RESTfull Web Apps MySQL HeatWave MySQL in the Cloud Agenda (2) Copyright @ 2023 Oracle and/or its affiliates. 6
  6. MySQL LTS Releases bug x & security patches backward compatibility

    every 2 years support lifecyle: 5y premier + 3y extended MySQL Innovation Releases leading-edge innovations easy migration paths between LTS & Innovation every quarter support lifecyle: short term MySQL Versioning: LTS & Innovation Releases Copyright @ 2023 Oracle and/or its affiliates. 8
  7. MySQL Innovation Releases History MySQL 8.0 - 2018-01-23 (GA) Optimizer:

    CTEs, Window Functions, LATERAL, HASH JOIN, EXPLAIN ANALYZE, Histograms, ... SQL DDL: SET PERSIST, RESTART, RESOURCE GROUP, CHECK constraint, ... Indexes: invisible, functional, ... JSON MySQL Document Store: where SQL is optional ! ... and many more features ! We also released MySQL Shell for Visual Studio Code Copyright @ 2023 Oracle and/or its affiliates. 9
  8. MySQL Innovation Releases History MySQL 8.1 - 2023-07-18 Read Replicas

    New Password Validation MySQL 8.2 - 2023-10-25 Transparent Read/Write Spli ing WebAuthn authentication method for EE (FIDO & FIDO2) Support of SQL_AFTER_GTIDS with Mutli-Threaded Applier(MTA) Copyright @ 2023 Oracle and/or its affiliates. 10
  9. Runtime Disabling Redo Logs Now it's possible to speed up

    data ingestion ! During an initial load, the durability is not a probem, if there is a crash, the process can be restarted. Therefore, if the durability is not important, we can reduce it to speed up the loading of data. We can disable redo logs and tune some InnoDB se ings. MySQL MySQL > > ALTER ALTER INSTANCE INSTANCE DISABLE DISABLE INNODB INNODB REDO_LOG REDO_LOG; ; MySQL MySQL > > set set global global innodb_extend_and_initialize innodb_extend_and_initialize= =OFF OFF; ; MySQL MySQL > > set set global global innodb_max_dirty_pages_pct innodb_max_dirty_pages_pct= =10 10; ; MySQL MySQL > > set set global global innodb_max_dirty_pages_pct_lwm innodb_max_dirty_pages_pct_lwm= =10 10; ; Copyright @ 2023 Oracle and/or its affiliates. 12
  10. Runtime Disabling Redo Logs Now it's possible to speed up

    data ingestion ! During an initial load, the durability is not a probem, if there is a crash, the process can be restarted. Therefore, if the durability is not important, we can reduce it to speed up the loading of data. We can disable redo logs and tune some InnoDB se ings. MySQL MySQL > > ALTER ALTER INSTANCE INSTANCE DISABLE DISABLE INNODB INNODB REDO_LOG REDO_LOG; ; MySQL MySQL > > set set global global innodb_extend_and_initialize innodb_extend_and_initialize= =OFF OFF; ; MySQL MySQL > > set set global global innodb_max_dirty_pages_pct innodb_max_dirty_pages_pct= =10 10; ; MySQL MySQL > > set set global global innodb_max_dirty_pages_pct_lwm innodb_max_dirty_pages_pct_lwm= =10 10; ; Copyright @ 2023 Oracle and/or its affiliates. 2802 chunks (194.70M rows, 64.75 GB) for 1 tables in 1 schemas were loaded in 4 min 51 sec (avg throughput 222.51 MB/s) 12
  11. Parallel Threads for Online Operations The amount of parallel threads

    used by InnoDB is controlled by innodb_ddl_threads. This new variable is coupled with another new variable: innodb_ddl_buffer_size. If you have fast storage and multiple CPU cores, tuning these variables can speed up secondary index creation. Copyright @ 2023 Oracle and/or its affiliates. 13
  12. Parallel Index Creation - example MySQL MySQL > > alter

    alter table table booking booking add add index index idx_2 idx_2( (flight_id flight_id, , seat seat, , passenger_id passenger_id) ); ; Query OK Query OK, , 0 0 rows rows affected affected ( (9 9 min min 0.6838 0.6838 sec sec) ) Copyright @ 2023 Oracle and/or its affiliates. 14
  13. Parallel Index Creation - example MySQL MySQL > > alter

    alter table table booking booking add add index index idx_2 idx_2( (flight_id flight_id, , seat seat, , passenger_id passenger_id) ); ; Query OK Query OK, , 0 0 rows rows affected affected ( (9 9 min min 0.6838 0.6838 sec sec) ) The default se ings are: innodb_ddl_threads = 4 innodb_ddl_buffer_size = 1048576 innodb_parallel_read_threads = 4 Copyright @ 2023 Oracle and/or its affiliates. 14
  14. Parallel Index Creation - example MySQL MySQL > > alter

    alter table table booking booking add add index index idx_2 idx_2( (flight_id flight_id, , seat seat, , passenger_id passenger_id) ); ; Query OK Query OK, , 0 0 rows rows affected affected ( (9 9 min min 0.6838 0.6838 sec sec) ) The default se ings are: innodb_ddl_threads = 4 innodb_ddl_buffer_size = 1048576 innodb_parallel_read_threads = 4 The innodb_ddl_buffer_size is shared between all innodb_ddl_threads de ned. If you increase the amount of threads, I recommend that you also increase the bu er size. Copyright @ 2023 Oracle and/or its affiliates. 14
  15. Parallel Index Creation - example (2) To nd the best

    values for these variables, let's have a look at the amount of CPU cores: MySQL MySQL > > select select count count from from information_schema information_schema. .INNODB_METRICS INNODB_METRICS where where name name = = 'cpu_n' 'cpu_n'; ; + +-------+ -------+ | | count count | | + +-------+ -------+ | | 16 16 | | + +-------+ -------+ We have then 16 cores to share. As my machine as plenty of memory, I will allocate 1GB for the InnoDB DDL bu er. Copyright @ 2023 Oracle and/or its affiliates. 15
  16. Parallel Index Creation - example (3) MySQL MySQL > >

    SET SET innodb_ddl_threads innodb_ddl_threads = = 8 8; ; MySQL MySQL > > SET SET innodb_parallel_read_threads innodb_parallel_read_threads = = 8 8; ; MySQL MySQL > > SET SET innodb_ddl_buffer_size innodb_ddl_buffer_size = = 1048576000 1048576000; ; Copyright @ 2023 Oracle and/or its affiliates. 16
  17. Parallel Index Creation - example (3) MySQL MySQL > >

    SET SET innodb_ddl_threads innodb_ddl_threads = = 8 8; ; MySQL MySQL > > SET SET innodb_parallel_read_threads innodb_parallel_read_threads = = 8 8; ; MySQL MySQL > > SET SET innodb_ddl_buffer_size innodb_ddl_buffer_size = = 1048576000 1048576000; ; We can now retry the same index creation as previously: MySQL MySQL > > alter alter table table booking booking add add index index idx_2 idx_2( (flight_id flight_id, , seat seat, , passenger_id passenger_id) ); ; Query OK Query OK, , 0 0 rows rows affected affected ( (3 3 min min 9.1862 9.1862 sec sec) ) Copyright @ 2023 Oracle and/or its affiliates. 16
  18. Parallel Index Creation - example (4) I recommend to make

    tests to de ne the optimal se ings for your database, your hardware and data. For example, I got the best result se ing the bu er size to 2GB and both ddl threads and parallel read threads to 4. It took 2 min 43 sec, much be er than the initial 9 minutes ! For more information, go to h ps://lefred.be/content/mysql-8-0-innodb-parallel-threads- for-online-ddl-operations/ Copyright @ 2023 Oracle and/or its affiliates. 17
  19. Index Operations - changing index type Table Operations - renaming

    a table Column Operations - adding a column - dropping a column - renaming a column - se ing a column default value - dropping the column default value - modifying the de nition of an ENUM or SET column Generated Column Operations - adding a VIRTUAL column - dropping a VIRTUAL column Instant DDLs InnoDB supports many instant DDLs. Those are meta-data changes. The current supported operations are: Copyright @ 2023 Oracle and/or its affiliates. 18
  20. Index Operations - changing index type Table Operations - renaming

    a table Column Operations - adding a column - dropping a column - renaming a column - se ing a column default value - dropping the column default value - modifying the de nition of an ENUM or SET column Generated Column Operations - adding a VIRTUAL column - dropping a VIRTUAL column Instant DDLs InnoDB supports many instant DDLs. Those are meta-data changes. The current supported operations are: Copyright @ 2023 Oracle and/or its affiliates. MySQL> select count(*) from sbtest.sbtest1; +----------+ | count(*) | +----------+ | 1127584 | +----------+ 1 row in set (0.1139 sec) MySQL> alter table sbtest.sbtest1 add column name varchar(20) default 'ubuntu'; Query OK, 0 rows affected (0.0190 sec) Records: 0 Duplicates: 0 Warnings: 0 MySQL> select id, k, name from sbtest.sbtest1 limit 3; +----+-------+--------+ | id | k | name | +----+-------+--------+ | 1 | 33226 | ubuntu | | 2 | 27775 | ubuntu | | 3 | 39558 | ubuntu | +----+-------+--------+ 18
  21. MySQL InnoDB Clone Plugin The clone plugin permits cloning data

    locally or from a remote MySQL server instance. Cloned data is a physical snapshot of data stored in InnoDB that includes schemas, tables, tablespaces, and data dictionary metadata. The cloned data comprises a fully functional data directory, which permits using the clone plugin for MySQL server provisioning. Copyright @ 2023 Oracle and/or its affiliates. 19
  22. MySQL InnoDB Clone Plugin (2) Copyright @ 2023 Oracle and/or

    its affiliates. MySQL> CLONE LOCAL DATA DIRECTORY = '/path/to/clone_dir'; MySQL> CLONE INSTANCE FROM 'user'@'db-ubuntu.summit:3306 IDENTIFIED BY 'password'; 20
  23. New Redo Log Architecture MySQL 8.0 has a new Redo

    Log Architecture which permits to resize the InnoDB Redo Logs online by changing the value of innodb_redo_log_capacity. Overview of the changes: redo logs are now on a dedicated directory: #innodb_redo 32 les (innodb_redo_log_capacity / 32) innodb_log_ les_in_group and innodb_log_ le_size are now deprecated and ignored Copyright @ 2023 Oracle and/or its affiliates. 21
  24. New Redo Log Architecture MySQL 8.0 has a new Redo

    Log Architecture which permits to resize the InnoDB Redo Logs online by changing the value of innodb_redo_log_capacity. Overview of the changes: redo logs are now on a dedicated directory: #innodb_redo 32 les (innodb_redo_log_capacity / 32) innodb_log_ les_in_group and innodb_log_ le_size are now deprecated and ignored Copyright @ 2023 Oracle and/or its affiliates. MySQL > SELECT format_bytes(@@innodb_redo_log_capacity); +------------------------------------------+ | format_bytes(@@innodb_redo_log_capacity) | +------------------------------------------+ | 100.00 MiB | +------------------------------------------+ MySQL > SET GLOBAL innodb_redo_log_capacity=622*1024*1024; MySQL > SELECT format_bytes(@@innodb_redo_log_capacity); +------------------------------------------+ | format_bytes(@@innodb_redo_log_capacity) | +------------------------------------------+ | 622.00 MiB | +------------------------------------------+ 21
  25. InnoDB GIPK Mode MySQL 8.0 supports generated invisible primary keys

    when running in GIPK mode ! GIPK mode is controlled by the sql_generate_invisible_primary_key server system variable. Copyright @ 2023 Oracle and/or its affiliates. 22
  26. InnoDB GIPK Mode MySQL 8.0 supports generated invisible primary keys

    when running in GIPK mode ! GIPK mode is controlled by the sql_generate_invisible_primary_key server system variable. When MySQL is running in GIPK mode, a primary key is added to a table by the server, the column and key name is always my_row_id. Copyright @ 2023 Oracle and/or its affiliates. 22
  27. InnoDB GIPK Mode MySQL 8.0 supports generated invisible primary keys

    when running in GIPK mode ! GIPK mode is controlled by the sql_generate_invisible_primary_key server system variable. When MySQL is running in GIPK mode, a primary key is added to a table by the server, the column and key name is always my_row_id. This is excellent for replication ! Copyright @ 2023 Oracle and/or its affiliates. 22
  28. InnoDB GIPK mode - example MySQL MySQL > > SELECT

    SELECT @ @@sql_generate_invisible_primary_key @sql_generate_invisible_primary_key; ; + +--------------------------------------+ --------------------------------------+ | | @ @@sql_generate_invisible_primary_key @sql_generate_invisible_primary_key | | + +--------------------------------------+ --------------------------------------+ | | 1 1 | | + +--------------------------------------+ --------------------------------------+ MySQL MySQL > > CREATE CREATE TABLE TABLE ubuntu_summit ubuntu_summit ( (name name varchar varchar( (20 20) ), , beers beers int int unsigned unsigned) ); ; MySQL MySQL > > INSERT INSERT INTO INTO ubuntu_summit ubuntu_summit VALUES VALUES ( ('kenny' 'kenny', , 0 0) ), , ( ('lefred' 'lefred', ,1 1) ); ; MySQL MySQL > > SELECT SELECT * * FROM FROM ubuntu_summit ubuntu_summit; ; + +--------+-------+ --------+-------+ | | name name | | beers beers | | + +--------+-------+ --------+-------+ | | kenny kenny | | 0 0 | | | | lefred lefred | | 1 1 | | + +---------+------+ ---------+------+ Copyright @ 2023 Oracle and/or its affiliates. 23
  29. InnoDB GIPK mode - example (2) MySQL MySQL > >

    SHOW SHOW CREATE CREATE TABLE TABLE ubuntu_summit\G ubuntu_summit\G * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 1. 1. row row * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Table Table: ubuntu_summit : ubuntu_summit Create Create Table Table: : CREATE CREATE TABLE TABLE ` `ubuntu_summit ubuntu_summit` ` ( ( ` `my_row_id my_row_id` ` bigint bigint unsigned unsigned NOT NOT NULL NULL AUTO_INCREMENT AUTO_INCREMENT /*!80023 INVISIBLE */ /*!80023 INVISIBLE */, , ` `name name` ` varchar varchar( (20 20) ) DEFAULT DEFAULT NULL NULL, , ` `beers beers` ` int int unsigned unsigned DEFAULT DEFAULT NULL NULL, , PRIMARY PRIMARY KEY KEY ( (` `my_row_id my_row_id` `) ) ) ) ENGINE ENGINE= =InnoDB InnoDB AUTO_INCREMENT AUTO_INCREMENT= =3 3 DEFAULT DEFAULT CHARSET CHARSET= =utf8mb4 utf8mb4 COLLATE COLLATE= =utf8mb4_0900_ai_ci utf8mb4_0900_ai_ci Copyright @ 2023 Oracle and/or its affiliates. 24
  30. InnoDB GIPK mode - example (2) MySQL MySQL > >

    SHOW SHOW CREATE CREATE TABLE TABLE ubuntu_summit\G ubuntu_summit\G * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 1. 1. row row * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Table Table: ubuntu_summit : ubuntu_summit Create Create Table Table: : CREATE CREATE TABLE TABLE ` `ubuntu_summit ubuntu_summit` ` ( ( ` `my_row_id my_row_id` ` bigint bigint unsigned unsigned NOT NOT NULL NULL AUTO_INCREMENT AUTO_INCREMENT /*!80023 INVISIBLE */ /*!80023 INVISIBLE */, , ` `name name` ` varchar varchar( (20 20) ) DEFAULT DEFAULT NULL NULL, , ` `beers beers` ` int int unsigned unsigned DEFAULT DEFAULT NULL NULL, , PRIMARY PRIMARY KEY KEY ( (` `my_row_id my_row_id` `) ) ) ) ENGINE ENGINE= =InnoDB InnoDB AUTO_INCREMENT AUTO_INCREMENT= =3 3 DEFAULT DEFAULT CHARSET CHARSET= =utf8mb4 utf8mb4 COLLATE COLLATE= =utf8mb4_0900_ai_ci utf8mb4_0900_ai_ci MySQL MySQL > > SELECT SELECT * *, , my_row_id my_row_id FROM FROM ubuntu_summit ubuntu_summit; ; + +--------+-------+-----------+ --------+-------+-----------+ | | name name | | beers beers | | my_row_id my_row_id | | + +--------+-------+-----------+ --------+-------+-----------+ | | kenny kenny | | 0 0 | | 1 1 | | | | lefred lefred | | 1 1 | | 2 2 | | + +--------+-------+-----------+ --------+-------+-----------+ Copyright @ 2023 Oracle and/or its affiliates. 24
  31. InnoDB GIPK mode - example (3) It's also possible to

    hide it completely (for some legacy application that could rely on informantion_schema and SHOW CREATE TABLE): MySQL MySQL > > SET SET show_gipk_in_create_table_and_information_schema show_gipk_in_create_table_and_information_schema = = 0 0; ; MySQL MySQL > > SHOW SHOW CREATE CREATE TABLE TABLE ubuntu_summit\G ubuntu_summit\G * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * 1. 1. row row * ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** * Table Table: ubuntu_summit : ubuntu_summit Create Create Table Table: : CREATE CREATE TABLE TABLE ` `ubuntu_summit ubuntu_summit` ` ( ( ` `name name` ` varchar varchar( (20 20) ) DEFAULT DEFAULT NULL NULL, , ` `beers beers` ` int int unsigned unsigned DEFAULT DEFAULT NULL NULL ) ) ENGINE ENGINE= =InnoDB InnoDB DEFAULT DEFAULT CHARSET CHARSET= =utf8mb4 utf8mb4 COLLATE COLLATE= =utf8mb4_0900_ai_ci utf8mb4_0900_ai_ci Copyright @ 2023 Oracle and/or its affiliates. 25
  32. MySQL Architectures Nerver been so easy to deploy ! Copyright

    @ 2023 Oracle and/or its affiliates. 26
  33. MySQL InnoDB Cluster Based on Group Replication Automatic Failover Fully

    Managed by MySQL Shell Integrated with MySQL Router Automatic Data Provisioning (CLONE) RPO = 0 & RTO = seconds MySQL InnoDB ClusterSet Based on Asynchronous Replication Automatic Data Provisioning (CLONE) Disaster Recovery (region failure) RPO != 0 & RTO = minutes (manual) No write performance impact due to region latency Copyright @ 2023 Oracle and/or its affiliates. 27
  34. JS JS> > cluster1 cluster1= =dba dba. .createClutser createClutser( ('ubuntu-cluster-riga'

    'ubuntu-cluster-riga') ) JS JS> > cluster1 cluster1. .addInstance addInstance( ('admin@db-ubuntu-riga-2' 'admin@db-ubuntu-riga-2') ) JS JS> > cluster1 cluster1. .addInstance addInstance( ('admin@db-ubuntu-riga-3' 'admin@db-ubuntu-riga-3') ) JS JS> > clusterset clusterset= =cluster cluster. .createClusterSet createClusterSet( ('ubuntu-domain' 'ubuntu-domain') ) JS JS> > cluster2 cluster2= =clusterset clusterset. .createReplicaCluster createReplicaCluster( ('admin@db-ubuntu-bxl-1' 'admin@db-ubuntu-bxl-1', , 'ubuntu-cluster-brussels' 'ubuntu-cluster-brussels') ) JS JS> > cluster2 cluster2. .addInstance addInstance( ('admin@db-ubuntu-bxl-2' 'admin@db-ubuntu-bxl-2') ) JS JS> > cluster2 cluster2. .addInstance addInstance( ('admin@db-ubuntu-bxl-3' 'admin@db-ubuntu-bxl-3') ) JS JS> > cluster1 cluster1. .addReplicaInstance addReplicaInstance( ('admin@db-ubuntu-riga-4' 'admin@db-ubuntu-riga-4') ) JS JS> > cluster1 cluster1. .addReplicaInstance addReplicaInstance( ('admin@db-ubuntu-riga-5' 'admin@db-ubuntu-riga-5') ) JS JS> > cluster1 cluster1. .addReplicaInstance addReplicaInstance( ('admin@db-ubuntu-riga-6' 'admin@db-ubuntu-riga-6') ) JS JS> > cluster2 cluster2. .addReplicaInstance addReplicaInstance( ('admin@db-ubuntu-bxl-3' 'admin@db-ubuntu-bxl-3') ) JS JS> > cluster2 cluster2. .addReplicaInstance addReplicaInstance( ('admin@db-ubuntu-bxl-4' 'admin@db-ubuntu-bxl-4') ) JS JS> > cluster2 cluster2. .addReplicaInstance addReplicaInstance( ('admin@db-ubuntu-bxl-5' 'admin@db-ubuntu-bxl-5') ) Copyright @ 2023 Oracle and/or its affiliates. 28
  35. New routing policy with transparent read/write spli ing: [routing:bootstrap_rw_split] bind_address=0.0.0.0

    bind_port=6450 destinations= metadata-cache://myClusterSet/?role=PRIMARY_AND_SECONDARY routing_strategy=round-robin protocol=classic connection_sharing=1 client_ssl_mode=PREFERRED server_ssl_mode=PREFERRED access_mode=auto MySQL Router 8.2.0: Read / Write Spli ing Copyright @ 2023 Oracle and/or its affiliates. 30
  36. Visual Duality Editor WYSIWYG editor for unmatched usability Auto-Analysis of

    database schemas Build complex JSON structures with a few clicks SDK interface preview SDK API Generation Tailored SDK for your RESTful Endpoints Popular, Prisma-like API Live SDK runtime support Authentication support built in Advanced Duality Features Support for OracleDB features New @reduce_to feature Read & write support Import and Export of MRS schema MySQL REST Service (MRS) Use MRS to design your RESTful Web Services to return JSON documents from a simple relational schema object or compose powerful, nested JSON structures from your database schema model with a few clicks. Copyright @ 2023 Oracle and/or its affiliates. 32
  37. MRS Easy to deploy using MySQL Shell for Visual Studio

    Code. Copyright @ 2023 Oracle and/or its affiliates. 33
  38. If you plan to use MySQL as a service in

    the Cloud... Copyright @ 2023 Oracle and/or its affiliates. 40
  39. sponsor MySQL Community Edition by deploying in OCI ! Copyright

    @ 2023 Oracle and/or its affiliates. 41
  40. Share your ❤ to MySQL #mysql #MySQLCommunity Join our slack

    channel! bit.ly/mysql-slack Copyright @ 2023 Oracle and/or its affiliates. 42
  41. Questions ? Catch me during the conference if you are

    interested in a demo of anything like MySQL Document Store or any High Availability architectures, ... Copyright @ 2023 Oracle and/or its affiliates. 43