Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

How MySQL can boost (or kill) your application v2 Slide 1 How MySQL can boost (or kill) your application v2 Slide 2 How MySQL can boost (or kill) your application v2 Slide 3 How MySQL can boost (or kill) your application v2 Slide 4 How MySQL can boost (or kill) your application v2 Slide 5 How MySQL can boost (or kill) your application v2 Slide 6 How MySQL can boost (or kill) your application v2 Slide 7 How MySQL can boost (or kill) your application v2 Slide 8 How MySQL can boost (or kill) your application v2 Slide 9 How MySQL can boost (or kill) your application v2 Slide 10 How MySQL can boost (or kill) your application v2 Slide 11 How MySQL can boost (or kill) your application v2 Slide 12 How MySQL can boost (or kill) your application v2 Slide 13 How MySQL can boost (or kill) your application v2 Slide 14 How MySQL can boost (or kill) your application v2 Slide 15 How MySQL can boost (or kill) your application v2 Slide 16 How MySQL can boost (or kill) your application v2 Slide 17 How MySQL can boost (or kill) your application v2 Slide 18 How MySQL can boost (or kill) your application v2 Slide 19 How MySQL can boost (or kill) your application v2 Slide 20 How MySQL can boost (or kill) your application v2 Slide 21 How MySQL can boost (or kill) your application v2 Slide 22 How MySQL can boost (or kill) your application v2 Slide 23 How MySQL can boost (or kill) your application v2 Slide 24 How MySQL can boost (or kill) your application v2 Slide 25 How MySQL can boost (or kill) your application v2 Slide 26 How MySQL can boost (or kill) your application v2 Slide 27 How MySQL can boost (or kill) your application v2 Slide 28 How MySQL can boost (or kill) your application v2 Slide 29 How MySQL can boost (or kill) your application v2 Slide 30 How MySQL can boost (or kill) your application v2 Slide 31 How MySQL can boost (or kill) your application v2 Slide 32 How MySQL can boost (or kill) your application v2 Slide 33 How MySQL can boost (or kill) your application v2 Slide 34 How MySQL can boost (or kill) your application v2 Slide 35 How MySQL can boost (or kill) your application v2 Slide 36 How MySQL can boost (or kill) your application v2 Slide 37 How MySQL can boost (or kill) your application v2 Slide 38 How MySQL can boost (or kill) your application v2 Slide 39 How MySQL can boost (or kill) your application v2 Slide 40 How MySQL can boost (or kill) your application v2 Slide 41 How MySQL can boost (or kill) your application v2 Slide 42 How MySQL can boost (or kill) your application v2 Slide 43 How MySQL can boost (or kill) your application v2 Slide 44 How MySQL can boost (or kill) your application v2 Slide 45 How MySQL can boost (or kill) your application v2 Slide 46 How MySQL can boost (or kill) your application v2 Slide 47 How MySQL can boost (or kill) your application v2 Slide 48 How MySQL can boost (or kill) your application v2 Slide 49 How MySQL can boost (or kill) your application v2 Slide 50
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

0 Likes

Share

Download to read offline

How MySQL can boost (or kill) your application v2

Download to read offline

MySQL can boost your applications, if used properly. Or it can kill them, if you don't really understand what you're doing.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to like this

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!

MySQL can boost your applications, if used properly. Or it can kill them, if you don't really understand what you're doing.

Views

Total views

257

On Slideshare

0

From embeds

0

Number of embeds

3

Actions

Downloads

5

Shares

0

Comments

0

Likes

0

×