Successfully reported this slideshow.
Your SlideShare is downloading. ×

How MySQL can boost (or kill) your application v2

Ad

How can MySQL boost
Your applications?

Ad

How can MySQL boost
Your applications?
Mmh, wait...

Ad

How can MySQL boost
(or kill)
Your applications?

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Upcoming SlideShare
MySQL Query Optimisation 101
MySQL Query Optimisation 101
Loading in …3
×

Check these out next

1 of 50 Ad
1 of 50 Ad
Advertisement

More Related Content

Advertisement

How MySQL can boost (or kill) your application v2

  1. 1. How can MySQL boost Your applications?
  2. 2. How can MySQL boost Your applications? Mmh, wait...
  3. 3. How can MySQL boost (or kill) Your applications?
  4. 4. € whoami ● Federico Razzoli ● Freelance consultant ● Writing SQL since MySQL 2.23 https://federico-razzoli.com hello@federico-razzoli.com ● I love open source, sharing, Collaboration, win-win, etc ● I love MariaDB, MySQL, Postgres, etc
  5. 5. This talk applies to... ● MySQL ● Percona Server ● MariaDB And most information applies, with some changes, to: ● All other relational DBMSs
  6. 6. This talk is about... ● Low hanging fruits to speed up your apps ● Hints you may want to investigate in the next days
  7. 7. This talk is not about... ● ORMs ● PHP code ● Query optimisation ● SQL_MODE ● Graphical interfaces ● MySQL characteristics that I don’t want to advertise ○ For a reason ○ But you are allowed to ask questions that I hope you don’t ask ○ I will still say “thank you for your question”
  8. 8. Why do I want to talk about MySQL at a PHP event?
  9. 9. Good practices™ for your dev machine
  10. 10. Configuration /etc/mysql/my.cnf should always contain: log_slow = 1 long_query_time = 0 performance_schema = 1 Userstat = 1 -- MariaDB and Percona Server
  11. 11. Slow log ls -1 $( mysql -e 'SELECT @@datadir' ) | grep slow ● Empty the slow log before a test ○ echo '' > /path/to/slowlog ● Check the slow log when you want to check your queries ○ Includes query duration, rows returned and some details on the execution plan
  12. 12. Performance Schema Before a test: TRUNCATE TABLE performance_schema.events_statements_summary_by_digest;
  13. 13. Queries that fail SELECT DIGEST_TEXT, COUNT_STAR FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT IS NOT NULL AND SUM_ERRORS > 0 -- SUM_WARNINGS ORDER BY COUNT_STAR DESC LIMIT 10 G
  14. 14. Queries with no results SELECT * FROM performance_schema.events_statements_summary_by_digest WHERE ( TRIM(DIGEST_TEXT) LIKE 'SELECT%' OR TRIM(DIGEST_TEXT) LIKE 'CREATE%TABLE%SELECT%' OR TRIM(DIGEST_TEXT) LIKE 'DELETE%' OR TRIM(DIGEST_TEXT) LIKE 'UPDATE%' OR TRIM(DIGEST_TEXT) LIKE 'REPLACE%' ) AND SUM_ROWS_SENT = 0 AND SUM_ROWS_AFFECTED = 0 ORDER BY SUM_ROWS_EXAMINED DESC LIMIT 10 G
  15. 15. Non-optimised queries SELECT DIGEST_TEXT, COUNT_STAR FROM performance_schema.events_statements_summary_by_digest WHERE DIGEST_TEXT IS NOT NULL AND ( SUM_NO_INDEX_USED > 0 OR SUM_CREATED_TMP_DISK_TABLES > 0 ) ORDER BY SUM_ROWS_EXAMINED DESC LIMIT 10 G
  16. 16. More info For more discussion on these queries, ask google: Federico Razzoli "MySQL/MariaDB: run less queries!"
  17. 17. Indexes
  18. 18. An index is an ordered data structure ● Think to a phone book ● It is a table with an index on (last_name, first_name) ● First takeaway: the order of columns matters ● Your mind contains a pretty good SQL optimiser ● When you want to know which queries can be optimised with a certain index, think to a phone book
  19. 19. Which queries can be optimised? ● WHERE last_name = 'Baker' ● WHERE first_name = 'Tom' ● WHERE first_name = 'Tom' AND last_name = 'Baker' ● WHERE last_name = 'Baker' AND first_name = 'Tom'
  20. 20. Rule #1: A query can use a whole index Or a leftmost part of an index
  21. 21. Which queries can be optimised? ● WHERE last_name = 'Baker' ● WHERE last_name <> 'Baker' ● WHERE last_name > 'Baker' ● WHERE last_name >= 'Baker' ● WHERE last_name < 'Baker' ● WHERE last_name =< 'Baker'
  22. 22. Which queries can be optimised? ● WHERE last_name > 'B' AND last_name < 'C' ● WHERE last_name BETWEEN 'B' AND 'BZZZZZZZZZZZ'; ● WHERE last_name LIKE 'B%' ● WHERE last_name LIKE '%ake%' ● WHERE last_name LIKE '%r'
  23. 23. Rule #2: You can use an index to find a value Or a (closed/open) range
  24. 24. Which queries can be optimised? ● WHERE last_name = 'Nimoy' OR first_name = 'Leonard' ● WHERE last_name = 'Nimoy' OR last_name = 'Shatner'
  25. 25. Rule #3: OR on different columns Is not fully optimised
  26. 26. Which queries can be optimised? ● WHERE last_name = 'Nimoy' AND first_name = 'Leonard' ● WHERE last_name = 'Nimoy' AND first_name > 'Leonard' ● WHERE last_name > 'Nimoy' AND first_name = 'Leonard' ● WHERE last_name > 'Nimoy' AND first_name > 'Leonard'
  27. 27. Rule #4: The index use Stops at the first range
  28. 28. Use proper SQL
  29. 29. N + 1 problem Don’t: foreach row in ( SELECT * FROM author WHERE a.LIKE 'P%'; ) SELECT * FROM book WHERE author_id = ?; Do: SELECT a.first_name, a.last_name, b.* FROM book b JOIN author a ON b.id = a.book_id WHERE a.last_name = 'P%';
  30. 30. Count in SQL, not in PHP Don’t: foreach row in ( SELECT * FROM customer; ) $customer++; Do: SELECT count(*) FROM customer;
  31. 31. Dealing with duplicates INSERT INTO product (id, ...) VALUES (24, ...); INSERT IGNORE INTO product (id, ...) VALUES (24, ...); INSERT INTO product (id, ...) ON DUPLICATE KEY UPDATE name = 'Sonic screwdriver'; REPLACE INTO product (id, ...) VALUES (24, ...); DELETE IGNORE ... UPDATE IGNORE ...
  32. 32. Insert many rows INSERT INTO user (first_name, last_name, email) VALUES ('William', 'Hartnell', 'first@bbc.co.uk'), ('Tom', 'Baker', 'tom@gmail.com'), ('Jody', 'Wittaker', 'first_lady@hotmail.com');
  33. 33. Insert into related tables INSERT INTO `author` (name, surname) VALUES ('Arthur', 'Clarke'); INSERT INTO `book` (author_id, title) VALUES (LAST_INSERT_ID(), '2001: A Space Odyssey');
  34. 34. Delete/Update many tables DELETE `order`, user FROM `order` INNER JOIN `order` ON order.user_id = user.id WHERE user = 24; UPDATE `order`, user FROM `order` INNER JOIN `order` ON order.user_id = user.id SET status = 'CANCELLED' WHERE user = 24;
  35. 35. Read+Delete data Only MariaDB: DELETE FROM user WHERE id = 2424 RETURNING first_name, last_name;
  36. 36. Creating table with rows CREATE TABLE past_order LIKE `order`; INSERT INTO past_order SELECT * FROM `order` WHERE status IN ('SHIPPED', 'CANCELLED'); Or: CREATE TABLE customer SELECT u.id, u.first_name, u.last_name FROM user u JOIN `order` o ON u.id = o.user_id WHERE o.status <> 'CANCELED';
  37. 37. More info For more info on this topic, ask Google: Federico Razzoli "use sql properly to run less queries"
  38. 38. MySQL and Transactions
  39. 39. What are transactions? ACID ● Atomicity ○ All writes in a transaction fail or succeed altogether. ● Consistency ○ Data always switch from one consistent point to another. ● Isolation ○ Transactions are logically sequential. ● Durability ○ Data changes persist after system failures (crashes).
  40. 40. Transactions syntax START TRANSACTION; SELECT … ; UPDATE … ; INSERT … ; COMMIT; START TRANSACTION; DELETE … ; INSERT … ; ROLLBACK; SET SESSION autocommit := 1; -- this is the default DELETE … ;
  41. 41. Isolation levels ● READ UNCOMMITTED ○ You could see not-yet-committed changes. ● READ COMMITTED ○ Each query acquires a separate snapshot. ● REPEATABLE READ (default) ○ One snapshot for the whole transaction. ● SERIALIZABLE ○ Like REPEATABLE READ, but SELECTs are implicitly IN SHARE MODE SET TRANSACTION ISOLATION LEVEL READ COMMITTED; START TRANSACTION; ...
  42. 42. Use cases for READ UNCOMMITTED?
  43. 43. Use cases for READ UNCOMMITTED? ● Statistics (avg on 1M rows) ● “Hi Boris, your last access was on 12th December” ● Delete old data
  44. 44. Use cases for READ COMMITTED?
  45. 45. Use cases for READ COMMITTED? ● Delete/update rows by id from multiple tables ● Show user’s payment history
  46. 46. READ ONLY transactions ● Make sense with REPEATABLE READ ● 2 SELECTs will see consistent data ● Attempts to change data will return an error ● Performance optimisation ○ But not as much as READ UNCOMMITTED START TRANSACTION READ ONLY;
  47. 47. Ways to kill MySQL Having SELECT privilege is enough to kill MySQL! (or any RDBMS) Method 1: START TRANSACTION; SELECT * FROM `order`; SELECT SLEEP(3600 * 12);
  48. 48. Ways to kill MySQL Having SELECT privilege is enough to kill MySQL! (or any RDBMS) Method 2: START TRANSACTION; SELECT * FROM `order` WHERE id = 24 FOR UPDATE; SELECT SLEEP(3600 * 12);
  49. 49. More info on transactions cost For more info on how transactions work under the hood and why they can be expensive, ask Google for: Jeremy Cole "The basics of the InnoDB undo logging and history system"
  50. 50. Thanks for being still awake!

×