• Like
Converge -- MySQL Workshop
Upcoming SlideShare
Loading in...5

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Converge -- MySQL Workshop


Slides from the Converge Conference August 16th 2014 MySQL Workshop

Slides from the Converge Conference August 16th 2014 MySQL Workshop

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads


Total Views
On SlideShare
From Embeds
Number of Embeds



Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

    No notes for slide


  • 1. MySQL Basics Workshop David.Stokes@Oracle.com @stoker Slideshare.net/DaveStokes Converge 2014 16th August
  • 2. 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
  • 3. 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
  • 4. 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!
  • 5. 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!
  • 6. Integers Type Storage (bytes) Minimum Signed Maximum Signed Minimum Unsigned Maximum Unsigned TINYINT 1 -128 127 0 255 SMALLINT 2 -32768 32768 0 65535 MEDIUMIN T 3 -8388608 8388607 0 16777215 INT 4 -2147483648 2147483647 0 4294967295 BIGINT 8 - 9223372036854 775808 9223372036854 775807 0 1844674407370 9551615 Are you really going to have 18,446,744,073,709,551,615 customer id numbers?
  • 7. 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.
  • 8. 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!
  • 9. EXPLAIN EXPLAIN is a tool to ask the server how it wants to optimize the query. Prepend to a QUERY
  • 10. Example Table
  • 11. Example Query
  • 12. Example EXPLAIN
  • 13. Example EXPLAIN with G Read ALL rows in table
  • 14. 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!
  • 15. What the heck is a B-Tree?!??!?!
  • 16. Using WHERE 274 Records Read!
  • 17. Previous query w/o INDEX No index used and all records in table read to find 274 records
  • 18. How to find index(es) already in use
  • 19. OR ... G for Vertical
  • 20. 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
  • 21. 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;
  • 22. 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!!!
  • 23. Visual Explain MySQL 5.6 and Workbench 6.1 use JSON format output to generate diagram. Costs published with 5.7 and 6.1!
  • 24. Yet a little deeper into complexity SELECT 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;
  • 25. ***************************1.row*************************** id:1 select_type:SIMPLE table:film type:ALL possible_keys:PRIMARY key:NULL key_len:NULL ref:NULL rows:1000 Extra:NULL ***************************2.row*************************** id:1 select_type:SIMPLE table:inventory type:ref possible_keys:PRIMARY,idx_fk_film_id key:idx_fk_film_id key_len:2 ref:sakila.film.film_id rows:2 Extra:Usingindex ***************************3.row*************************** id:1 select_type:SIMPLE table:rental type:ref possible_keys:idx_fk_inventory_id,idx_fk_customer_id key:idx_fk_inventory_id key_len:3 ref:sakila.inventory.inventory_id rows:1 Extra:Usingwhere ***************************4.row*************************** id:1 select_type:SIMPLE table:customer type:eq_ref possible_keys:PRIMARY,idx_fk_address_id key:PRIMARY key_len:2 ref:sakila.rental.customer_id rows:1 Extra:NULL ***************************5.row*************************** id:1 select_type:SIMPLE table:address type:eq_ref possible_keys:PRIMARY key:PRIMARY key_len:2 ref:sakila.customer.address_id rows:1 Extra:NULL 5rowsinset(0.00sec)
  • 26. A little easier to understand
  • 27. Compound Indexes We can use this index searching on 1. City, State, and Zip 2. City, State 3. City
  • 28. 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
  • 29. 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
  • 30. Check Return Codes (please) <?php $link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %sn", mysqli_connect_error()); exit(); } if (!mysqli_query($link, "SET a=1")) { printf("Errorcode: %dn", mysqli_errno($link)); }
  • 31. Hard to teach all in a few minutes
  • 32. 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!
  • 33. Questions and Answers David.Stokes@Oracle.com @stoker Slideshare.net/davestokes