On October 23rd, 2014, we updated our
By continuing to use LinkedIn’s SlideShare service, you agree to the revised terms, so please take a few minutes to review them.
MySQL Basics Workshop
Databases Can Be a Mystery, Misery,
● 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
SQL Structured Query Language
Structured Query Language (/ˈɛs kjuː ˈɛl/, or /ˈsiːkwəl/; (SQL)) 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
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!
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
3. Make data as compact as is useful, no BIGINTs
18,446,744,073,709,551,615 is pretty old!
TINYINT 1 -128 127 0 255
SMALLINT 2 -32768 32768 0 65535
3 -8388608 8388607 0 16777215
INT 4 -2147483648 2147483647 0 4294967295
BIGINT 8 -
Are you really going to have 18,446,744,073,709,551,615 customer id numbers?
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.
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!
EXPLAIN is a tool to ask the server how it wants to
optimize the query.
Prepend to a QUERY
Example EXPLAIN with G
rows in table
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!
What the heck is a B-Tree?!??!?!
274 Records Read!
Previous query w/o INDEX
No index used and
all records in table read
to find 274 records
How to find index(es) already in use
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
Slightly more complex query
SELECT a.Name as 'City',
b.Name as 'Country',
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
Gee, we add all those qualifiers
and it still has to read
All those records AND
we get a temp table plus a file sort!
And we ONLY wanted 20 records!!!
MySQL 5.6 and
Workbench 6.1 use
JSON format output
to generate diagram.
Costs published with
5.7 and 6.1!
Yet a little deeper into complexity
SELECT CONCAT(customer.last_name, ', ', customer.first_name) AS customer,
FROM rental INNER JOIN customer ON rental.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()
We can use this index searching on
1. City, State, and Zip
2. City, State
ALTER TABLE city ADD INDEX country_idx
The INDEX contains all the data we are
searching for which means less data to look-up,
one less read into the data
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
4. Maintain B-tree index with ANALYSE TABLE
when things are quiet
5. Keep looking for improvments
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!
Questions and Answers