Copyright © 2015, Oracle and/or its affiliates. All rights reserved. |
JSON Support
in MySQL 5.7
Georgi “Joro” Kodinov
Team lead, MySQL server general team
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Agenda
2
 The new JSON data type
 Inlined JSON path expressions
 The new JSON functions
 Indexing JSON data
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
CREATE TABLE employees (data JSON);
INSERT INTO employees VALUES
('{"id": 1, "name": "Jane"}'),
('{"id": 2, "name": "Joe"}');
SELECT * FROM employees;
+-------------------------------------+
| data |
+-------------------------------------+
| {"id": 1, "name": "Jane"} |
| {"id": 2, "name": "Joe"} |
+-------------------------------------+
• Validation on INSERT
• No reparsing on SELECT
• Dictionary of fields
• Fields are sorted
• Can compare JSON/SQL
• Can convert JSON/SQL
• Supports all native JSON
datatypes
• Also supports date, time,
timestamp etc.
3
The New JSON Datatype
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
JSON vs TEXT columns
Pros Cons
JSON
• Validate once
• Fast access
• Can update in-place
• Slower to insert
• Unreadable as is
• Sets certain limitations on JSON
TEXT
• Fast to insert
• Human readable
• Requires manual validation
• Requires manual parsing
• Harder to update
4
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Beware: SQL vs JSON comparisons !
5
SQL JSON
create table t1 (data json); create table t2 (
id integer,
data varchar(20));
insert into t1 values
('{ "id": 1, "data": "1" }'),
('{ "id": 2, "data": "3" }');
insert into t2 values
(1, '1'),
(2, '3');
select count(*) from t1 where
data->'$.id' = data->'$.data';
select count(*) from t2 where
id = data;
0 rows ! 1 row !
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Agenda
6
 The new JSON data type
 Inlined JSON path expressions
 The new JSON functions
 Indexing JSON data
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Inlined JSON Path Expressions
• <field>->'<JSON path expression>'
e.g. data->'$.some.key[3].from.doc'
• Syntax sugar over JSON_EXTRACT function
• SELECT * FROM employees WHERE data->'$.id'= 2;
• ALTER … ADD COLUMN id INT AS (data->'$.id') …
• CREATE VIEW .. AS SELECT data->'$.id', data->'$.name' FROM …
• UPDATE employees SET data->'$.name'=‘John' WHERE …
Not
yet!
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Limitations of Inlined JSON Path Expressions
Inlined JSON path JSON_EXTRACT()
Data source Field Any JSON value
Path expression SQL Constant SQL Expression
# of expressions One Multiple
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Supported JSON Paths
[[[database.]table.]column]$<path spec>
Expression Example
[ [ [database.] table.] field]$ db.phonebook.data$
$ Current document’s root
$.identifier $.user.address.street
[array] $.user.addresses[2].street
.* and [*] $.user.addresses[*].street
** $.user**.phone
Not yet!
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Agenda
10
 The new JSON data type
 Inlined JSON path expressions
 The new JSON functions
 Indexing JSON data
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
New functions to handle JSON data
Example Result
SELECT JSON_VALID('{ "a":1 }'); 1
SELECT JSON_TYPE('[ 1, 2, 3 ]'); ARRAY
SELECT JSON_KEYS('{ "a":1, "b": 2 }'); ["a", "b"]
SELECT JSON_LENGTH('[ 1, 2, 3 ]'); 3
SELECT JSON_DEPTH('{ "a":{ "c": 1 }, "b": 2 }'); 3
11
Information
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
New functions to handle JSON data
Example Result
SELECT JSON_REMOVE('{ "a":1, "b": 2 }', '$.a'); {"b": 2}
SELECT JSON_ARRAY_APPEND('[1,[2,3],4]', '$[1]', 5); [1, [2, 3, 5], 4]
SELECT JSON_SET('{ "a":1 }', '$.c', 3); {"a": 1, “c": 3}
SELECT JSON_INSERT('{ "a":1 }', '$.b', 4); {"a": 1, "b": 4}
SELECT JSON_REPLACE('{ "a":1, "b": 2 }', '$.b', 3); {"a": 1, "b": 3}
SELECT JSON_MERGE('{ "a": 1 }', '{"b":2}'); {"a": 1, "b": 2}
SELECT JSON_UNQUOTE('"abc"'); abc
12
Modification
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
New functions to handle JSON data
Example Result
SELECT JSON_ARRAY(1, '2', null, true); [1, "2", null, true]
SELECT JSON_OBJECT(1, 2, '3', true); {"1": 2, "3": true}
SELECT JSON_QUOTE('"null"'); ""null""
13
Create JSON objects
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
New functions to handle JSON data
Example Result
SELECT JSON_CONTAINS_PATH(
'{ "a":{ "c": 1 }, "b": 2 }', 'one', '$.a.c');
1
SELECT JSON_CONTAINS( '{"a": 1, "b": "2" }', '1', '$.a'); 1
SELECT JSON_EXTRACT('{"a": 1, "n": { "b": 2}}', '$.n'); {"b": 2}
SELECT JSON_SEARCH( '{"a": "1", "b": "2" }', 'one', 2); "$.b"
14
Search in JSON data
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
New functions to handle JSON data
15
Further reading: http://dev.mysql.com/doc/refman/5.7/en/
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Agenda
16
 The new JSON data type
 Inlined JSON path expressions
 The new JSON functions
 Indexing JSON data
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Indexing JSON Data
• Use Functional Indexes
– Both STORED and VIRTUAL types are supported
• Examples:
– CREATE TABLE t1 (
data JSON,
id INTEGER AS (JSON_EXTRACT(data,"$.id")) STORED,
PRIMARY KEY(id));
– CREATE TABLE t2 (
data JSON,
id INTEGER AS (JSON_EXTRACT(data,"$.id")) VIRTUAL,
KEY(id));
17
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Indexing JSON: STORED vs VIRTUAL columns
Pros Cons
STORED
• Can be primary key too
• All index types supported
• Looks like a normal field
• Slow ALTER TABLE
• Takes space on disk
VIRTUAL
• Instant ALTER TABLE
• Faster INSERT
• Looks like a normal field
• Secondary key only
• BTREE index only
18
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
How do you tell if an JSON index is used ?
> EXPLAIN SELECT data FROM t1 WHERE JSON_EXTRACT(data,"$.series")
BETWEEN 3 AND 5;
+----+----------------+--------+---------------+--------+…+------------------------------+
| id | select_type | table | partitions | type | | Extra |
+----+----------------+--------+---------------+--------+…+------------------------------+
| 1 | SIMPLE | t1 | NULL | range | | Using index condition |
+----+----------------+--------+---------------+--------+…+------------------------------+
19
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Or this way ….
20
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Or maybe this way ?
21
ALTER TABLE features ADD feature_type VARCHAR(30) AS (feature->"$.type") VIRTUAL;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
ALTER TABLE features ADD INDEX (feature_type);
Query OK, 0 rows affected (0.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
SELECT DISTINCT feature_type FROM features;
+-------------------+
| feature_type |
+-------------------+
| "Feature" |
+-------------------+
1 row in set (0.06 sec)
From table scan on 206K documents to index scan on 206K materialized values
Down from 1.25s !
Meta data change only (FAST).
Does not need to touch table.
Online CREATE INDEX !
No rows were
modified.
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Roadmap
• Online alter for virtual columns
• Advanced JSON functions
• In-place update of JSON/BLOB
• Full text and GIS index on virtual columns
• Improved performance through condition pushdown
22
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Questions ?
@gkodinov, georgi.kodinov@oracle.com if you forget !
23
Copyright © 2015, Oracle and/or its affiliates. All rights reserved.
Safe Harbor Statement
The preceding 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.
24
Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 25

More Related Content

PDF
Using JSON with MariaDB and MySQL
PPTX
Php forum2015 tomas_final
PDF
Cassandra 3.0 - JSON at scale - StampedeCon 2015
PPTX
Slick: Bringing Scala’s Powerful Features to Your Database Access
PDF
Brief introduction of Slick
PDF
Out ofmemoryerror what is the cost of java objects
PDF
Apache cassandra in 2016
Using JSON with MariaDB and MySQL
Php forum2015 tomas_final
Cassandra 3.0 - JSON at scale - StampedeCon 2015
Slick: Bringing Scala’s Powerful Features to Your Database Access
Brief introduction of Slick
Out ofmemoryerror what is the cost of java objects
Apache cassandra in 2016

What's hot (20)

PDF
Cassandra 3.0
PDF
Diving into MySQL 5.7: advanced features
PDF
CQL performance with Apache Cassandra 3.0 (Aaron Morton, The Last Pickle) | C...
PPTX
Cassandra 2.2 & 3.0
PDF
ROracle
PDF
The Ring programming language version 1.7 book - Part 31 of 196
PDF
Cloudera Impala, updated for v1.0
PDF
Next Top Data Model by Ian Plosker
PDF
The Ring programming language version 1.10 book - Part 36 of 212
PPTX
Validating JSON -- Percona Live 2021 presentation
PPTX
Discover the Power of the NoSQL + SQL with MySQL
PDF
The Ring programming language version 1.5.1 book - Part 26 of 180
PDF
Polyglot Persistence
PDF
Datacon LA - MySQL without the SQL - Oh my!
PDF
Data Love Conference - Window Functions for Database Analytics
PDF
SunshinePHP 2017 - Making the most out of MySQL
PDF
Json within a relational database
PDF
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
PDF
Scaling MySQL Strategies for Developers
Cassandra 3.0
Diving into MySQL 5.7: advanced features
CQL performance with Apache Cassandra 3.0 (Aaron Morton, The Last Pickle) | C...
Cassandra 2.2 & 3.0
ROracle
The Ring programming language version 1.7 book - Part 31 of 196
Cloudera Impala, updated for v1.0
Next Top Data Model by Ian Plosker
The Ring programming language version 1.10 book - Part 36 of 212
Validating JSON -- Percona Live 2021 presentation
Discover the Power of the NoSQL + SQL with MySQL
The Ring programming language version 1.5.1 book - Part 26 of 180
Polyglot Persistence
Datacon LA - MySQL without the SQL - Oh my!
Data Love Conference - Window Functions for Database Analytics
SunshinePHP 2017 - Making the most out of MySQL
Json within a relational database
Longhorn PHP - MySQL Indexes, Histograms, Locking Options, and Other Ways to ...
Scaling MySQL Strategies for Developers

Viewers also liked (9)

PDF
Inexpensive Datamasking for MySQL with ProxySQL - data anonymization for deve...
PDF
MariaDB - Fast, Easy & Strong - Get Started Tutorial
PDF
MySQL Day Paris 2016 - MySQL Enterprise Edition
PDF
ProxySQL - High Performance and HA Proxy for MySQL
PPTX
Proxysql use case scenarios fosdem17
PDF
MySQL Cloud Service Deep Dive
PDF
MySQL High Availability -- InnoDB Clusters
PDF
What you wanted to know about MySQL, but could not find using inernal instrum...
PDF
MySQL Day Paris 2016 - Introducing Oracle MySQL Cloud Service
Inexpensive Datamasking for MySQL with ProxySQL - data anonymization for deve...
MariaDB - Fast, Easy & Strong - Get Started Tutorial
MySQL Day Paris 2016 - MySQL Enterprise Edition
ProxySQL - High Performance and HA Proxy for MySQL
Proxysql use case scenarios fosdem17
MySQL Cloud Service Deep Dive
MySQL High Availability -- InnoDB Clusters
What you wanted to know about MySQL, but could not find using inernal instrum...
MySQL Day Paris 2016 - Introducing Oracle MySQL Cloud Service

Similar to BGOUG15: JSON support in MySQL 5.7 (20)

PPTX
MySQL Rises with JSON Support
PDF
Optimizer percona live_ams2015
PDF
MySQL 5.7 NF – JSON Datatype 활용
PDF
MySQL 5.7 + JSON
PDF
Modern query optimisation features in MySQL 8.
PDF
MySQL 5.7 Tutorial Dutch PHP Conference 2015
PDF
MySQL 5.7. Tutorial - Dutch PHP Conference 2015
PDF
NoSQL для PostgreSQL: Jsquery — язык запросов
PPTX
The rise of json in rdbms land jab17
PDF
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
PDF
Json improvements in my sql 8.0
PDF
[OSC 2020 Online/Nagoya] MySQLドキュメントストア
PPTX
Starting with JSON Path Expressions in Oracle 12.1.0.2
PPTX
JSON improvements in MySQL 8.0
PPT
Short Intro to PHP and MySQL
PPTX
PostgreSQL 9.4 JSON Types and Operators
PDF
How to Use JSON in MySQL Wrong
PDF
03 2017Emea_RoadshowMilan-WhatsNew-Mariadbserver10_2andmaxscale 2_1
PPTX
Power JSON with PostgreSQL
 
PPT
Micro-ORM Introduction - Don't overcomplicate
MySQL Rises with JSON Support
Optimizer percona live_ams2015
MySQL 5.7 NF – JSON Datatype 활용
MySQL 5.7 + JSON
Modern query optimisation features in MySQL 8.
MySQL 5.7 Tutorial Dutch PHP Conference 2015
MySQL 5.7. Tutorial - Dutch PHP Conference 2015
NoSQL для PostgreSQL: Jsquery — язык запросов
The rise of json in rdbms land jab17
CREATE INDEX … USING VODKA. VODKA CONNECTING INDEXES, Олег Бартунов, Александ...
Json improvements in my sql 8.0
[OSC 2020 Online/Nagoya] MySQLドキュメントストア
Starting with JSON Path Expressions in Oracle 12.1.0.2
JSON improvements in MySQL 8.0
Short Intro to PHP and MySQL
PostgreSQL 9.4 JSON Types and Operators
How to Use JSON in MySQL Wrong
03 2017Emea_RoadshowMilan-WhatsNew-Mariadbserver10_2andmaxscale 2_1
Power JSON with PostgreSQL
 
Micro-ORM Introduction - Don't overcomplicate

Recently uploaded (20)

PPTX
Greedy best-first search algorithm always selects the path which appears best...
PPTX
MCP empowers AI Agents from Zero to Production
PDF
Understanding the Need for Systemic Change in Open Source Through Intersectio...
PPTX
Folder Lock 10.1.9 Crack With Serial Key
PPTX
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
PDF
Building an Inclusive Web Accessibility Made Simple with Accessibility Analyzer
PPTX
ESDS_SAP Application Cloud Offerings.pptx
PDF
Beginner’s Guide to Kentico Xperience Step by Step.pdf
PDF
Mobile App for Guard Tour and Reporting.pdf
PPTX
SAP Business AI_L1 Overview_EXTERNAL.pptx
PDF
Top 10 Project Management Software for Small Teams in 2025.pdf
PPTX
Lesson-3-Operation-System-Support.pptx-I
PPTX
FLIGHT TICKET API | API INTEGRATION PLATFORM
PDF
Difference Between Website and Web Application.pdf
PDF
OpenEXR Virtual Town Hall - August 2025
PPT
3.Software Design for software engineering
PPTX
AI Tools Revolutionizing Software Development Workflows
PDF
Streamlining Project Management in Microsoft Project, Planner, and Teams with...
PDF
OpenImageIO Virtual Town Hall - August 2025
PPTX
Bandicam Screen Recorder 8.2.1 Build 2529 Crack
Greedy best-first search algorithm always selects the path which appears best...
MCP empowers AI Agents from Zero to Production
Understanding the Need for Systemic Change in Open Source Through Intersectio...
Folder Lock 10.1.9 Crack With Serial Key
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Building an Inclusive Web Accessibility Made Simple with Accessibility Analyzer
ESDS_SAP Application Cloud Offerings.pptx
Beginner’s Guide to Kentico Xperience Step by Step.pdf
Mobile App for Guard Tour and Reporting.pdf
SAP Business AI_L1 Overview_EXTERNAL.pptx
Top 10 Project Management Software for Small Teams in 2025.pdf
Lesson-3-Operation-System-Support.pptx-I
FLIGHT TICKET API | API INTEGRATION PLATFORM
Difference Between Website and Web Application.pdf
OpenEXR Virtual Town Hall - August 2025
3.Software Design for software engineering
AI Tools Revolutionizing Software Development Workflows
Streamlining Project Management in Microsoft Project, Planner, and Teams with...
OpenImageIO Virtual Town Hall - August 2025
Bandicam Screen Recorder 8.2.1 Build 2529 Crack

BGOUG15: JSON support in MySQL 5.7

  • 1. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. | JSON Support in MySQL 5.7 Georgi “Joro” Kodinov Team lead, MySQL server general team
  • 2. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Agenda 2  The new JSON data type  Inlined JSON path expressions  The new JSON functions  Indexing JSON data
  • 3. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. CREATE TABLE employees (data JSON); INSERT INTO employees VALUES ('{"id": 1, "name": "Jane"}'), ('{"id": 2, "name": "Joe"}'); SELECT * FROM employees; +-------------------------------------+ | data | +-------------------------------------+ | {"id": 1, "name": "Jane"} | | {"id": 2, "name": "Joe"} | +-------------------------------------+ • Validation on INSERT • No reparsing on SELECT • Dictionary of fields • Fields are sorted • Can compare JSON/SQL • Can convert JSON/SQL • Supports all native JSON datatypes • Also supports date, time, timestamp etc. 3 The New JSON Datatype
  • 4. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. JSON vs TEXT columns Pros Cons JSON • Validate once • Fast access • Can update in-place • Slower to insert • Unreadable as is • Sets certain limitations on JSON TEXT • Fast to insert • Human readable • Requires manual validation • Requires manual parsing • Harder to update 4
  • 5. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Beware: SQL vs JSON comparisons ! 5 SQL JSON create table t1 (data json); create table t2 ( id integer, data varchar(20)); insert into t1 values ('{ "id": 1, "data": "1" }'), ('{ "id": 2, "data": "3" }'); insert into t2 values (1, '1'), (2, '3'); select count(*) from t1 where data->'$.id' = data->'$.data'; select count(*) from t2 where id = data; 0 rows ! 1 row !
  • 6. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Agenda 6  The new JSON data type  Inlined JSON path expressions  The new JSON functions  Indexing JSON data
  • 7. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Inlined JSON Path Expressions • <field>->'<JSON path expression>' e.g. data->'$.some.key[3].from.doc' • Syntax sugar over JSON_EXTRACT function • SELECT * FROM employees WHERE data->'$.id'= 2; • ALTER … ADD COLUMN id INT AS (data->'$.id') … • CREATE VIEW .. AS SELECT data->'$.id', data->'$.name' FROM … • UPDATE employees SET data->'$.name'=‘John' WHERE … Not yet!
  • 8. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Limitations of Inlined JSON Path Expressions Inlined JSON path JSON_EXTRACT() Data source Field Any JSON value Path expression SQL Constant SQL Expression # of expressions One Multiple
  • 9. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Supported JSON Paths [[[database.]table.]column]$<path spec> Expression Example [ [ [database.] table.] field]$ db.phonebook.data$ $ Current document’s root $.identifier $.user.address.street [array] $.user.addresses[2].street .* and [*] $.user.addresses[*].street ** $.user**.phone Not yet!
  • 10. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Agenda 10  The new JSON data type  Inlined JSON path expressions  The new JSON functions  Indexing JSON data
  • 11. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. New functions to handle JSON data Example Result SELECT JSON_VALID('{ "a":1 }'); 1 SELECT JSON_TYPE('[ 1, 2, 3 ]'); ARRAY SELECT JSON_KEYS('{ "a":1, "b": 2 }'); ["a", "b"] SELECT JSON_LENGTH('[ 1, 2, 3 ]'); 3 SELECT JSON_DEPTH('{ "a":{ "c": 1 }, "b": 2 }'); 3 11 Information
  • 12. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. New functions to handle JSON data Example Result SELECT JSON_REMOVE('{ "a":1, "b": 2 }', '$.a'); {"b": 2} SELECT JSON_ARRAY_APPEND('[1,[2,3],4]', '$[1]', 5); [1, [2, 3, 5], 4] SELECT JSON_SET('{ "a":1 }', '$.c', 3); {"a": 1, “c": 3} SELECT JSON_INSERT('{ "a":1 }', '$.b', 4); {"a": 1, "b": 4} SELECT JSON_REPLACE('{ "a":1, "b": 2 }', '$.b', 3); {"a": 1, "b": 3} SELECT JSON_MERGE('{ "a": 1 }', '{"b":2}'); {"a": 1, "b": 2} SELECT JSON_UNQUOTE('"abc"'); abc 12 Modification
  • 13. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. New functions to handle JSON data Example Result SELECT JSON_ARRAY(1, '2', null, true); [1, "2", null, true] SELECT JSON_OBJECT(1, 2, '3', true); {"1": 2, "3": true} SELECT JSON_QUOTE('"null"'); ""null"" 13 Create JSON objects
  • 14. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. New functions to handle JSON data Example Result SELECT JSON_CONTAINS_PATH( '{ "a":{ "c": 1 }, "b": 2 }', 'one', '$.a.c'); 1 SELECT JSON_CONTAINS( '{"a": 1, "b": "2" }', '1', '$.a'); 1 SELECT JSON_EXTRACT('{"a": 1, "n": { "b": 2}}', '$.n'); {"b": 2} SELECT JSON_SEARCH( '{"a": "1", "b": "2" }', 'one', 2); "$.b" 14 Search in JSON data
  • 15. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. New functions to handle JSON data 15 Further reading: http://dev.mysql.com/doc/refman/5.7/en/
  • 16. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Agenda 16  The new JSON data type  Inlined JSON path expressions  The new JSON functions  Indexing JSON data
  • 17. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Indexing JSON Data • Use Functional Indexes – Both STORED and VIRTUAL types are supported • Examples: – CREATE TABLE t1 ( data JSON, id INTEGER AS (JSON_EXTRACT(data,"$.id")) STORED, PRIMARY KEY(id)); – CREATE TABLE t2 ( data JSON, id INTEGER AS (JSON_EXTRACT(data,"$.id")) VIRTUAL, KEY(id)); 17
  • 18. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Indexing JSON: STORED vs VIRTUAL columns Pros Cons STORED • Can be primary key too • All index types supported • Looks like a normal field • Slow ALTER TABLE • Takes space on disk VIRTUAL • Instant ALTER TABLE • Faster INSERT • Looks like a normal field • Secondary key only • BTREE index only 18
  • 19. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. How do you tell if an JSON index is used ? > EXPLAIN SELECT data FROM t1 WHERE JSON_EXTRACT(data,"$.series") BETWEEN 3 AND 5; +----+----------------+--------+---------------+--------+…+------------------------------+ | id | select_type | table | partitions | type | | Extra | +----+----------------+--------+---------------+--------+…+------------------------------+ | 1 | SIMPLE | t1 | NULL | range | | Using index condition | +----+----------------+--------+---------------+--------+…+------------------------------+ 19
  • 20. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Or this way …. 20
  • 21. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Or maybe this way ? 21 ALTER TABLE features ADD feature_type VARCHAR(30) AS (feature->"$.type") VIRTUAL; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0 ALTER TABLE features ADD INDEX (feature_type); Query OK, 0 rows affected (0.73 sec) Records: 0 Duplicates: 0 Warnings: 0 SELECT DISTINCT feature_type FROM features; +-------------------+ | feature_type | +-------------------+ | "Feature" | +-------------------+ 1 row in set (0.06 sec) From table scan on 206K documents to index scan on 206K materialized values Down from 1.25s ! Meta data change only (FAST). Does not need to touch table. Online CREATE INDEX ! No rows were modified.
  • 22. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Roadmap • Online alter for virtual columns • Advanced JSON functions • In-place update of JSON/BLOB • Full text and GIS index on virtual columns • Improved performance through condition pushdown 22
  • 23. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Questions ? @gkodinov, [email protected] if you forget ! 23
  • 24. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. Safe Harbor Statement The preceding 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. 24
  • 25. Copyright © 2015, Oracle and/or its affiliates. All rights reserved. 25

Editor's Notes

  • #22: Create an index on type field, first create a virtual column by extracting the type field, and then create an index on this virtual column. Run the same query as before. Execution time goes 1.25 sec down to 0.06 sec. Still has to examine full index, but now it is just an index of the values all extracted. It is much smaller.