converge -- mysql workshop
DESCRIPTION
Slides from the Converge Conference August 16th 2014 MySQL WorkshopTRANSCRIPT
![Page 2: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/2.jpg)
Databases Can Be a Mystery, Misery, or Magnificent
● You do not need to be a DBA
● Nothing wrong with being a DBA● You should think in sets
● 'Relational Calculus for $500, Alex.'● Let the Database do the Heavy Lifting
● Check Return Codes!!!● Select What you need for speed
● Yes, YOU do need to do backups● And know how to restore from them
![Page 3: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/3.jpg)
SQL Structured Query Language
Structured Query Language (/ˈɛs kjuː ˈɛl/,[4] or /ˈsiːkwəl/; (SQL)[5][6][7][8]) is a
special-purpose programming language designed for managing data held in a
relational database management system (RDBMS).
Originally based upon relational algebra and tuple relational calculus, SQL consists of a
data definition language and a data manipulation language. The scope of SQL includes data insert, query,
update and delete, schema creation and modification, and data access control. Although SQL is often
described as, and to a great extent is, a declarative language (4GL), it also includesprocedural elements.
relational algebra is an offshoot of first-order logic and of algebra of sets concerned with operations over
finitary relations, usually made more convenient to work with by identifying the components of a tuple by a
name (called attribute) rather than by a numeric column index, which is called a relation in database
terminology.
--Wikipedia
![Page 4: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/4.jpg)
![Page 5: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/5.jpg)
You send SQL to the server …
The mysqld process will take your input and parse it for VALID syntax.
Then it will build a query plan on how best to retrieve the data.
Finally it goes to fetch the data.
MySQL’s NoSQL queries that skip these steps are MUCH faster – 9 times faster!
![Page 6: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/6.jpg)
GOALs
1. Get the data that you need and only what you need as fast as possible. No ‘SELECT * FROM’
2. Avoid unnecessary disk/memory reads and disk writes.
3. Make data as compact as is useful, no BIGINTs for age.
18,446,744,073,709,551,615 is pretty old!
![Page 7: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/7.jpg)
Integers
Type Storage (bytes)
Minimum Signed
Maximum Signed
Minimum Unsigned
Maximum Unsigned
TINYINT 1 -128 127 0 255
SMALLINT 2 -32768 32768 0 65535
MEDIUMINT
3 -8388608 8388607 0 16777215
INT 4 -2147483648 2147483647 0 4294967295
BIGINT 8 -9223372036854
775808
9223372036854775807
0 18446744073709551615
Are you really going to have 18,446,744,073,709,551,615 customer id numbers?
![Page 8: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/8.jpg)
Cost Based Optimizer
C.5.6. Optimizer-Related Issues
MySQL uses a cost-based optimizer to determine the best way to resolve a query. In many cases, MySQL can
calculate the best possible query plan, but sometimes MySQL does not have enough information about the
data at hand and has to make “educated” guesses about the data.
So MySQL wants to get your data as cheaply as possible and plans accordingly.
![Page 9: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/9.jpg)
Query Plan not lockable with MySQL
Each time MySQL gets a query it will optimize it!
It builds a list of statistics over time to help keep track of data & speed retrieval of the data (5.6 lets you save/restore this information)
Clue: You want FAST!
![Page 10: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/10.jpg)
EXPLAIN
EXPLAIN is a tool to ask the server how it wants to optimize the query.
Prepend to a QUERY
![Page 11: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/11.jpg)
Example Table
![Page 12: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/12.jpg)
Example Query
![Page 13: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/13.jpg)
Example EXPLAIN
![Page 14: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/14.jpg)
Example EXPLAIN with \G
Read ALL rows in table
![Page 15: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/15.jpg)
A Quick Word on Indexes
Indexes allow you to go directly to the record(s) you want (think SSN) instead of reading all records to find the one(s) wanted.
But they require maintenance and overhead.
Not a panacea!
![Page 16: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/16.jpg)
What the heck is a B-Tree?!??!?!
![Page 17: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/17.jpg)
Using WHERE
274 Records Read!
![Page 18: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/18.jpg)
Previous query w/o INDEX
No index used and all records in table readto find 274 records
![Page 19: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/19.jpg)
How to find index(es) already in use
![Page 20: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/20.jpg)
OR ...
\G forVertical
![Page 21: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/21.jpg)
A more common example
Optimizer estimates 8 reads to get desired info
Could use the PRIMARY key but does not!!
Has to read all records
239 x 8 = 1,912 records to read
![Page 22: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/22.jpg)
Slightly more complex query
SELECT a.Name as 'City',
b.Name as 'Country',
a.population
FROM City a
JOIN Country b
ON (a.CountryCode = b.Code)
WHERE a.population > 3000000
AND b.LifeExpectancy > 66
ORDER BY b.name, a.Population
LIMIT 20;
![Page 23: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/23.jpg)
Gee, we add all those qualifiersand it still has to readAll those records AND we get a temp table plus a file sort!
And we ONLY wanted 20 records!!!
![Page 24: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/24.jpg)
Visual Explain
MySQL 5.6 and
Workbench 6.1 use
JSON format output
to generate diagram.
Costs published with
5.7 and 6.1!
![Page 25: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/25.jpg)
Yet a little deeper into complexitySELECT CONCAT(customer.last_name, ', ', customer.first_name) AS customer,
address.phone, film.title
FROM rental INNER JOIN customer ON rental.customer_id = customer.customer_id
INNER JOIN address ON customer.address_id = address.address_id
INNER JOIN inventory ON rental.inventory_id = inventory.inventory_id
INNER JOIN film ON inventory.film_id = film.film_id
WHERE rental.return_date IS NULL
AND rental_date + INTERVAL film.rental_duration DAY < CURRENT_DATE()
LIMIT 5;
![Page 26: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/26.jpg)
****
****
****
****
****
****
***
1. r
ow *
****
****
****
****
****
****
**
id
: 1 s
ele
ct_t
ype
: SIM
PL
E
t
abl
e: f
ilm
type
: ALL
poss
ible
_key
s: P
RIM
AR
Y
key
: NU
LL
key
_len
: NU
LL
re
f: N
UL
L
ro
ws:
100
0
Ext
ra: N
ULL
****
****
****
****
****
****
***
2. r
ow *
****
****
****
****
****
****
**
id
: 1 s
ele
ct_t
ype
: SIM
PL
E
tabl
e: i
nven
tory
ty
pe: r
efpo
ssib
le_k
eys:
PR
IMA
RY,
idx_
fk_f
ilm_i
d
ke
y: id
x_fk
_film
_id
key
_len
: 2
re
f: s
akila
.film
.film
_id
r
ow
s: 2
E
xtra
: Usi
ng in
dex
****
****
****
****
****
****
***
3. r
ow *
****
****
****
****
****
****
**
id
: 1 s
ele
ct_
type
: SIM
PL
E
tab
le: r
ent
al
ty
pe: r
efpo
ssib
le_k
eys:
idx_
fk_i
nve
ntor
y_id
,idx_
fk_c
ust
omer
_id
key:
idx_
fk_i
nven
tory
_id
key
_len
: 3
re
f: s
akila
.inve
ntor
y.in
vent
ory
_id
r
ow
s: 1
E
xtra
: Usi
ng w
here
****
****
****
****
****
****
***
4. r
ow *
****
****
****
****
****
****
**
id
: 1 s
ele
ct_t
ype
: SIM
PL
E
t
abl
e: c
usto
mer
ty
pe: e
q_re
fpo
ssib
le_k
eys:
PR
IMA
RY,
idx_
fk_a
ddre
ss_
id
ke
y: P
RIM
AR
Y
k
ey_l
en: 2
ref:
sak
ila.r
enta
l.cus
tom
er_
id
ro
ws:
1
Ext
ra: N
ULL
****
****
****
****
****
****
***
5. r
ow *
****
****
****
****
****
****
**
id
: 1 s
ele
ct_t
ype
: SIM
PL
E
tabl
e: a
ddre
ss
type
: eq_
ref
poss
ible
_key
s: P
RIM
AR
Y
ke
y: P
RIM
AR
Y
k
ey_l
en: 2
ref:
sak
ila.c
usto
me
r.add
ress
_id
r
ow
s: 1
E
xtra
: NU
LL5
row
s in
se
t (0
.00
sec
)
![Page 27: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/27.jpg)
A little easier to understand
![Page 28: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/28.jpg)
Compound Indexes
We can use this index searching on
1. City, State, and Zip
2. City, State
3. City
![Page 29: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/29.jpg)
Covering Indexes
ALTER TABLE city ADD INDEX country_idx (CountryCode, Population);
The INDEX contains all the data we are searching for which means less data to look-up,
one less read into the data
![Page 30: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/30.jpg)
Musts for better queries
1. Read chapter 8 of the MySQL Manual
2. Join on like data types, INTs with INTS
3. Keep columns as small as practical (PROCEDURE ANALYSE)
4. Maintain B-tree index with ANALYSE TABLE when things are quiet
5. Keep looking for improvments
![Page 31: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/31.jpg)
Check Return Codes (please)<?php$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit();}
if (!mysqli_query($link, "SET a=1")) { printf("Errorcode: %d\n", mysqli_errno($link));}
![Page 32: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/32.jpg)
Hard to teach all in a few minutes
![Page 33: Converge -- MySQL Workshop](https://reader034.vdocuments.net/reader034/viewer/2022050920/54b6eac74a7959aa3d8b47e5/html5/thumbnails/33.jpg)
MySQL Central @ Oracle Open WorldMySQL Central @ Oracle Open World
Five days with the MySQL Engineers, innovative customers (Facebook, Twitter, Playful Play, Booking, DropBox, Paypal, & you), and the top professionals from the MySQL Community.
Starts September 28th in San Francisco!