combining the power of sql and nosql databases … the power of sql and nosql databases with mysql...

53
Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | Combining the Power of SQL and NoSQL Databases with MySQL Nitin Mehta Principal Technical Consultant – MySQL MySQL Global Business Unit August 10, 2017 Oracle Code – Bengaluru

Upload: truongkien

Post on 04-Apr-2018

247 views

Category:

Documents


1 download

TRANSCRIPT

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Combining the Power of SQL and NoSQL Databases with MySQL

Nitin Mehta Principal Technical Consultant – MySQL MySQL Global Business Unit August 10, 2017

Oracle Code – Bengaluru

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Safe Harbor Statement

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

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Today’s Agenda

3

Introduction

MySQL – a Document Store

Use Cases

1

2

3

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL: Ubiquity & Market Share

4

MySQL is the 2nd most popular database!

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 5

More Jobs than Developers/DBAs • Growing Demand

Source: StackOverflow, Developer Hiring Trends in 2017

More Developers/DBAs than Jobs

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL Powers the Web

6

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

1. Google

2. Facebook

3. YouTube

4. Baidu

5. Yahoo!

6. Amazon

7. Wikipedia

8. QQ

9. Google.co.in

10. Twitter

11. Live.com

12. Taobao

13. Msn.com

14. Yahoo.co.jp

15. Sina

16. Linkedin.com

17. Google.co.jp

18. Weibo

19. Bing.com

20. Yandaz.ru

Global Top 20 Sites: Powered by MySQL

Source: Wikipedia 2016

7

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL Powers Social

8

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL Powers eCommerce

9

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL Powers Unicorns

10

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL Powers the Cloud

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 12

MySQL 5.7 GA – October 2015

Enhanced InnoDB: faster online & bulk load operations

Replication Improvements (incl. multi-source, multi-threaded slaves...)

New Optimizer Cost Model: greater user control & better query performance

Performance Schema Improvements

MySQL SYS Schema

Performance & Scalability Manageability

3 X Faster than MySQL 5.6

Improved Security: safer initialization, setup & management

Native JSON Support

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Today’s Agenda

13

Introduction

MySQL – a Document Store

Use Cases

1

2

3

2

1

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL as a Document Store – a FULL Stack

• Core New JSON Features

• Interactive Shell “MySQL Shell” – Javascript, Python, SQL modes

• Connectors include NoSQL CRUD APIs

– Java, New NodeJS, NET, C++/C, PHP, Python

– Method Chaining and Pipelining

– Supports Combined Document and Relational

14

Store, Retrieve, Search and Managing JSON documents

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Core New JSON features in MySQL 5.7

1. Native JSON datatype

2. JSON Functions

3. Generated Columns

4. JSON Comparator

15

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

The JSON Type

16

CREATE TABLE employees (data JSON);

INSERT INTO employees VALUES ('{"id": 1, "name": "Jane"}');

INSERT INTO employees VALUES ('{"id": 2, "name": "Joe"}');

SELECT * FROM employees;

+---------------------------+

| data |

+---------------------------+

| {"id": 1, "name": "Jane"} |

| {"id": 2, "name": "Joe"} |

+---------------------------+

2 rows in set (0,00 sec)

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Type Tech Specs

• utf8mb4 character set

• Optimized for read intensive workload

• Parse and validation on insert only

• Fast access to array cells by index

17

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Type Tech Specs (cont.)

• Supports all native JSON types

• Numbers, strings, bool

• Objects, arrays

• Extended • Date, time, datetime, timestamp

• Other

18

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Advantages over TEXT/VARCHAR

1. Provides Document Validation:

2. Efficient Binary Format Allows quicker access to object members and array elements

19

INSERT INTO employees VALUES ('some random text');

ERROR 3130 (22032): Invalid JSON text: "Expect a value

here." at position 0 in value (or column) 'some random

text'.

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Using Real Life Data

• Via SF OpenData

• 206K JSON objects representing subdivision parcels.

20

CREATE TABLE features (

id INT NOT NULL auto_increment primary key,

feature JSON NOT NULL

);

http://mysqlserverteam.com/taking-the-new-mysql-5-7-json-features-for-a-test-drive/

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. | 21

{

"type":"Feature",

"geometry":{

"type":"Polygon",

"coordinates":[

[

[-122.42200352825247,37.80848009696725,0],

[-122.42207601332528,37.808835019815085,0],

[-122.42110217434865,37.808803534992904,0],

[-122.42106256906727,37.80860105681814,0],

[-122.42200352825247,37.80848009696725,0]

]

]

},

"properties":{

"TO_ST":"0",

"BLKLOT":"0001001",

"STREET":"UNKNOWN",

"FROM_ST":"0",

"LOT_NUM":"001",

"ST_TYPE":null,

"ODD_EVEN":"E",

"BLOCK_NUM":"0001",

"MAPBLKLOT":"0001001"

}

}

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Functions

22

SET @document = '[10, 20, [30, 40]]';

SELECT JSON_EXTRACT(@document, '$[1]');

+---------------------------------+

| JSON_EXTRACT(@document, '$[1]') |

+---------------------------------+

| 20 |

+---------------------------------+

1 row in set (0.01 sec)

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON_EXTRACT

• Accepts a JSON Path, which is similar to a selector:

• JSON_EXTRACT also supports two short hand operators: column_name->"$.type" (extract) column_name->>"$.type" (extract + unquote)

23

$("#type") JSON_EXTRACT (column_name, "$.type")

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

SELECT DISTINCT JSON_EXTRACT(feature,

"$.type") as feature_type FROM features;

+--------------+

| feature_type |

+--------------+

| "Feature" |

+--------------+

1 row in set (1.00 sec)

24

JSON Shorthand Operators Explained

SELECT DISTINCT feature->"$.type" as

feature_type FROM features;

+--------------+

| feature_type |

+--------------+

| "Feature" |

+--------------+

1 row in set (0.99 sec)

SELECT DISTINCT

JSON_UNQUOTE(JSON_EXTRACT(feature,

"$.type")) as feature_type FROM features; +--------------+ | feature_type | +--------------+ | Feature | +--------------+ 1 row in set (1.06 sec)

SELECT DISTINCT feature->>"$.type" as

feature_type FROM features;

+--------------+

| feature_type |

+--------------+

| Feature |

+--------------+

1 row in set (1.02 sec)

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Basic Find a Record

25

SELECT * FROM features

WHERE feature->"$.properties.STREET" = 'MARKET'

LIMIT 1\G

************************* 1. row *************************

id: 12250

feature: {"type": "Feature", "geometry": {"type": "Polygon",

"coordinates": [[[-122.39836263491878, 37.79189388899312, 0],

[-122.39845248797837, 37.79233030084018, 0], [-

122.39768507706792, 37.7924280850133, 0], [-

122.39836263491878, 37.79189388899312, 0]]]}, "properties":

{"TO_ST": "388", "BLKLOT": "0265003", "STREET": "MARKET",

"FROM_ST": "388", "LOT_NUM": "003", "ST_TYPE": "ST",

"ODD_EVEN": "E", "BLOCK_NUM": "0265", "MAPBLKLOT":

"0265003"}}

1 row in set (0.02 sec)

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Find where not exists

26

SELECT * FROM features

WHERE feature->"$.properties.STREET" IS NULL

LIMIT 1\G

Empty set (0.39 sec)

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Naive Performance Comparison

27

Unindexed traversal of 206K documents

# as JSON type

SELECT DISTINCT

feature->>"$.type" as json_extract

FROM features;

+--------------+

| json_extract |

+--------------+

| Feature |

+--------------+

1 row in set (1.25 sec)

# as TEXT type

SELECT DISTINCT

feature->>"$.type" as json_extract

FROM features;

+--------------+

| json_extract |

+--------------+

| Feature |

+--------------+

1 row in set (12.85 sec)

Using short cut for JSON_UNQUOTE + JSON_EXTRACT.

Explanation: Binary format of JSON type is very efficient at searching. Storing as TEXT performs over 10x worse at traversal.

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Introducing Generated Columns

28

CREATE TABLE t1 (

id INT NOT NULL PRIMARY KEY auto_increment,

my_integer INT,

my_integer_plus_one INT AS (my_integer+1)

);

UPDATE t1 SET my_integer_plus_one = 10 WHERE id = 1;

ERROR 3105 (HY000): The value specified for generated

column 'my_integer_plus_one' in table 't1' is not

allowed.

Column automatically maintained based on your specification.

Read-only of course

Id my_integer my_integer_plus_one

1 10 11

2 20 21

3 30 31

4 40 41

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Generated Columns Support Indexes!

29

From table scan on 206K documents to index scan on 206K materialized values

ALTER TABLE features ADD feature_type VARCHAR(30) AS

(feature->"$.type");

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)

Meta data change only (FAST). Does not need to touch table.

Creates index only. Does not modify table rows.

Down from 1.25 sec to 0.06 sec

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Generated Columns (cont.)

• Used for “functional index”

• Available as either VIRTUAL (default) or STORED:

• Both types of computed columns permit for indexes to be added.

30

ALTER TABLE features ADD feature_type varchar(30) AS

(feature->"$.type") STORED;

Query OK, 206560 rows affected (4.70 sec)

Records: 206560 Duplicates: 0 Warnings: 0

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Indexing Options Available

31

STORED VIRTUAL

Primary and Secondary

BTREE, Fulltext, GIS

Mixed with fields

Requires table rebuild

Not Online

Secondary Only

BTREE Only

Mixed with fields

No table rebuild

INSTANT Alter

Faster Insert

Bottom Line: Unless you need a PRIMARY KEY, FULLTEXT or GIS index VIRTUAL is probably better.

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Path Search

• Provides a novice way to know the path. To retrieve via: [[database.]table.]column->"$<path spec>"

32

SELECT JSON_SEARCH(feature,

'one', 'MARKET') AS

extract_path

FROM features

WHERE id = 121254;

+-----------------------+

| extract_path |

+-----------------------+

| "$.properties.STREET" |

+-----------------------+

1 row in set (0.00 sec)

SELECT

feature-

>"$.properties.STREET"

AS property_street

FROM features

WHERE id = 121254;

+-----------------+

| property_street |

+-----------------+

| "MARKET" |

+-----------------+

1 row in set (0.00 sec)

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Create JSON_OBJECT

33

SELECT JSON_OBJECT('id', id,

'street', feature->"$.properties.STREET",

'type', feature->"$.type"

) AS json_object

FROM features ORDER BY RAND() LIMIT 3;

+--------------------------------------------------------+

| json_object |

+--------------------------------------------------------+

| {"id": 122976, "type": "Feature", "street": "RAUSCH"} |

| {"id": 148698, "type": "Feature", "street": "WALLACE"} |

| {"id": 45214, "type": "Feature", "street": "HAIGHT"} |

+--------------------------------------------------------+

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Create JSON_ARRAY

34

SELECT JSON_REPLACE(feature, '$.type', JSON_ARRAY('feature', 'bug')) as

json_object FROM features LIMIT 1;

+--------------------------------------------------------+

| json_object |

+--------------------------------------------------------+

| {"type": ["feature", "bug"], "geometry": {"type": ..}} |

+--------------------------------------------------------+

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Functions

• 5.7 supports functions to CREATE, SEARCH, MODIFY and RETURN JSON values:

35

JSON_ARRAY_APPEND()

JSON_ARRAY_INSERT()

JSON_ARRAY()

JSON_CONTAINS_PATH()

JSON_CONTAINS()

JSON_DEPTH()

JSON_EXTRACT()

JSON_INSERT()

JSON_KEYS()

JSON_LENGTH()

JSON_MERGE()

JSON_OBJECT()

JSON_QUOTE()

JSON_REMOVE()

JSON_REPLACE()

JSON_SEARCH()

JSON_SET()

JSON_TYPE()

JSON_UNQUOTE()

JSON_VALID()

https://dev.mysql.com/doc/refman/5.7/en/json-functions.html

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Comparator

36

SELECT CAST(1 AS JSON) = 1;

+---------------------+

| CAST(1 AS JSON) = 1 |

+---------------------+

| 1 |

+---------------------+

1 row in set (0.01 sec)

SELECT CAST('{"a": 10, "num": 1.1}' AS JSON) = CAST('{"num": 1.1, "a":10}' AS JSON);

+------------------------------------------------------------------------------+

| CAST('{"a": 10, "num": 1.1}' AS JSON) = CAST('{"num": 1.1, "a":10}' AS JSON) |

+------------------------------------------------------------------------------+

| 1 |

+------------------------------------------------------------------------------+

1 row in set (0.00 sec)

JSON value of 1 equals 1

JSON Objects Compare

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON Comparator (cont.)

37

Join JSON value to MySQL value

CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY, a INTEGER NOT NULL);

CREATE TABLE t2 (id INT NOT NULL PRIMARY KEY, doc JSON NOT NULL);

INSERT INTO t1 VALUES (1, 1), (2, 2);

INSERT INTO t2 VALUES (1, JSON_OBJECT('a', 1)), (2, JSON_OBJECT('a', 2));

SELECT t1.id, t1.a, t2.doc FROM t1 INNER JOIN t2 ON (t1.a=t2.doc->"$.a");

+----+---+----------+

| id | a | doc |

+----+---+----------+

| 1 | 1 | {"a": 1} |

| 2 | 2 | {"a": 2} |

+----+---+----------+

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

CRUD APIs with NoSQL

• Easy to learn

• Flexible, Schema-less Doc Support

SQL

• Powerful at “relationships”

• Strong Analytics

• Steeper learning curve

NoSQL & SQL

38

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

MySQL Documents and Collections

• Collections are containers for documents

– These documents share a purpose

– Possibly share one or more indexes

– Each collection has a unique name

– Exists within a single schema

• Within a Collection you can

– Add(), Find(), Modify(), and Remove() - JSON documents

• Collections can be

– Create(), List(), Drop()

39

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Collection Search – find(), bind(), fields() • Supports many operators to specify searches

– ||, &&, XOR, IS, NOT, BETWEEN, IN, LIKE, !=, <>, >, >=, <, <=, &, |, <<, >>, +, -, *, /, ~, %.

• Searching

– db.CountryInfo.find("GNP > 500000 and demographics.Population < 100000000")

– db.CountryInfo.find("GNP*1000000/demographics.Population > 30000")

• Binding - bind()

– db.CountryInfo.find("Name = :country").bind("country", "Italy")

• Project Results – fields() – returns specific fields

– db.CountryInfo.find("Name = :country").bind("country", "Italy")

40

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

CRUD Operations – NoSQL/Document and SQL/Relational

Operation Document Relational

Create Collection.add() Table.insert()

Read Collection.find() Table.select()

Update Collection.modify() Table.update()

Delete Collection.remove() Table.delete()

41

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

CRUD Operations NoSQL/Document Javascript Java

C# NodeJS

42

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

CRUD Operations SQL/Relational

Javascript Java

C# NodeJS

43

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Expression Strings

Simplifies coding by stinging together multiple expressions

For the apples collection find all red apples

44

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Today’s Agenda

45

Introduction

MySQL – a Document Store

Use cases

1

2 2

1

2

3

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON or Column?

• Up to you!

• Advantages to both approaches

46

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Storing as a Column

• Easier to apply a schema to your application

• Schema may make applications easier to maintain over time, as change is controlled;

• Do not have to expect as many permutations

• Allows some constraints over data

47

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Storing as JSON

• More flexible way to represent data that is hard to model in schema;

• Imagine you are a SaaS application serving many customers

• Strong use-case to support custom-fields

• Historically this may have used Entity–attribute–value model (EAV). Does not always perform well

48

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

JSON (cont.)

• Easier denormalization; an optimization that is important in some specific situations

• No painful schema changes*

• Easier prototyping

• Fewer types to consider

• No enforced schema, start storing values immediately

49

* MySQL 5.6+ has Online DDL. This is not as large of an issue as it was historically.

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Schema + Schemaless

50

SSDs have capacity_in_gb, CPUs have a core_count. These attributes are not consistent across products.

CREATE TABLE pc_components (

id INT NOT NULL PRIMARY KEY,

description VARCHAR(60) NOT NULL,

vendor VARCHAR(30) NOT NULL,

serial_number VARCHAR(30) NOT NULL,

attributes JSON NOT NULL

);

Copyright © 2017, Oracle and/or its affiliates. All rights reserved. |

Road Map

• In-place partial update of JSON/BLOB (performance)

• Partial streaming of JSON/BLOB (replication)

• Full text and GIS index on virtual columns • Currently works for "STORED"

• More Functions:

• Aggregate Functions

• Table Function

• Pretty print

• Binary Size / Binary Free

51

53