SlideShare a Scribd company logo
Features
For DevelopersDave Stokes
MySQL Community Manager
David.Stokes@Oracle.com @Stoker
Slides -> https://slideshare.net/davidmstokes
Blog -> https://elephantdolphin.blogspot.com
Safe Harbor Agreement
THE FOLLOWING IS INTENDED TO OUTLINE OUR GENERAL PRODUCT
DIRECTION. IT IS INTENDED FOR INFORMATION PURPOSES 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 UPON IN MAKING PURCHASING DECISIONS. THE DEVELOPMENT,
RELEASE, AND TIMING OF ANY FEATURES OR FUNCTIONALITY DESCRIBED
FOR ORACLE'S PRODUCTS REMAINS AT THE SOLE DISCRETION OF ORACLE.
2
Community
Edition!!
3
MySQL News
● 24 years old! Oracle owned for nine years!
● MySQL 8.0 is the current Generally Available release
● Document Store
● Group Replication
● We’re Hiring
4
Thank You!
5
MySQL 8?
What happened to
MySQL 6 and MySQL 7??
6
Well..
● Previous GA is 5.7 (October 2015)
● MySQL Cluster is 7.6.11 (8.0.17 release candidate available)
● There was a MySQL 6 in the pre-Sun days, kinda like the PHP version six
that nobody really talks about except in hushed tones and with great
sadness
Engineering thought the new data dictionary and other new features
justified the new major release number.
7
1.Data Dictionary
Before MySQL 8 -- Meta Data Stored in files!
You have had a plethora of files out there --
.FRM .MYD .MYI .OPT and many more just
waiting for something to go bad -- now store
relevant information in data dictionary!
This means you are no longer dependent in the
number of inodes on your system, somebody
rm-ing the files at just the wrong time, and a
whole host of other problems.
Innodb is robust enough to rebuild all
information to a point in time in case of
problems. So keep EVERYTHING in internal
data structures. And that leads to transactional
ALTER TABLE commands.
8
System Tables are now InnoDB
Previously, these were MyISAM (non transactional) tables. This change applies
to these tables: user, db, tables_priv, columns_priv, procs_priv, proxies_priv.
9
Good News!?
So now you can have
millions of tables
within a schema.
The bad news is
that you can have
millions of tables
within a schema.
10
2.CTEs & Windowing Functions
Long requested, Common Table Expression and Windowing Functions have a
wide variety of uses.
● CTEs are handy subquery-like statements often used in quick
calculations
● Windowing Functions are great for iterating over a selected set of rows
for things like statistical calculations
11
Windowing
Function
The key word is
OVER
SELECT name,
department_id,
salary,
SUM(salary)
OVER
(PARTITION BY
department_id) AS
department_total
FROM employee
ORDER BY department_id, name 12
Another
Example
Windowing
functions are great
when dealing with
dates
SELECT date, amount,
sum(amount)
OVER w AS ‘sum’
FROM payments
WINDOW w AS
(ORDER BY date
RANGE BETWEEN INTERVAL 1
WEEK PRECEDING AND
CURRENT ROW)
ORDER BY date;
13
CTEs
..are like derived
tables but the
declaration is
BEFORE the query
WITH qn AS (SELECT
t1 FROM mytable)
SELECT * FROM qn.
14
JOINing two CTEs 15
WITH
cte1 AS (SELECT a, b FROM table1),
cte2 AS (SELECT c, d FROM table2)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;
Common
Table
Expression -
recursive
+------+
| n |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+------+
10 rows in set (0,00 sec)
WITH RECURSIVE my_cte AS
(
SELECT 1 AS n
UNION ALL
SELECT 1+n FROM my_cte
WHERE n<10
)
SELECT * FROM my_cte;
16
Lateral Derived
Tables
SELECT Name,
Population,
District,
x.cc
FROM city,
LATERAL (SELECT Code AS cc
FROM country
WHERE
city.CountryCode = Code) AS x
WHERE District = 'Texas'
ORDER BY name;
17
Easier to write sub queries!
3. Optimizer & Parser
● Descending indexes
● Optimizer trace output now includes more information about filesort operations, such as key and
payload size and why addon fields are not packed.
● The optimizer now supports hints that enable specifying the order in which to join tables.
● New sys variable to include estimates for delete marked records includes delete marked records in
calculation of table and index statistics. This work was done to overcome a problem with "wrong"
statistics where an uncommitted transaction has deleted all rows in the table.
● Index and Join Order Hints -- User controls order
● NOWAIT and SKIPPED LOCKED to bypass locked records
18
EXPLAIN FORMAT=JSON <query>
19
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "443.80"
},
"table": {
"table_name": "city",
"access_type": "ALL",
"rows_examined_per_scan": 4188,
"rows_produced_per_join": 418,
"filtered": "10.00",
"cost_info": {
"read_cost": "401.92",
"eval_cost": "41.88",
"prefix_cost": "443.80",
"data_read_per_join": "29K"
},
"used_columns": [
"ID",
"Name",
"CountryCode",
"District",
"Population"
],
"attached_condition": "(`world`.`city`.`Name` = 'Dallas')"
}
}
}
How SKIP LOCKED or NOWAIT look
START TRANSACTION;
SELECT * FROM seats WHERE seat_rows.row_no BETWEEN 2 AND 3 AND booked = 'NO'
FOR UPDATE SKIP LOCKED;
...
COMMIT;
START TRANSACTION
SELECT seat_no
FROM seats JOIN seat_rows USING ( row_no )
WHERE seat_no IN (3,4) AND seat_rows.row_no IN (12)
AND booked = 'NO'
FOR UPDATE OF seats SKIP LOCKED
FOR SHARE OF seat_rows NOWAIT;
20
Contention-Aware Transaction Scheduling
CATS
The CATS algorithm is based on a simple intuition:
not all transactions are equal, and not all objects
are equal. When a transaction already has a lock
on many popular objects, it should get priority
when it requests a new lock. In other words,
unblocking such a transaction will indirectly
contribute to unblocking many more transactions
in the system, which means higher throughput and
lower latency overall.
21
Multi Valued Index
Getting past the 1:1 Index Ratio
22
SELECT _id, data->>"$.nbr"
FROM a1
WHERE 99999 MEMBER OF (data->"$.nbr");
Very useful in cases where you
multiple phone numbers, postal codes,
part numbers within an JSON array!
4. Roles
MySQL now supports roles, which are named collections of
privileges. Roles can be created and dropped. Roles can
have privileges granted to and revoked from them. Roles
can be granted to and revoked from user accounts. The
active applicable roles for an account can be selected
from among those granted to the account, and can be
changed during sessions for that account.
Set up and account for a certain function and then assign
users who need that function.
23
5. Character Sets
MySQL 8
IS by default
UTF8MB4! 24
Not all UTf8 equal
utf8mb4_0900_ai_ci:
0900 refers to Unicode
Collation Algorithm version.
- ai refers to accent
insensitive.
- ci refers to case
insensitive.
Previously UTF8 was actually UTF8MB3
● 3 bytes, no emojis
● Supplementary multilingual plane
support limited
● No CJK Unified Ideographs Extension
B are in supplementary ideographic
plane
Upgrade problem expected!
Also supports GB18030 character set!
25
26
6. Invisible Indexes
An invisible index is not used by the optimizer at all, but is
otherwise maintained normally. Indexes are visible by
default. Invisible indexes make it possible to test the effect
of removing an index on query performance, without
making a destructive change that must be undone should
the index turn out to be required
27
Setting/Unsetting Invisible Indexes
ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;
ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;
28
Functional Indexes
CREATE TABLE t1 (
col1 INT, col2 INT,
INDEX func_index ((ABS(col1)))
);
CREATE INDEX idx1 ON t1 ((col1 + col2));
ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC);
29
7. SET PERSIST
mysql> SET PERSIST innodb_buffer_pool_size = 512 * 1024 * 1024;
Query OK, 0 rows affected (0.01 sec)
30
Why SET PERSIST (pronounced Docker)
A MySQL server can be configured and
managed over a SQL connection thus
removing manual file operations (on
configuration files) to be done by
DBAs. This feature addresses the
usability issues described above, and
allows MySQL to be more easily
deployed and configured on cloud
platforms.
The file mysqld-auto.cnf is created
the first time a SET PERSIST
statement is executed. Further SET
PERSIST statement executions will
append the contents to this file. This
file is in JSON format and can be
parsed using json parser.
Timestamp & User recorded
31
Other new
features not
dependant on
server GA
Decoupling features like Group
Replication and Document Store
from release cycle to make
updates easier
● Add new features via a plug-in
● Make upgrades less onerous
● Easier management of featuresYes, we know that servers
can be hard to manage and
get harder when they are in
the cloud and out of reach
of ‘percussive maintenance’
techniques.
32
8. 3G Geometry
“GIS is a form of digital mapping technology.
Kind of like Google Earth but better.”
-- Arnold Schwarzenegger
Governor of California
33
8. 3D Geometry
● World can now be flat or ellipsoidal
● Coordinate system wrap around
● Boot.Geometry & Open GID
● Code related to geometry parsing, computing bounding boxes
and operations on them, from the InnoDB layer to the
Server layer so that geographic R-trees can be supported
easily in the future without having to change anything in
InnoDB
34
9. JSON -- A big change in Databases
We can use a JSON field to eliminate one of the issues of traditional database
solutions: many-to-many-joins
This allows more freedom to store unstructured data (data with pieces missing)
You still use SQL to work with the data via a database connector but the JSON
documents in the table can be manipulated directly in code.
Joins can be expensive. Reducing how many places you need to join data can help
speed up your queries. Removing joins may result in some level of denormalization
but can result in fast access to the data. 35
Plan for Mutability
Schemaless designs are focused on mutability. Build your
applications with the ability to modify the document as
needed (and within reason)
36
Remove Many-to-Many Relationships
● Use embedded arrays and lists to store relationships among documents.
This can be as simple as embedding the data in the document or
embedding an array of document ids in the document.
● In the first case data is available as soon as you can read the document
and in the second it only takes one additional step to retrieve the data. In
cases of seldom read (used) relationships, having the data linked with an
array of ids can be more efficient (less data to read on the first pass)
37
->> Operator
MySQL 8 adds a new unquoting extraction operator ->>, sometimes also referred to as
an inline path operator, for use with JSON documents stored in MySQL. The new
operator is similar to the -> operator, but performs JSON unquoting of the value as
well.
The following three expressions are equivalent:
● JSON_UNQUOTE( JSON_EXTRACT(mycol, "$.mypath") )
● JSON_UNQUOTE(mycol->"$.mypath")
● mycol->>"$.mypath"
Can be used with (but is not limited to) SELECT lists, WHERE and HAVING clauses,
and ORDER BY and GROUP BY clauses. 38
JSON_PRETTY
mysql> SELECT JSON_PRETTY(doc) FROM countryinfo LIMIT 1;
{
"GNP": 828,
"_id": "ABW",
"Name": "Aruba",
"IndepYear": null,
"geography": {
"Region": "Caribbean",
"Continent": "North America",
"SurfaceArea": 193
},
"government": {
"HeadOfState": "Beatrix",
"GovernmentForm": "Nonmetropolitan Territory of The Netherlands"
},
"demographics": {
"Population": 103000,
"LifeExpectancy": 78.4000015258789
}
}
39
JSON_ARRAYAGG
mysql> SELECT col FROM t1;
+--------------------------------------+
| col |
+--------------------------------------+
| {"key1": "value1", "key2": "value2"} |
| {"keyA": "valueA", "keyB": "valueB"} |
+--------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT JSON_ARRAYAGG(col) FROM t1;
+------------------------------------------------------------------------------+
| JSON_ARRAYAGG(col) |
+------------------------------------------------------------------------------+
| [{"key1": "value1", "key2": "value2"}, {"keyA": "valueA", "keyB": "valueB"}] |
+------------------------------------------------------------------------------+ 40
JSON_OBJECTAGG()
mysql> SELECT id, col FROM t1;
+------+--------------------------------------+
| id | col |
+------+--------------------------------------+
| 1 | {"key1": "value1", "key2": "value2"} |
| 2 | {"keyA": "valueA", "keyB": "valueB"} |
+------+--------------------------------------+
2 rows in set (0.00 sec)
mysql> SELECT JSON_OBJECTAGG(id, col) FROM t1;
+----------------------------------------------------------------------------------------+
| JSON_OBJECTAGG(id, col) |
+----------------------------------------------------------------------------------------+
| {"1": {"key1": "value1", "key2": "value2"}, "2": {"keyA": "valueA", "keyB": "valueB"}} |
+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
41
Both JSON_ARRAY_AGG and
JSON_OBJECTAGG() work with
both JSON and non JSON
COLUMNS!
JSON_TABLE - Structure your unstructured data
mysql> select country_name, IndyYear
from countryinfo,
json_table(doc,"$" columns (
country_name char(20) path "$.Name",
IndyYear int path "$.IndepYear")
) as stuff
where IndyYear > 1992;
+----------------+----------+
| country_name | IndyYear |
+----------------+----------+
| Czech Republic | 1993 |
| Eritrea | 1993 |
| Palau | 1994 |
| Slovakia | 1993 |
+----------------+----------+ 43
JSON_TABLE is used for
making JSON data a temporary
relational data, which is
especially useful when creating
relational views over JSON data,
JSON Table -- a Deeper Look 44
mysql> select aaaa.name, aaaa.ordinal, aaaa.Grading
FROM restaurants,
json_table(doc, "$" COLUMNS(
name char(50) path "$.name",
style varchar(50) path "$.cuisine",
NESTED PATH '$.grades[*]'
COLUMNS (
ordinal FOR ORDINALITY,
Grading char(10) path "$.grade",
Score INT path "$.score"))
)
as aaaa limit 5;
+--------------------------------+---------+---------+
| name | ordinal | Grading |
+--------------------------------+---------+---------+
| Morris Park Bake Shop | 1 | A |
| Morris Park Bake Shop | 2 | A |
| Morris Park Bake Shop | 3 | A |
| Morris Park Bake Shop | 4 | A |
| Morris Park Bake Shop | 5 | B |
Validating a JSON Document - thanks JSON-schema.org 45
CREATE TABLE `testx` (
`col` JSON,
CONSTRAINT `myage_inRange`
CHECK (JSON_SCHEMA_VALID('{"type": "object",
"properties": {
"myage": {
"type" : "number",
"minimum": 28,
"maximum": 99
}
},"required": ["myage"]
}', `col`) = 1)
);
46
select JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@s,@d))G
*************************** 1. row ***************************
JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@s,@d)): {
"valid": false,
"reason": "The JSON document location '#/myage' failed requirement 'minimum' at JSON Schema location
'#/properties/myage'",
"schema-location": "#/properties/myage",
"document-location": "#/myage",
"schema-failed-keyword": "minimum"
}
MySQL Document Store
Relational databases such as MySQL usually required a document schema to
be defined before documents can be stored.
A new plug-in enables you to use MySQL as a document store, which is a
schema-less, and therefore schema-flexible, storage system for documents.
When using MySQL as a document store, to create documents describing
products you do not need to know and define all possible attributes of any
products before storing them and operating with them.
47
MySQL Document Store
This differs from working with a relational database and storing products in a
table, when all columns of the table must be known and defined before adding
any products to the database.
This allows you to choose how you configure MySQL, using only the document
store model, or combining the flexibility of the document store model with the
power of the relational model.
48
Using the MySQL Document Store with the X DevAPI PECL Extension 49
#!/usr/bin/php
<?PHP
// Connection parameters
$user = 'root'; $passwd = 'hidave'; $host = 'localhost'; $port = '33060';
$connection_uri = 'mysqlx://'.$user.':'.$passwd.'@'.$host.':'.$port;
// Connect as a Node Session
$nodeSession = mysql_xdevapigetNodeSession($connection_uri);
// "USE world_x"
$schema = $nodeSession->getSchema("world_x");
// Specify collection to use
$collection = $schema->getCollection("countryinfo");
// Query the Document Store
$result = $collection->find('_id = "USA"')->fields(['Name as
Country','geography as Geo','geography.Region'])->execute();
// Fetch/Display data
$data = $result->fetchAll();
var_dump($data);
?>
Python in the new MySQL Shell 50
mysql-py> db.countryinfo.find("GNP > 5000000").fields(["GNP",
"Name"])
[
{
"GNP": 8510700,
"Name": "United States"
}
]
1 document in set (0.00 sec)
10. Resource Groups
Groups can be established so that threads execute according to the resources available to the group. Group attributes enable control
over its resources, to enable MySQL supports creation and management of resource groups, and permits assigning threads running
within the server to particular group or restrict resource consumption by threads in the group. DBAs can modify these attributes as
appropriate for different workloads.
For example, to manage execution of batch jobs that need not execute with high priority, a DBA can create a Batch resource group,
and adjust its priority up or down depending on how busy the server is. (Perhaps batch jobs assigned to the group should run at lower
priority during the day and at higher priority during the night.) The DBA can also adjust the set of CPUs available to the group.
CREATE RESOURCE GROUP Batch
TYPE = USER
VCPU = 2-3 -- assumes a system with at least 4 CPUs
THREAD_PRIORITY = 10;
INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2);
51
11. Histograms - Indexing without indexes!
A histogram is an approximation of the data distribution for a column. It can tell you with a reasonably accuray whether your data is skewed
or not, which in turn will help the database server understand the nature of data it contains.
Histograms comes in many different flavours, and in MySQL we have chosen to support two different types: The “singleton” histogram and
the “equi-height” histogram. Common for all histogram types is that they split the data set into a set of “buckets”, and MySQL automatically
divides the values into buckets, and will also automatically decide what type of histogram to create.
Note that the number of buckets must be specified, and can be in the range from 1 to 1024. How many buckets you should choose for your
data set depends on several factors; how many distinct values do you have, how skewed is your data set, how high accuracy do you need
etc. However, after a certain amount of buckets the increased accuracy is rather low. So we suggest to start at a lower number such as 32,
and increase it if you see that it doesn’t fit your needs.
52
Histograms
mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_mktsegment WITH 1024 BUCKETS;
+---------------+-----------+----------+---------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+---------------+-----------+----------+---------------------------------------------------------+
| dbt3.customer | histogram | status | Histogram statistics created for column 'c_mktsegment'. |
+---------------+-----------+----------+---------------------------------------------------------+
53
Two reasons for why you might consider a
histogram instead of an index
Maintaining an index has a cost. If you have an index, every
INSERT/UPDATE/DELETE causes the index to be updated.
This is not free, and will have an impact on your
performance.
A histogram on the other hand is created once and never
updated unless you explicitly ask for it.
It will thus not hurt your INSERT/UPDATE/DELETE-
performance.
54
If you have an index, the optimizer will do what we call
“index dives” to estimate the number of records in a given
range.
This also has a certain cost, and it might become too costly
if you have for instance very long IN-lists in your query.
Histogram statistics are much cheaper in this case, and
might thus be more suitable.
12. Bye Bye MEMORY Storage Engine
The TempTable storage engine replaces the MEMORY storage engine as the
default engine for in-memory internal temporary tables. The TempTable
storage engine provides efficient storage for VARCHAR and VARBINARY
columns.
Performance is ten times better than 5.7!!
55
https://stackoverflow.com/questions/5050
5236/mysql-8-0-group-by-performance
5down vote
MySQL 8.0 uses a new storage engine, TempTable, for internal temporary tables. (See MySQL Manual for details.) This
engine does not have a max memory limit per table, but a common memory pool for all internal tables. It also has its own
overflow to disk mechanism, and does not overflow to InnoDB or MyISAM as earlier versions.
The profile for 5.7 contains "converting HEAP to ondisk". This means that the table reached the max table size for the
MEMORY engine (default 16 MB) and the data is transferred to InnoDB. Most of the time after that is spent accessing the
temporary table in InnoDB. In MySQL 8.0, the default size of the memory pool for temporary tables is 1 GB, so there will
probably not be any overflow to disk in that case.
56
13. X DevAPI on by default on port 33060
MySQL Document Store allows developers to work
with SQL relational tables and schema-less JSON
collections.
To make that possible MySQL has created the X Dev
API which puts a strong focus on CRUD by providing a
fluent API allowing you to work with JSON documents
in a natural way.
The X Protocol is a highly extensible and is optimized
for CRUD as well as SQL API operations.
57
SQL + NoSQL
Schema-less NoSQL
JSON Document Store
with ACID compliance.
And you can also access
relational data!
58
1GB documents
versus
Mongo’s 16MB!
Using MySQL without SQL!
$nodeSession =
mysql_xdevapigetNodeSession($connection_uri);
$schema = $nodeSession->getSchema("world_x");
$collection = $schema->getCollection("countryinfo");
$result = $collection->find('_id = "USA"')-
>execute();
$data = $result->fetchAll();
var_dump($data);
59
The 10 Best Restaurants of Different Cuisines
WITH cte1 AS (SELECT doc->>"$.name" AS name,
doc->>"$.cuisine" AS cuisine,
(SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]"
COLUMNS (score INT PATH "$.score")) AS r) AS
avg_score
FROM restaurants)
SELECT *, RANK()
OVER (PARTITION BY cuisine ORDER BY avg_score DESC) AS `rank`
FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;
+-----------------------+--------------------------------+-----------+------+
| name | cuisine | avg_score | rank |
+-----------------------+--------------------------------+-----------+------+
| Juice It Health Bar | Juice, Smoothies, Fruit Salads | 75.0000 | 1 |
| Golden Dragon Cuisine | Chinese | 73.0000 | 1 |
| Palombo Pastry Shop | Bakery | 69.0000 | 1 |
| Go Go Curry | Japanese | 65.0000 | 1 |
| K & D Internet Inc | Café/Coffee/Tea | 61.0000 | 1 |
| Koyla | Middle Eastern | 61.0000 | 1 |
| Ivory D O S Inc | Other | 60.0000 | 1 |
| Espace | American | 56.0000 | 1 |
| Rose Pizza | Pizza | 52.0000 | 1 |
| Tacos Al Suadero | Mexican | 52.0000 | 1 |
+-----------------------+--------------------------------+-----------+------+
60
This query uses
JSON_TABLE to
structure the schema-less
data within a CTE and
then the CTE is queried
to get the top 10
restaurants with a
Windowing Function
The 10 Best Restaurants of Different Cuisines
The JSON_TABLE, CTE, and Windowing Function 61
This query uses
JSON_TABLE to
structure the
schema-less data
within a CTE and
then the CTE is
queried to get the top
10 restaurants with a
Windowing
Function
WITH cte1 AS (SELECT doc->>"$.name" AS name,
doc->>"$.cuisine" AS cuisine,
(SELECT AVG(score) FROM
JSON_TABLE(doc, "$.grades[*]"
COLUMNS (score INT PATH "$.score")) AS r)
AS avg_score FROM restaurants)
SELECT *, RANK()
OVER (PARTITION BY cuisine
ORDER BY avg_score DESC) AS `rank`
FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;
62
New Features 2019
8.0.16 - April 63
1.The mysql_upgrade script runs automatically
2.Constraint checks
3.MySQL C API supports asynchronous, non blocking communications with server
4.EXPLAIN FORMAT=TREE
8.0.14/15 - January/February 64
1.Dual Passwords
2.Admin TCP/IP port (default 33062),
no limit on number of connections,
requires SERVICE_CONNETION_ADMIN priviledge
3.JSON_ARRAYAGG() and JSON_OBJECTAGG() added to Window Functions
4.SET PERSIST and SET PERSIST ONLY
5.LATERAL derived tables
8.0.18 - October 65
1.Multi-valued indexes
2.JSON Document Validation
3.Dual Password
4.Clone Table Space for Replication
5.New utf8mb4_900_bin (faster storts), no pad attribute
8.0.17 - July 66
1.Random Passwords – CREATE USER, ALTER
USER, and SET PASSWORD
2.EXPLAIN ANALYSE
3.HASH JOINS
4.Compression –
added ztsd (uncompresses or zlib other options)
5.Enterprise Edition supports HashCorp Vault
Download Today
https://dev.mysql.com/downloads/mysql/
Or Docker images -> https://hub.docker.com/_/mysql/
67
The Unofficial MySQL 8 Optimizer Guide
68
http://www.unofficialmysqlguide.com/
Server Architecture
B+tree indexes
Explain
Optimizer Trace
Logical Transformations
Example Transformations
Cost-based Optimization
Hints
Comparing Plans
Composite Indexes
Covering Indexes
Visual Explain
Transient Plans
Subqueries
CTEs and Views
Joins
Aggregation
Sorting
Partitioning
Query Rewrite
Invisible Indexes
Profiling Queries
JSON and Generated Columns
Character Sets
Whew!
More features being added!
69
MySQL
Group
Replication
MySQL 5.7 or later
70
MySQL Group Replication is a MySQL Server plugin that enables you to create
elastic, highly-available, fault-tolerant replication topologies.
There is a built-in group membership service that keeps the view of the group
consistent and available for all servers at any given point in time. Servers can
leave and join the group and the view is updated accordingly. Sometimes servers
can leave the group unexpectedly, in which case the failure detection mechanism
detects this and notifies the group that the view has changed. This is all automatic.
MySQL
Group
Replication
High Availablity
MySQL Cluster
71
High Availablity MySQL Cluster Multi Primary Mode 72
New MySQL Shell
73
The new MySQL Shell has three modes - JavaScript, Python, & SQL
plus admin tools -- check for upgrades, JSON bulk loader, InnoDB Cluster
admin
Buy My Book (please!)
74
What you need
to know to use
the MySQL
JSON data type
with lots of
examples!
Thanks!
Contact me:
@stoker
david.stokes@oracle.com
slideshare.net/davidmstokes
Elephantdolphin.blogspot.com
75
76
WITH cte1 AS (SELECT doc->>"$.name" AS name,
doc->>"$.cuisine" AS cuisine,
(SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]"
COLUMNS (score INT PATH "$.score")) AS r) AS avg_score
FROM restaurants)
SELECT *, RANK()
OVER (PARTITION BY cuisine ORDER BY avg_score DESC) AS `rank`
FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;
+-----------------------+--------------------------------+-----------+------+
| name | cuisine | avg_score | rank |
+-----------------------+--------------------------------+-----------+------+
| Juice It Health Bar | Juice, Smoothies, Fruit Salads | 75.0000 | 1 |
| Golden Dragon Cuisine | Chinese | 73.0000 | 1 |
| Palombo Pastry Shop | Bakery | 69.0000 | 1 |
| Go Go Curry | Japanese | 65.0000 | 1 |
| K & D Internet Inc | Café/Coffee/Tea | 61.0000 | 1 |
| Koyla | Middle Eastern | 61.0000 | 1 |
| Ivory D O S Inc | Other | 60.0000 | 1 |
| Espace | American | 56.0000 | 1 |
| Rose Pizza | Pizza | 52.0000 | 1 |
| Tacos Al Suadero | Mexican | 52.0000 | 1 |
+-----------------------+--------------------------------+-----------+------+
That query by itself

More Related Content

Similar to MySQL 8 - UKOUG Techfest Brighton December 2nd, 2019

MySQL 8.0 Featured for Developers
MySQL 8.0 Featured for DevelopersMySQL 8.0 Featured for Developers
MySQL 8.0 Featured for Developers
Dave Stokes
 
Upcoming changes in MySQL 5.7
Upcoming changes in MySQL 5.7Upcoming changes in MySQL 5.7
Upcoming changes in MySQL 5.7
Morgan Tocker
 
Developers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgrade
Developers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgradeDevelopers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgrade
Developers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgrade
mCloud
 
Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...
Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...
Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...
Cynthia Saracco
 
2011 Collaborate IOUG Presentation
2011 Collaborate IOUG Presentation2011 Collaborate IOUG Presentation
2011 Collaborate IOUG Presentation
Biju Thomas
 
cPanel now supports MySQL 8.0 - My Top Seven Features
cPanel now supports MySQL 8.0 - My Top Seven FeaturescPanel now supports MySQL 8.0 - My Top Seven Features
cPanel now supports MySQL 8.0 - My Top Seven Features
Dave Stokes
 
MySQL Goes to 8! FOSDEM 2020 Database Track, January 2nd, 2020
MySQL Goes to 8!  FOSDEM 2020 Database Track, January 2nd, 2020MySQL Goes to 8!  FOSDEM 2020 Database Track, January 2nd, 2020
MySQL Goes to 8! FOSDEM 2020 Database Track, January 2nd, 2020Geir Høydalsvik
 
Top 10 tips for Oracle performance
Top 10 tips for Oracle performanceTop 10 tips for Oracle performance
Top 10 tips for Oracle performance
Guy Harrison
 
Mysql 57-upcoming-changes
Mysql 57-upcoming-changesMysql 57-upcoming-changes
Mysql 57-upcoming-changesMorgan Tocker
 
Confoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New FeaturesConfoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New Features
Dave Stokes
 
Using Graphs for Feature Engineering_ Graph Reduce-2.pdf
Using Graphs for Feature Engineering_ Graph Reduce-2.pdfUsing Graphs for Feature Engineering_ Graph Reduce-2.pdf
Using Graphs for Feature Engineering_ Graph Reduce-2.pdf
Wes Madrigal
 
DataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdf
DataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdfDataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdf
DataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdf
Miguel Angel Fajardo
 
Remote DBA Experts 11g Features
Remote DBA Experts 11g FeaturesRemote DBA Experts 11g Features
Remote DBA Experts 11g Features
Remote DBA Experts
 
Oracle Query Optimizer - An Introduction
Oracle Query Optimizer - An IntroductionOracle Query Optimizer - An Introduction
Oracle Query Optimizer - An Introduction
adryanbub
 
MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019
MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019
MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019
Dave Stokes
 
What's New MySQL 8.0?
What's New MySQL 8.0?What's New MySQL 8.0?
What's New MySQL 8.0?
OracleMySQL
 
CDC patterns in Apache Kafka®
CDC patterns in Apache Kafka®CDC patterns in Apache Kafka®
CDC patterns in Apache Kafka®
confluent
 
Performance Tuning Oracle's BI Applications
Performance Tuning Oracle's BI ApplicationsPerformance Tuning Oracle's BI Applications
Performance Tuning Oracle's BI Applications
KPI Partners
 
Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...
Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...
Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...
Edwin Poot
 

Similar to MySQL 8 - UKOUG Techfest Brighton December 2nd, 2019 (20)

MySQL 8.0 Featured for Developers
MySQL 8.0 Featured for DevelopersMySQL 8.0 Featured for Developers
MySQL 8.0 Featured for Developers
 
Upcoming changes in MySQL 5.7
Upcoming changes in MySQL 5.7Upcoming changes in MySQL 5.7
Upcoming changes in MySQL 5.7
 
Developers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgrade
Developers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgradeDevelopers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgrade
Developers’ mDay 2019. - Bogdan Kecman, Oracle – MySQL 8.0 – why upgrade
 
Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...
Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...
Big Data: Getting off to a fast start with Big SQL (World of Watson 2016 sess...
 
2011 Collaborate IOUG Presentation
2011 Collaborate IOUG Presentation2011 Collaborate IOUG Presentation
2011 Collaborate IOUG Presentation
 
cPanel now supports MySQL 8.0 - My Top Seven Features
cPanel now supports MySQL 8.0 - My Top Seven FeaturescPanel now supports MySQL 8.0 - My Top Seven Features
cPanel now supports MySQL 8.0 - My Top Seven Features
 
MySQL Goes to 8! FOSDEM 2020 Database Track, January 2nd, 2020
MySQL Goes to 8!  FOSDEM 2020 Database Track, January 2nd, 2020MySQL Goes to 8!  FOSDEM 2020 Database Track, January 2nd, 2020
MySQL Goes to 8! FOSDEM 2020 Database Track, January 2nd, 2020
 
Top 10 tips for Oracle performance
Top 10 tips for Oracle performanceTop 10 tips for Oracle performance
Top 10 tips for Oracle performance
 
Mysql 57-upcoming-changes
Mysql 57-upcoming-changesMysql 57-upcoming-changes
Mysql 57-upcoming-changes
 
Confoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New FeaturesConfoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New Features
 
Using Graphs for Feature Engineering_ Graph Reduce-2.pdf
Using Graphs for Feature Engineering_ Graph Reduce-2.pdfUsing Graphs for Feature Engineering_ Graph Reduce-2.pdf
Using Graphs for Feature Engineering_ Graph Reduce-2.pdf
 
DataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdf
DataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdfDataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdf
DataEng Mad - 03.03.2020 - Tibero 30-min Presentation.pdf
 
Remote DBA Experts 11g Features
Remote DBA Experts 11g FeaturesRemote DBA Experts 11g Features
Remote DBA Experts 11g Features
 
Oracle Query Optimizer - An Introduction
Oracle Query Optimizer - An IntroductionOracle Query Optimizer - An Introduction
Oracle Query Optimizer - An Introduction
 
MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019
MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019
MySQL 8.0 Features -- Oracle CodeOne 2019, All Things Open 2019
 
What's New MySQL 8.0?
What's New MySQL 8.0?What's New MySQL 8.0?
What's New MySQL 8.0?
 
CDC patterns in Apache Kafka®
CDC patterns in Apache Kafka®CDC patterns in Apache Kafka®
CDC patterns in Apache Kafka®
 
Performance Tuning Oracle's BI Applications
Performance Tuning Oracle's BI ApplicationsPerformance Tuning Oracle's BI Applications
Performance Tuning Oracle's BI Applications
 
Ibm redbook
Ibm redbookIbm redbook
Ibm redbook
 
Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...
Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...
Analyzing petabytes of smartmeter data using Cloud Bigtable, Cloud Dataflow, ...
 

More from Dave Stokes

Json within a relational database
Json within a relational databaseJson within a relational database
Json within a relational database
Dave Stokes
 
Database basics for new-ish developers -- All Things Open October 18th 2021
Database basics for new-ish developers  -- All Things Open October 18th 2021Database basics for new-ish developers  -- All Things Open October 18th 2021
Database basics for new-ish developers -- All Things Open October 18th 2021
Dave Stokes
 
Php &amp; my sql - how do pdo, mysq-li, and x devapi do what they do
Php &amp; my sql  - how do pdo, mysq-li, and x devapi do what they doPhp &amp; my sql  - how do pdo, mysq-li, and x devapi do what they do
Php &amp; my sql - how do pdo, mysq-li, and x devapi do what they do
Dave Stokes
 
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
Dave Stokes
 
MySQL 8.0 New Features -- September 27th presentation for Open Source Summit
MySQL 8.0 New Features -- September 27th presentation for Open Source SummitMySQL 8.0 New Features -- September 27th presentation for Open Source Summit
MySQL 8.0 New Features -- September 27th presentation for Open Source Summit
Dave Stokes
 
JavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScript
JavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScriptJavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScript
JavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScript
Dave Stokes
 
Open Source World June '21 -- JSON Within a Relational Database
Open Source World June '21 -- JSON Within a Relational DatabaseOpen Source World June '21 -- JSON Within a Relational Database
Open Source World June '21 -- JSON Within a Relational Database
Dave Stokes
 
Dutch PHP Conference 2021 - MySQL Indexes and Histograms
Dutch PHP Conference 2021 - MySQL Indexes and HistogramsDutch PHP Conference 2021 - MySQL Indexes and Histograms
Dutch PHP Conference 2021 - MySQL Indexes and Histograms
Dave Stokes
 
Validating JSON -- Percona Live 2021 presentation
Validating JSON -- Percona Live 2021 presentationValidating JSON -- Percona Live 2021 presentation
Validating JSON -- Percona Live 2021 presentation
Dave Stokes
 
Midwest PHP Presentation - New MSQL Features
Midwest PHP Presentation - New MSQL FeaturesMidwest PHP Presentation - New MSQL Features
Midwest PHP Presentation - New MSQL Features
Dave Stokes
 
Data Love Conference - Window Functions for Database Analytics
Data Love Conference - Window Functions for Database AnalyticsData Love Conference - Window Functions for Database Analytics
Data Love Conference - Window Functions for Database Analytics
Dave Stokes
 
Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...
Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...
Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...
Dave Stokes
 
Datacon LA - MySQL without the SQL - Oh my!
Datacon LA - MySQL without the SQL - Oh my! Datacon LA - MySQL without the SQL - Oh my!
Datacon LA - MySQL without the SQL - Oh my!
Dave Stokes
 
MySQL Replication Update - DEbconf 2020 presentation
MySQL Replication Update - DEbconf 2020 presentationMySQL Replication Update - DEbconf 2020 presentation
MySQL Replication Update - DEbconf 2020 presentation
Dave Stokes
 
MySQL 8.0 Operational Changes
MySQL 8.0 Operational ChangesMySQL 8.0 Operational Changes
MySQL 8.0 Operational Changes
Dave Stokes
 
A Step by Step Introduction to the MySQL Document Store
A Step by Step Introduction to the MySQL Document StoreA Step by Step Introduction to the MySQL Document Store
A Step by Step Introduction to the MySQL Document Store
Dave Stokes
 
Discover The Power of NoSQL + MySQL with MySQL
Discover The Power of NoSQL + MySQL with MySQLDiscover The Power of NoSQL + MySQL with MySQL
Discover The Power of NoSQL + MySQL with MySQL
Dave Stokes
 
Discover the Power of the NoSQL + SQL with MySQL
Discover the Power of the NoSQL + SQL with MySQLDiscover the Power of the NoSQL + SQL with MySQL
Discover the Power of the NoSQL + SQL with MySQL
Dave Stokes
 
Confoo 202 - MySQL Group Replication and ReplicaSet
Confoo 202 - MySQL Group Replication and ReplicaSetConfoo 202 - MySQL Group Replication and ReplicaSet
Confoo 202 - MySQL Group Replication and ReplicaSet
Dave Stokes
 
MySQL New Features -- Sunshine PHP 2020 Presentation
MySQL New Features -- Sunshine PHP 2020 PresentationMySQL New Features -- Sunshine PHP 2020 Presentation
MySQL New Features -- Sunshine PHP 2020 Presentation
Dave Stokes
 

More from Dave Stokes (20)

Json within a relational database
Json within a relational databaseJson within a relational database
Json within a relational database
 
Database basics for new-ish developers -- All Things Open October 18th 2021
Database basics for new-ish developers  -- All Things Open October 18th 2021Database basics for new-ish developers  -- All Things Open October 18th 2021
Database basics for new-ish developers -- All Things Open October 18th 2021
 
Php &amp; my sql - how do pdo, mysq-li, and x devapi do what they do
Php &amp; my sql  - how do pdo, mysq-li, and x devapi do what they doPhp &amp; my sql  - how do pdo, mysq-li, and x devapi do what they do
Php &amp; my sql - how do pdo, mysq-li, and x devapi do what they do
 
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
 
MySQL 8.0 New Features -- September 27th presentation for Open Source Summit
MySQL 8.0 New Features -- September 27th presentation for Open Source SummitMySQL 8.0 New Features -- September 27th presentation for Open Source Summit
MySQL 8.0 New Features -- September 27th presentation for Open Source Summit
 
JavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScript
JavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScriptJavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScript
JavaScript and Friends August 20th, 20201 -- MySQL Shell and JavaScript
 
Open Source World June '21 -- JSON Within a Relational Database
Open Source World June '21 -- JSON Within a Relational DatabaseOpen Source World June '21 -- JSON Within a Relational Database
Open Source World June '21 -- JSON Within a Relational Database
 
Dutch PHP Conference 2021 - MySQL Indexes and Histograms
Dutch PHP Conference 2021 - MySQL Indexes and HistogramsDutch PHP Conference 2021 - MySQL Indexes and Histograms
Dutch PHP Conference 2021 - MySQL Indexes and Histograms
 
Validating JSON -- Percona Live 2021 presentation
Validating JSON -- Percona Live 2021 presentationValidating JSON -- Percona Live 2021 presentation
Validating JSON -- Percona Live 2021 presentation
 
Midwest PHP Presentation - New MSQL Features
Midwest PHP Presentation - New MSQL FeaturesMidwest PHP Presentation - New MSQL Features
Midwest PHP Presentation - New MSQL Features
 
Data Love Conference - Window Functions for Database Analytics
Data Love Conference - Window Functions for Database AnalyticsData Love Conference - Window Functions for Database Analytics
Data Love Conference - Window Functions for Database Analytics
 
Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...
Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...
Open Source 1010 and Quest InSync presentations March 30th, 2021 on MySQL Ind...
 
Datacon LA - MySQL without the SQL - Oh my!
Datacon LA - MySQL without the SQL - Oh my! Datacon LA - MySQL without the SQL - Oh my!
Datacon LA - MySQL without the SQL - Oh my!
 
MySQL Replication Update - DEbconf 2020 presentation
MySQL Replication Update - DEbconf 2020 presentationMySQL Replication Update - DEbconf 2020 presentation
MySQL Replication Update - DEbconf 2020 presentation
 
MySQL 8.0 Operational Changes
MySQL 8.0 Operational ChangesMySQL 8.0 Operational Changes
MySQL 8.0 Operational Changes
 
A Step by Step Introduction to the MySQL Document Store
A Step by Step Introduction to the MySQL Document StoreA Step by Step Introduction to the MySQL Document Store
A Step by Step Introduction to the MySQL Document Store
 
Discover The Power of NoSQL + MySQL with MySQL
Discover The Power of NoSQL + MySQL with MySQLDiscover The Power of NoSQL + MySQL with MySQL
Discover The Power of NoSQL + MySQL with MySQL
 
Discover the Power of the NoSQL + SQL with MySQL
Discover the Power of the NoSQL + SQL with MySQLDiscover the Power of the NoSQL + SQL with MySQL
Discover the Power of the NoSQL + SQL with MySQL
 
Confoo 202 - MySQL Group Replication and ReplicaSet
Confoo 202 - MySQL Group Replication and ReplicaSetConfoo 202 - MySQL Group Replication and ReplicaSet
Confoo 202 - MySQL Group Replication and ReplicaSet
 
MySQL New Features -- Sunshine PHP 2020 Presentation
MySQL New Features -- Sunshine PHP 2020 PresentationMySQL New Features -- Sunshine PHP 2020 Presentation
MySQL New Features -- Sunshine PHP 2020 Presentation
 

Recently uploaded

GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
91mobiles
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Albert Hoitingh
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
Paul Groth
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
DianaGray10
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
Laura Byrne
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
Product School
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
UiPathCommunity
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 

Recently uploaded (20)

GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdfSmart TV Buyer Insights Survey 2024 by 91mobiles.pdf
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024
 
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMsTo Graph or Not to Graph Knowledge Graph Architectures and LLMs
To Graph or Not to Graph Knowledge Graph Architectures and LLMs
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3UiPath Test Automation using UiPath Test Suite series, part 3
UiPath Test Automation using UiPath Test Suite series, part 3
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
The Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and SalesThe Art of the Pitch: WordPress Relationships and Sales
The Art of the Pitch: WordPress Relationships and Sales
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...How world-class product teams are winning in the AI era by CEO and Founder, P...
How world-class product teams are winning in the AI era by CEO and Founder, P...
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 

MySQL 8 - UKOUG Techfest Brighton December 2nd, 2019

  • 1. Features For DevelopersDave Stokes MySQL Community Manager David.Stokes@Oracle.com @Stoker Slides -> https://slideshare.net/davidmstokes Blog -> https://elephantdolphin.blogspot.com
  • 2. Safe Harbor Agreement THE FOLLOWING IS INTENDED TO OUTLINE OUR GENERAL PRODUCT DIRECTION. IT IS INTENDED FOR INFORMATION PURPOSES 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 UPON IN MAKING PURCHASING DECISIONS. THE DEVELOPMENT, RELEASE, AND TIMING OF ANY FEATURES OR FUNCTIONALITY DESCRIBED FOR ORACLE'S PRODUCTS REMAINS AT THE SOLE DISCRETION OF ORACLE. 2
  • 4. MySQL News ● 24 years old! Oracle owned for nine years! ● MySQL 8.0 is the current Generally Available release ● Document Store ● Group Replication ● We’re Hiring 4
  • 6. MySQL 8? What happened to MySQL 6 and MySQL 7?? 6
  • 7. Well.. ● Previous GA is 5.7 (October 2015) ● MySQL Cluster is 7.6.11 (8.0.17 release candidate available) ● There was a MySQL 6 in the pre-Sun days, kinda like the PHP version six that nobody really talks about except in hushed tones and with great sadness Engineering thought the new data dictionary and other new features justified the new major release number. 7
  • 8. 1.Data Dictionary Before MySQL 8 -- Meta Data Stored in files! You have had a plethora of files out there -- .FRM .MYD .MYI .OPT and many more just waiting for something to go bad -- now store relevant information in data dictionary! This means you are no longer dependent in the number of inodes on your system, somebody rm-ing the files at just the wrong time, and a whole host of other problems. Innodb is robust enough to rebuild all information to a point in time in case of problems. So keep EVERYTHING in internal data structures. And that leads to transactional ALTER TABLE commands. 8
  • 9. System Tables are now InnoDB Previously, these were MyISAM (non transactional) tables. This change applies to these tables: user, db, tables_priv, columns_priv, procs_priv, proxies_priv. 9
  • 10. Good News!? So now you can have millions of tables within a schema. The bad news is that you can have millions of tables within a schema. 10
  • 11. 2.CTEs & Windowing Functions Long requested, Common Table Expression and Windowing Functions have a wide variety of uses. ● CTEs are handy subquery-like statements often used in quick calculations ● Windowing Functions are great for iterating over a selected set of rows for things like statistical calculations 11
  • 12. Windowing Function The key word is OVER SELECT name, department_id, salary, SUM(salary) OVER (PARTITION BY department_id) AS department_total FROM employee ORDER BY department_id, name 12
  • 13. Another Example Windowing functions are great when dealing with dates SELECT date, amount, sum(amount) OVER w AS ‘sum’ FROM payments WINDOW w AS (ORDER BY date RANGE BETWEEN INTERVAL 1 WEEK PRECEDING AND CURRENT ROW) ORDER BY date; 13
  • 14. CTEs ..are like derived tables but the declaration is BEFORE the query WITH qn AS (SELECT t1 FROM mytable) SELECT * FROM qn. 14
  • 15. JOINing two CTEs 15 WITH cte1 AS (SELECT a, b FROM table1), cte2 AS (SELECT c, d FROM table2) SELECT b, d FROM cte1 JOIN cte2 WHERE cte1.a = cte2.c;
  • 16. Common Table Expression - recursive +------+ | n | +------+ | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 | | 10 | +------+ 10 rows in set (0,00 sec) WITH RECURSIVE my_cte AS ( SELECT 1 AS n UNION ALL SELECT 1+n FROM my_cte WHERE n<10 ) SELECT * FROM my_cte; 16
  • 17. Lateral Derived Tables SELECT Name, Population, District, x.cc FROM city, LATERAL (SELECT Code AS cc FROM country WHERE city.CountryCode = Code) AS x WHERE District = 'Texas' ORDER BY name; 17 Easier to write sub queries!
  • 18. 3. Optimizer & Parser ● Descending indexes ● Optimizer trace output now includes more information about filesort operations, such as key and payload size and why addon fields are not packed. ● The optimizer now supports hints that enable specifying the order in which to join tables. ● New sys variable to include estimates for delete marked records includes delete marked records in calculation of table and index statistics. This work was done to overcome a problem with "wrong" statistics where an uncommitted transaction has deleted all rows in the table. ● Index and Join Order Hints -- User controls order ● NOWAIT and SKIPPED LOCKED to bypass locked records 18
  • 19. EXPLAIN FORMAT=JSON <query> 19 { "query_block": { "select_id": 1, "cost_info": { "query_cost": "443.80" }, "table": { "table_name": "city", "access_type": "ALL", "rows_examined_per_scan": 4188, "rows_produced_per_join": 418, "filtered": "10.00", "cost_info": { "read_cost": "401.92", "eval_cost": "41.88", "prefix_cost": "443.80", "data_read_per_join": "29K" }, "used_columns": [ "ID", "Name", "CountryCode", "District", "Population" ], "attached_condition": "(`world`.`city`.`Name` = 'Dallas')" } } }
  • 20. How SKIP LOCKED or NOWAIT look START TRANSACTION; SELECT * FROM seats WHERE seat_rows.row_no BETWEEN 2 AND 3 AND booked = 'NO' FOR UPDATE SKIP LOCKED; ... COMMIT; START TRANSACTION SELECT seat_no FROM seats JOIN seat_rows USING ( row_no ) WHERE seat_no IN (3,4) AND seat_rows.row_no IN (12) AND booked = 'NO' FOR UPDATE OF seats SKIP LOCKED FOR SHARE OF seat_rows NOWAIT; 20
  • 21. Contention-Aware Transaction Scheduling CATS The CATS algorithm is based on a simple intuition: not all transactions are equal, and not all objects are equal. When a transaction already has a lock on many popular objects, it should get priority when it requests a new lock. In other words, unblocking such a transaction will indirectly contribute to unblocking many more transactions in the system, which means higher throughput and lower latency overall. 21
  • 22. Multi Valued Index Getting past the 1:1 Index Ratio 22 SELECT _id, data->>"$.nbr" FROM a1 WHERE 99999 MEMBER OF (data->"$.nbr"); Very useful in cases where you multiple phone numbers, postal codes, part numbers within an JSON array!
  • 23. 4. Roles MySQL now supports roles, which are named collections of privileges. Roles can be created and dropped. Roles can have privileges granted to and revoked from them. Roles can be granted to and revoked from user accounts. The active applicable roles for an account can be selected from among those granted to the account, and can be changed during sessions for that account. Set up and account for a certain function and then assign users who need that function. 23
  • 24. 5. Character Sets MySQL 8 IS by default UTF8MB4! 24
  • 25. Not all UTf8 equal utf8mb4_0900_ai_ci: 0900 refers to Unicode Collation Algorithm version. - ai refers to accent insensitive. - ci refers to case insensitive. Previously UTF8 was actually UTF8MB3 ● 3 bytes, no emojis ● Supplementary multilingual plane support limited ● No CJK Unified Ideographs Extension B are in supplementary ideographic plane Upgrade problem expected! Also supports GB18030 character set! 25
  • 26. 26
  • 27. 6. Invisible Indexes An invisible index is not used by the optimizer at all, but is otherwise maintained normally. Indexes are visible by default. Invisible indexes make it possible to test the effect of removing an index on query performance, without making a destructive change that must be undone should the index turn out to be required 27
  • 28. Setting/Unsetting Invisible Indexes ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE; ALTER TABLE t1 ALTER INDEX i_idx VISIBLE; 28
  • 29. Functional Indexes CREATE TABLE t1 ( col1 INT, col2 INT, INDEX func_index ((ABS(col1))) ); CREATE INDEX idx1 ON t1 ((col1 + col2)); ALTER TABLE t1 ADD INDEX ((col1 * 40) DESC); 29
  • 30. 7. SET PERSIST mysql> SET PERSIST innodb_buffer_pool_size = 512 * 1024 * 1024; Query OK, 0 rows affected (0.01 sec) 30
  • 31. Why SET PERSIST (pronounced Docker) A MySQL server can be configured and managed over a SQL connection thus removing manual file operations (on configuration files) to be done by DBAs. This feature addresses the usability issues described above, and allows MySQL to be more easily deployed and configured on cloud platforms. The file mysqld-auto.cnf is created the first time a SET PERSIST statement is executed. Further SET PERSIST statement executions will append the contents to this file. This file is in JSON format and can be parsed using json parser. Timestamp & User recorded 31
  • 32. Other new features not dependant on server GA Decoupling features like Group Replication and Document Store from release cycle to make updates easier ● Add new features via a plug-in ● Make upgrades less onerous ● Easier management of featuresYes, we know that servers can be hard to manage and get harder when they are in the cloud and out of reach of ‘percussive maintenance’ techniques. 32
  • 33. 8. 3G Geometry “GIS is a form of digital mapping technology. Kind of like Google Earth but better.” -- Arnold Schwarzenegger Governor of California 33
  • 34. 8. 3D Geometry ● World can now be flat or ellipsoidal ● Coordinate system wrap around ● Boot.Geometry & Open GID ● Code related to geometry parsing, computing bounding boxes and operations on them, from the InnoDB layer to the Server layer so that geographic R-trees can be supported easily in the future without having to change anything in InnoDB 34
  • 35. 9. JSON -- A big change in Databases We can use a JSON field to eliminate one of the issues of traditional database solutions: many-to-many-joins This allows more freedom to store unstructured data (data with pieces missing) You still use SQL to work with the data via a database connector but the JSON documents in the table can be manipulated directly in code. Joins can be expensive. Reducing how many places you need to join data can help speed up your queries. Removing joins may result in some level of denormalization but can result in fast access to the data. 35
  • 36. Plan for Mutability Schemaless designs are focused on mutability. Build your applications with the ability to modify the document as needed (and within reason) 36
  • 37. Remove Many-to-Many Relationships ● Use embedded arrays and lists to store relationships among documents. This can be as simple as embedding the data in the document or embedding an array of document ids in the document. ● In the first case data is available as soon as you can read the document and in the second it only takes one additional step to retrieve the data. In cases of seldom read (used) relationships, having the data linked with an array of ids can be more efficient (less data to read on the first pass) 37
  • 38. ->> Operator MySQL 8 adds a new unquoting extraction operator ->>, sometimes also referred to as an inline path operator, for use with JSON documents stored in MySQL. The new operator is similar to the -> operator, but performs JSON unquoting of the value as well. The following three expressions are equivalent: ● JSON_UNQUOTE( JSON_EXTRACT(mycol, "$.mypath") ) ● JSON_UNQUOTE(mycol->"$.mypath") ● mycol->>"$.mypath" Can be used with (but is not limited to) SELECT lists, WHERE and HAVING clauses, and ORDER BY and GROUP BY clauses. 38
  • 39. JSON_PRETTY mysql> SELECT JSON_PRETTY(doc) FROM countryinfo LIMIT 1; { "GNP": 828, "_id": "ABW", "Name": "Aruba", "IndepYear": null, "geography": { "Region": "Caribbean", "Continent": "North America", "SurfaceArea": 193 }, "government": { "HeadOfState": "Beatrix", "GovernmentForm": "Nonmetropolitan Territory of The Netherlands" }, "demographics": { "Population": 103000, "LifeExpectancy": 78.4000015258789 } } 39
  • 40. JSON_ARRAYAGG mysql> SELECT col FROM t1; +--------------------------------------+ | col | +--------------------------------------+ | {"key1": "value1", "key2": "value2"} | | {"keyA": "valueA", "keyB": "valueB"} | +--------------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT JSON_ARRAYAGG(col) FROM t1; +------------------------------------------------------------------------------+ | JSON_ARRAYAGG(col) | +------------------------------------------------------------------------------+ | [{"key1": "value1", "key2": "value2"}, {"keyA": "valueA", "keyB": "valueB"}] | +------------------------------------------------------------------------------+ 40
  • 41. JSON_OBJECTAGG() mysql> SELECT id, col FROM t1; +------+--------------------------------------+ | id | col | +------+--------------------------------------+ | 1 | {"key1": "value1", "key2": "value2"} | | 2 | {"keyA": "valueA", "keyB": "valueB"} | +------+--------------------------------------+ 2 rows in set (0.00 sec) mysql> SELECT JSON_OBJECTAGG(id, col) FROM t1; +----------------------------------------------------------------------------------------+ | JSON_OBJECTAGG(id, col) | +----------------------------------------------------------------------------------------+ | {"1": {"key1": "value1", "key2": "value2"}, "2": {"keyA": "valueA", "keyB": "valueB"}} | +----------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) 41 Both JSON_ARRAY_AGG and JSON_OBJECTAGG() work with both JSON and non JSON COLUMNS!
  • 42. JSON_TABLE - Structure your unstructured data mysql> select country_name, IndyYear from countryinfo, json_table(doc,"$" columns ( country_name char(20) path "$.Name", IndyYear int path "$.IndepYear") ) as stuff where IndyYear > 1992; +----------------+----------+ | country_name | IndyYear | +----------------+----------+ | Czech Republic | 1993 | | Eritrea | 1993 | | Palau | 1994 | | Slovakia | 1993 | +----------------+----------+ 43 JSON_TABLE is used for making JSON data a temporary relational data, which is especially useful when creating relational views over JSON data,
  • 43. JSON Table -- a Deeper Look 44 mysql> select aaaa.name, aaaa.ordinal, aaaa.Grading FROM restaurants, json_table(doc, "$" COLUMNS( name char(50) path "$.name", style varchar(50) path "$.cuisine", NESTED PATH '$.grades[*]' COLUMNS ( ordinal FOR ORDINALITY, Grading char(10) path "$.grade", Score INT path "$.score")) ) as aaaa limit 5; +--------------------------------+---------+---------+ | name | ordinal | Grading | +--------------------------------+---------+---------+ | Morris Park Bake Shop | 1 | A | | Morris Park Bake Shop | 2 | A | | Morris Park Bake Shop | 3 | A | | Morris Park Bake Shop | 4 | A | | Morris Park Bake Shop | 5 | B |
  • 44. Validating a JSON Document - thanks JSON-schema.org 45 CREATE TABLE `testx` ( `col` JSON, CONSTRAINT `myage_inRange` CHECK (JSON_SCHEMA_VALID('{"type": "object", "properties": { "myage": { "type" : "number", "minimum": 28, "maximum": 99 } },"required": ["myage"] }', `col`) = 1) );
  • 45. 46 select JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@s,@d))G *************************** 1. row *************************** JSON_PRETTY(JSON_SCHEMA_VALIDATION_REPORT(@s,@d)): { "valid": false, "reason": "The JSON document location '#/myage' failed requirement 'minimum' at JSON Schema location '#/properties/myage'", "schema-location": "#/properties/myage", "document-location": "#/myage", "schema-failed-keyword": "minimum" }
  • 46. MySQL Document Store Relational databases such as MySQL usually required a document schema to be defined before documents can be stored. A new plug-in enables you to use MySQL as a document store, which is a schema-less, and therefore schema-flexible, storage system for documents. When using MySQL as a document store, to create documents describing products you do not need to know and define all possible attributes of any products before storing them and operating with them. 47
  • 47. MySQL Document Store This differs from working with a relational database and storing products in a table, when all columns of the table must be known and defined before adding any products to the database. This allows you to choose how you configure MySQL, using only the document store model, or combining the flexibility of the document store model with the power of the relational model. 48
  • 48. Using the MySQL Document Store with the X DevAPI PECL Extension 49 #!/usr/bin/php <?PHP // Connection parameters $user = 'root'; $passwd = 'hidave'; $host = 'localhost'; $port = '33060'; $connection_uri = 'mysqlx://'.$user.':'.$passwd.'@'.$host.':'.$port; // Connect as a Node Session $nodeSession = mysql_xdevapigetNodeSession($connection_uri); // "USE world_x" $schema = $nodeSession->getSchema("world_x"); // Specify collection to use $collection = $schema->getCollection("countryinfo"); // Query the Document Store $result = $collection->find('_id = "USA"')->fields(['Name as Country','geography as Geo','geography.Region'])->execute(); // Fetch/Display data $data = $result->fetchAll(); var_dump($data); ?>
  • 49. Python in the new MySQL Shell 50 mysql-py> db.countryinfo.find("GNP > 5000000").fields(["GNP", "Name"]) [ { "GNP": 8510700, "Name": "United States" } ] 1 document in set (0.00 sec)
  • 50. 10. Resource Groups Groups can be established so that threads execute according to the resources available to the group. Group attributes enable control over its resources, to enable MySQL supports creation and management of resource groups, and permits assigning threads running within the server to particular group or restrict resource consumption by threads in the group. DBAs can modify these attributes as appropriate for different workloads. For example, to manage execution of batch jobs that need not execute with high priority, a DBA can create a Batch resource group, and adjust its priority up or down depending on how busy the server is. (Perhaps batch jobs assigned to the group should run at lower priority during the day and at higher priority during the night.) The DBA can also adjust the set of CPUs available to the group. CREATE RESOURCE GROUP Batch TYPE = USER VCPU = 2-3 -- assumes a system with at least 4 CPUs THREAD_PRIORITY = 10; INSERT /*+ RESOURCE_GROUP(Batch) */ INTO t2 VALUES(2); 51
  • 51. 11. Histograms - Indexing without indexes! A histogram is an approximation of the data distribution for a column. It can tell you with a reasonably accuray whether your data is skewed or not, which in turn will help the database server understand the nature of data it contains. Histograms comes in many different flavours, and in MySQL we have chosen to support two different types: The “singleton” histogram and the “equi-height” histogram. Common for all histogram types is that they split the data set into a set of “buckets”, and MySQL automatically divides the values into buckets, and will also automatically decide what type of histogram to create. Note that the number of buckets must be specified, and can be in the range from 1 to 1024. How many buckets you should choose for your data set depends on several factors; how many distinct values do you have, how skewed is your data set, how high accuracy do you need etc. However, after a certain amount of buckets the increased accuracy is rather low. So we suggest to start at a lower number such as 32, and increase it if you see that it doesn’t fit your needs. 52
  • 52. Histograms mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_mktsegment WITH 1024 BUCKETS; +---------------+-----------+----------+---------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------+-----------+----------+---------------------------------------------------------+ | dbt3.customer | histogram | status | Histogram statistics created for column 'c_mktsegment'. | +---------------+-----------+----------+---------------------------------------------------------+ 53
  • 53. Two reasons for why you might consider a histogram instead of an index Maintaining an index has a cost. If you have an index, every INSERT/UPDATE/DELETE causes the index to be updated. This is not free, and will have an impact on your performance. A histogram on the other hand is created once and never updated unless you explicitly ask for it. It will thus not hurt your INSERT/UPDATE/DELETE- performance. 54 If you have an index, the optimizer will do what we call “index dives” to estimate the number of records in a given range. This also has a certain cost, and it might become too costly if you have for instance very long IN-lists in your query. Histogram statistics are much cheaper in this case, and might thus be more suitable.
  • 54. 12. Bye Bye MEMORY Storage Engine The TempTable storage engine replaces the MEMORY storage engine as the default engine for in-memory internal temporary tables. The TempTable storage engine provides efficient storage for VARCHAR and VARBINARY columns. Performance is ten times better than 5.7!! 55
  • 55. https://stackoverflow.com/questions/5050 5236/mysql-8-0-group-by-performance 5down vote MySQL 8.0 uses a new storage engine, TempTable, for internal temporary tables. (See MySQL Manual for details.) This engine does not have a max memory limit per table, but a common memory pool for all internal tables. It also has its own overflow to disk mechanism, and does not overflow to InnoDB or MyISAM as earlier versions. The profile for 5.7 contains "converting HEAP to ondisk". This means that the table reached the max table size for the MEMORY engine (default 16 MB) and the data is transferred to InnoDB. Most of the time after that is spent accessing the temporary table in InnoDB. In MySQL 8.0, the default size of the memory pool for temporary tables is 1 GB, so there will probably not be any overflow to disk in that case. 56
  • 56. 13. X DevAPI on by default on port 33060 MySQL Document Store allows developers to work with SQL relational tables and schema-less JSON collections. To make that possible MySQL has created the X Dev API which puts a strong focus on CRUD by providing a fluent API allowing you to work with JSON documents in a natural way. The X Protocol is a highly extensible and is optimized for CRUD as well as SQL API operations. 57
  • 57. SQL + NoSQL Schema-less NoSQL JSON Document Store with ACID compliance. And you can also access relational data! 58 1GB documents versus Mongo’s 16MB!
  • 58. Using MySQL without SQL! $nodeSession = mysql_xdevapigetNodeSession($connection_uri); $schema = $nodeSession->getSchema("world_x"); $collection = $schema->getCollection("countryinfo"); $result = $collection->find('_id = "USA"')- >execute(); $data = $result->fetchAll(); var_dump($data); 59
  • 59. The 10 Best Restaurants of Different Cuisines WITH cte1 AS (SELECT doc->>"$.name" AS name, doc->>"$.cuisine" AS cuisine, (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT PATH "$.score")) AS r) AS avg_score FROM restaurants) SELECT *, RANK() OVER (PARTITION BY cuisine ORDER BY avg_score DESC) AS `rank` FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10; +-----------------------+--------------------------------+-----------+------+ | name | cuisine | avg_score | rank | +-----------------------+--------------------------------+-----------+------+ | Juice It Health Bar | Juice, Smoothies, Fruit Salads | 75.0000 | 1 | | Golden Dragon Cuisine | Chinese | 73.0000 | 1 | | Palombo Pastry Shop | Bakery | 69.0000 | 1 | | Go Go Curry | Japanese | 65.0000 | 1 | | K & D Internet Inc | Café/Coffee/Tea | 61.0000 | 1 | | Koyla | Middle Eastern | 61.0000 | 1 | | Ivory D O S Inc | Other | 60.0000 | 1 | | Espace | American | 56.0000 | 1 | | Rose Pizza | Pizza | 52.0000 | 1 | | Tacos Al Suadero | Mexican | 52.0000 | 1 | +-----------------------+--------------------------------+-----------+------+ 60 This query uses JSON_TABLE to structure the schema-less data within a CTE and then the CTE is queried to get the top 10 restaurants with a Windowing Function
  • 60. The 10 Best Restaurants of Different Cuisines The JSON_TABLE, CTE, and Windowing Function 61 This query uses JSON_TABLE to structure the schema-less data within a CTE and then the CTE is queried to get the top 10 restaurants with a Windowing Function WITH cte1 AS (SELECT doc->>"$.name" AS name, doc->>"$.cuisine" AS cuisine, (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT PATH "$.score")) AS r) AS avg_score FROM restaurants) SELECT *, RANK() OVER (PARTITION BY cuisine ORDER BY avg_score DESC) AS `rank` FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;
  • 62. 8.0.16 - April 63 1.The mysql_upgrade script runs automatically 2.Constraint checks 3.MySQL C API supports asynchronous, non blocking communications with server 4.EXPLAIN FORMAT=TREE
  • 63. 8.0.14/15 - January/February 64 1.Dual Passwords 2.Admin TCP/IP port (default 33062), no limit on number of connections, requires SERVICE_CONNETION_ADMIN priviledge 3.JSON_ARRAYAGG() and JSON_OBJECTAGG() added to Window Functions 4.SET PERSIST and SET PERSIST ONLY 5.LATERAL derived tables
  • 64. 8.0.18 - October 65 1.Multi-valued indexes 2.JSON Document Validation 3.Dual Password 4.Clone Table Space for Replication 5.New utf8mb4_900_bin (faster storts), no pad attribute
  • 65. 8.0.17 - July 66 1.Random Passwords – CREATE USER, ALTER USER, and SET PASSWORD 2.EXPLAIN ANALYSE 3.HASH JOINS 4.Compression – added ztsd (uncompresses or zlib other options) 5.Enterprise Edition supports HashCorp Vault
  • 66. Download Today https://dev.mysql.com/downloads/mysql/ Or Docker images -> https://hub.docker.com/_/mysql/ 67
  • 67. The Unofficial MySQL 8 Optimizer Guide 68 http://www.unofficialmysqlguide.com/ Server Architecture B+tree indexes Explain Optimizer Trace Logical Transformations Example Transformations Cost-based Optimization Hints Comparing Plans Composite Indexes Covering Indexes Visual Explain Transient Plans Subqueries CTEs and Views Joins Aggregation Sorting Partitioning Query Rewrite Invisible Indexes Profiling Queries JSON and Generated Columns Character Sets
  • 69. MySQL Group Replication MySQL 5.7 or later 70 MySQL Group Replication is a MySQL Server plugin that enables you to create elastic, highly-available, fault-tolerant replication topologies. There is a built-in group membership service that keeps the view of the group consistent and available for all servers at any given point in time. Servers can leave and join the group and the view is updated accordingly. Sometimes servers can leave the group unexpectedly, in which case the failure detection mechanism detects this and notifies the group that the view has changed. This is all automatic.
  • 71. High Availablity MySQL Cluster Multi Primary Mode 72
  • 72. New MySQL Shell 73 The new MySQL Shell has three modes - JavaScript, Python, & SQL plus admin tools -- check for upgrades, JSON bulk loader, InnoDB Cluster admin
  • 73. Buy My Book (please!) 74 What you need to know to use the MySQL JSON data type with lots of examples!
  • 75. 76 WITH cte1 AS (SELECT doc->>"$.name" AS name, doc->>"$.cuisine" AS cuisine, (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT PATH "$.score")) AS r) AS avg_score FROM restaurants) SELECT *, RANK() OVER (PARTITION BY cuisine ORDER BY avg_score DESC) AS `rank` FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10; +-----------------------+--------------------------------+-----------+------+ | name | cuisine | avg_score | rank | +-----------------------+--------------------------------+-----------+------+ | Juice It Health Bar | Juice, Smoothies, Fruit Salads | 75.0000 | 1 | | Golden Dragon Cuisine | Chinese | 73.0000 | 1 | | Palombo Pastry Shop | Bakery | 69.0000 | 1 | | Go Go Curry | Japanese | 65.0000 | 1 | | K & D Internet Inc | Café/Coffee/Tea | 61.0000 | 1 | | Koyla | Middle Eastern | 61.0000 | 1 | | Ivory D O S Inc | Other | 60.0000 | 1 | | Espace | American | 56.0000 | 1 | | Rose Pizza | Pizza | 52.0000 | 1 | | Tacos Al Suadero | Mexican | 52.0000 | 1 | +-----------------------+--------------------------------+-----------+------+ That query by itself