15 protips for mysql users   pfz
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

15 protips for mysql users pfz

on

  • 3,125 views

 

Statistics

Views

Total Views
3,125
Views on SlideShare
3,125
Embed Views
0

Actions

Likes
10
Downloads
64
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

15 protips for mysql users pfz Presentation Transcript

  • 1. 15 Pro-tips for MySQL Users PFCongress - 17 september 2011 Utrecht - Netherlands
  • 2. Joshua Thijssen Senior Software Engineer @ Enrise Development in PHP, Python, Perl, C, Java.... Email: [email_address] Twitter: @jaytaph Blogs: http://www.adayinthelifeof.nl http://www.enrise.com/blog
  • 3.
    • 15 MySQL Pro-tips
    • No “theoretical tips”, all taken from the field.
    • Starting simple - ending “complex”
    What are we going to discuss?
    • QUESTIONS? RAISE YOUR HAND OR YELL LOUD
  • 4.
    • 0) Use the correct MySQL version
    Tip 0
    • MySQL 5.0 != 5.5
  • 5.
    • RHEL 5-7: 5.0.77
    • RHEL 6-1: 5.1.52
    • Debian (lenny) 5.0.51a
    • Debian (squeeze): 5.1.49
    • Debian (sid): 5.1.58
    Tip 0: Use the correct MySQL version http://distrowatch.com/table.php?distribution=redhat http://distrowatch.com/table.php?distribution=debian
  • 6.
    • 1) Know how to use explain (and profiler)
    Tip 1
    • EXPLAIN IS YOUR BESTEST FRIEND
  • 7.
    • I will not show you how to use EXPLAIN.
    • Use EXPLAIN and EXPLAIN EXTENDED/ SHOW WARNINGS;
    Tip 1: Know your EXPLAIN (1)
  • 8. Tip 1: Know your EXPLAIN (2) mysql> desc varchartest;+----------+--------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+----------+--------------+------+-----+---------+-------+| id | int(11) | NO | PRI | 0 | || name | varchar(255) | NO | MUL | NULL | || utf8name | varchar(255) | NO | MUL | NULL | |+----------+--------------+------+-----+---------+-------+3 rows in set (0.01 sec)
  • 9. Tip 1: Know your EXPLAIN (3) mysql> EXPLAIN EXTENDED -> SELECT * FROM varchartest WHERE name LIKE 'joshua';+----+-------------+-------------+-------+---------------+----------+---------+------+------+----------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+-------------+-------+---------------+----------+---------+------+------+----------+-------------+| 1 | SIMPLE | varchartest | range | idx_name | idx_name | 257 | NULL | 1 | 100.00 | Using where |+----+-------------+-------------+-------+---------------+----------+---------+------+------+----------+-------------+1 row in set, 1 warning (0.01 sec)
  • 10. Tip 1: Know your EXPLAIN (4) mysql> SHOW WARNINGSg+-------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Level | Code | Message |+-------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+| Note | 1003 | select `pfz`.`varchartest`.`id` AS `id`,`pfz`.`varchartest`.`name` AS `name`,`pfz`.`varchartest`.`utf8name` AS `utf8name` from `pfz`.`varchartest` where (`pfz`.`varchartest`.`name` like 'joshua') |+-------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  • 11. Tip 1: Know your PROFILER (1) mysql> SET profiling=1;mysql> SELECT * FROM table; mysql> SHOW PROFILE CPU, BLOCK IO; +--------------------------------+----------+----------+------------+--------------+---------------+| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |+--------------------------------+----------+----------+------------+--------------+---------------+| starting | 0.000930 | 0.000000 | 0.000000 | 0 | 8 || checking query cache for query | 0.000547 | 0.000000 | 0.000000 | 0 | 0 || checking permissions | 0.000045 | 0.000000 | 0.000000 | 0 | 0 || Opening tables | 0.000142 | 0.000000 | 0.000000 | 0 | 0 || System lock | 0.000030 | 0.000000 | 0.000000 | 0 | 0 || Table lock | 0.000045 | 0.000000 | 0.000000 | 0 | 0 || init | 0.000207 | 0.000000 | 0.000000 | 0 | 0 || optimizing | 0.000007 | 0.000000 | 0.000000 | 0 | 0 || statistics | 0.000068 | 0.000000 | 0.000000 | 0 | 0 || preparing | 0.001393 | 0.004000 | 0.000000 | 0 | 0 || Creating tmp table | 0.001658 | 0.000000 | 0.000000 | 0 | 8 || executing | 0.000005 | 0.000000 | 0.000000 | 0 | 0 || Copying to tmp table | 0.000834 | 0.000000 | 0.004001 | 0 | 8 || Sorting result | 0.000179 | 0.000000 | 0.000000 | 0 | 0 || Sending data | 0.000089 | 0.000000 | 0.000000 | 0 | 0 || end | 0.000022 | 0.000000 | 0.000000 | 0 | 0 || removing tmp table | 0.000089 | 0.000000 | 0.000000 | 0 | 0 || end | 0.000005 | 0.000000 | 0.000000 | 0 | 0 || query end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 || freeing items | 0.000844 | 0.000000 | 0.000000 | 0 | 0 || logging slow query | 0.000023 | 0.000000 | 0.000000 | 0 | 0 || logging slow query | 0.000060 | 0.000000 | 0.000000 | 0 | 8 || cleaning up | 0.000007 | 0.000000 | 0.000000 | 0 | 0 |+--------------------------------+----------+----------+------------+--------------+---------------+
  • 12.
    • 2) Know the most basic my.cnf settings
    Tip 2
    • THERE ARE ONLY A FEW “BASIC” ONES.
  • 13. Tip 2: My.cnf settings (1) Know the most important ones: key_buffer_size, innodb_buffer_pool_size, sort_buffer_size, max_connections
  • 14.
    • Some settings work on global level, some per connection!
    • Know some quirks: (max_heap_table_size vs tmp_table_size, binlog-do-db, replicate-ignore-db etc)
    Tip 2: My.cnf settings (2)
  • 15.
    • http://www.omh.cc/mycnf/
    • http://rackerhacker.com/mysqltuner/
    • http://www.day32.com/MySQL/
    • phpmyadmin
    Tip 2: My.cnf settings (3)
  • 16.
    • 3) Backup on table level
    Tip 3
    • RESTORING JUST ONE TABLE CAN BE PAINFUL OTHERWISE
  • 17.
    • mysqldump can dump per database OR by table.
    • Simple scripts to scan/dump tables.
    • Easy restore for single table (or part of table)
    Tip 3: Backup on table level (1)
    • COULD YOU RESTORE TABLE x? YES! YES I CAN!
  • 18.
    • 4) Don’t use “SELECT *” when you only need one or two fields.
    Tip 4
    • DON’T ASK WHAT YOU DON’T NEED
  • 19.
    • Much more data to be read from disk
    • Much more data will be send over, thus slower (blobs/texts)
    • Cannot use covering indices
    Tip 4: Select * (1)
    • DON’T ASK WHAT YOU DON’T NEED
  • 20. Tip 4: Select * (2) mysql> SHOW FULL COLUMNS FROM `covering`;+--------------+------------------+------------------+------+-----+---------+----------------+ | Field | Type | Collation | Null | Key | Default | Extra | +--------------+------------------+------------------+------+-----+---------+----------------+| id | int(10) unsigned | NULL | NO | PRI | NULL | auto_increment || email | varchar(255) | ascii_general_ci | NO | MUL | NULL | | | want_mailing | tinyint(1) | NULL | NO | MUL | NULL | | | extra_info | varchar(255) | ascii_general_ci | NO | MUL | NULL | |+--------------+------------------+------------------+------+-----+---------+----------------+3 rows in set (0.00 sec)mysql> SHOW INDEXES FROM `covering`;+----------+------------+------------+--------------+--------------+-----------+-------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | +----------+------------+------------+--------------+--------------+-----------+-------------+| covering | 0 | PRIMARY | 1 | id | A | 3 || covering | 1 | idx_email | 1 | email | A | 3 || covering | 1 | idx_email | 2 | want_mailing | A | 3 || covering | 1 | idx_email2 | 1 | want_mailing | A | 1 || covering | 1 | idx_email2 | 2 | email | A | 3 |+----------+------------+------------+--------------+--------------+-----------+-------------+5 rows in set (0.01 sec)
  • 21. Tip 4: Select * (2) mysql> EXPLAIN SELECT want_mailing FROM `covering` WHERE email LIKE ' [email_address] ';+----+-------------+----------+-------+---------------+-----------+---------+------+------+--------------------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+----------+-------+---------------+-----------+---------+------+------+--------------------------+| 1 | SIMPLE | covering | range | idx_email | idx_email | 257 | NULL | 1 | Using where; Using index |+----+-------------+----------+-------+---------------+-----------+---------+------+------+--------------------------+1 row in set (0.00 sec)
  • 22.
    • 5) Use triggers and stored procedures
    Tip 5
    • ENFORCE CONSISTENCY
  • 23.
    • 6 triggers per table (insert, update, delete, before and after the mutation)
    • 3rd party tools (phpmyadmin etc) can also use the database without loosing data consistency.
    • Watch out with (phpmyadmin) table dumps!
    Tip 5: Triggers and stored procedures (1)
    • ENFORCE CONSISTENCY
  • 24.
    • 6) Don’t use FULLTEXT searches
    Tip 6
    • THERE ARE MUCH BETTER SOLUTIONS
  • 25.
    • They only work for MyISAM tables.
    • Not compatible with other DB’s.
    • Slow (especially compared to Solr, Sphinx).
    • No extra features (faceted search, spell checking etc).
    Tip 6: Don’t use FULLTEXT search (1)
    • THERE ARE MUCH BETTER SOLUTIONS
  • 26.
    • 7) Some wildcard searches (%item%) are bad for performance
    Tip 7
    • IT LOOKS LIKE YOU NEED MORE ADVANCED SEARCH?
  • 27.
    • MySQL cannot use indexing!
    • Revert your data: search for ‘moc.esirne@%’ instead of ‘%@enrise.com’.
    • Use a better solution (solr, sphinx). You probably want it (no, really)
    Tip 7: Wildcard searches (1)
    • THERE ARE MUCH BETTER SOLUTIONS
  • 28.
    • 8) Shard your volatile and non-volatile data.
    Tip 8
    • MAKE CACHING AND LOCKING HAPPY AGAIN
  • 29. Tip 8: Sharding (1) mysql> SHOW FULL COLUMNS FROM `pages`;+------------+------------------+-------------------+------+-----+-------------------+-------+| Field | Type | Collation | Null | Key | Default | Extra |+------------+------------------+-------------------+------+-----+-------------------+-------+| page_id | int(10) unsigned | NULL | NO | PRI | NULL | || created_dt | timestamp | NULL | NO | | CURRENT_TIMESTAMP | || creator_id | int(11) | NULL | NO | | NULL | || title | varchar(100) | latin1_swedish_ci | NO | | NULL | || contents | text | latin1_swedish_ci | NO | | NULL | || hit_count | int(11) | NULL | NO | | 0 | |+------------+------------------+-------------------+------+-----+-------------------+-------+6 rows in set (0.01 sec)
  • 30.
    • Remember: an update on a table will invalidate ALL caches referring to that table.
    • UPDATE pages SET hit_count = hit_count + 1;
    • Thus: page table will NEVER be cached.
    Tip 8: Sharding (2)
  • 31.
    • Define hot data (volatile, changes often) and cold data (static, changes never or infrequently)
    • move to different tables
    • UPDATE page_stats SET hit_count = hit_count + 1;
    • Query cache is happy again
    Tip 8: Sharding (3)
  • 32.
    • MySQL 5.1 and higher has got partitioning (but you should shard anyway).
    Tip 8: Sharding (4)
  • 33.
    • 9) Don’t use a large primary key for InnoDB tables.
    Tip 9
    • PK’S ARE ON EVERY INDEX
  • 34.
    • InnoDB adds the primary key to EACH index.
    • No primary key given? It uses an internal 6(!)-byte key.
    Tip 9: Large primary keys (1)
  • 35.
    • 10) Don’t “SELECT COUNT(*) FROM TABLE” on InnoDB.
    Tip 10
    • COUNT(*) => MYISAM = FAST
    • COUNT(*) => INNODB = SLOW
  • 36.
    • InnoDB implements MVCC (multi-version concurrency control).
    • COUNT(*) must be counted and is not fetched from metadata.
    Tip 10: SELECT COUNT(*) (1)
  • 37.
    • What do you want to COUNT(*)?
    • Just for displaying purposes (there are X amount of pages): do you need the EXACT amount? (guess &| cache)
    Tip 10: SELECT COUNT(*) (2)
  • 38.
    • 11) Don’t rely on the VARCHAR()
    Tip 11
    • IT ISN’T THAT VARIABLE AS YOU MIGHT THINK
  • 39. Tip 11: VARCHAR() (1)
    • IT DOESN’T SOLVE YOUR PROBLEMS
  • 40.
    • DON’T WORRY ABOUT THE UTF-8, I’LL BASH THAT LATER
    Tip 11: VARCHAR() (3) mysql> SHOW FULL COLUMNS FROM `varchartest`;+----------+--------------+-------------------+------+-----+---------+-------+| Field | Type | Collation | Null | Key | Default | Extra |+----------+--------------+-------------------+------+-----+---------+-------+| id | int(11) | NULL | NO | PRI | 0 | || name | varchar(255) | latin1_swedish_ci | NO | MUL | NULL | || utf8name | varchar(255) | utf8_general_ci | NO | MUL | NULL | |+----------+--------------+-------------------+------+-----+---------+-------+3 rows in set (0.01 sec)mysql> SHOW INDEXES FROM `varchartest`;+-------------+------------+--------------+--------------+-------------+-----------+-------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality |+-------------+------------+--------------+--------------+-------------+-----------+-------------+| varchartest | 0 | PRIMARY | 1 | id | A | 3 || varchartest | 1 | idx_name | 1 | name | A | 3 || varchartest | 1 | idx_utf8name | 1 | utf8name | A | 3 |+-------------+------------+--------------+--------------+-------------+-----------+-------------+3 rows in set (0.00 sec)
  • 41.
    • DON’T WORRY ABOUT THE UTF-8, I’LL BASH THAT LATER
    Tip 11: VARCHAR() (3) mysql> EXPLAIN SELECT * FROM `varchartest` WHERE name LIKE 'jthijssen';+----+-------------+-------------+-------+---------------+----------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------+-------+---------------+----------+---------+------+------+-------------+| 1 | SIMPLE | varchartest | range | idx_name | idx_name | 257 | NULL | 1 | Using where |+----+-------------+-------------+-------+---------------+----------+---------+------+------+-------------+1 row in set (0.00 sec)
  • 42.
    • 12) UTF-8 is not the enemy, but it certainly isn’t your friend.
    Tip 12
    • DON’T EXCHANGE ONE PROBLEM FOR ANOTHER
  • 43.
    • Dr Jeckyl and Mr Hyde
    • Solves all your multi-language problems!
    • But gives back performance issues.
    Tip 12: UTF-8 (1)
  • 44. Tip 12: UTF-8 (1) mysql> SHOW FULL COLUMNS FROM `varchartest`;+----------+--------------+-------------------+------+-----+---------+-------+| Field | Type | Collation | Null | Key | Default | Extra |+----------+--------------+-------------------+------+-----+---------+-------+| id | int(11) | NULL | NO | PRI | 0 | || name | varchar(255) | latin1_swedish_ci | NO | MUL | NULL | || utf8name | varchar(255) | utf8_general_ci | NO | MUL | NULL | |+----------+--------------+-------------------+------+-----+---------+-------+3 rows in set (0.01 sec)mysql> SHOW INDEXES FROM `varchartest`;+-------------+------------+--------------+--------------+-------------+-----------+-------------+| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality |+-------------+------------+--------------+--------------+-------------+-----------+-------------+| varchartest | 0 | PRIMARY | 1 | id | A | 3 || varchartest | 1 | idx_name | 1 | name | A | 3 || varchartest | 1 | idx_utf8name | 1 | utf8name | A | 3 |+-------------+------------+--------------+--------------+-------------+-----------+-------------+3 rows in set (0.00 sec)
  • 45. Tip 12: UTF-8 (1) mysql> EXPLAIN SELECT * FROM `varchartest` WHERE name LIKE 'jthijssen';+----+-------------+-------------+-------+---------------+----------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------+-------+---------------+----------+---------+------+------+-------------+| 1 | SIMPLE | varchartest | range | idx_name | idx_name | 257 | NULL | 1 | Using where |+----+-------------+-------------+-------+---------------+----------+---------+------+------+-------------+1 row in set (0.00 sec) mysql> EXPLAIN SELECT * FROM `varchartest` WHERE utf8name LIKE 'jthijssen';+----+-------------+-------------+-------+---------------+--------------+---------+------+------+-------------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+-------------+-------+---------------+--------------+---------+------+------+-------------+| 1 | SIMPLE | varchartest | range | idx_utf8name | idx_utf8name | 767 | NULL | 1 | Using where |+----+-------------+-------------+-------+---------------+--------------+---------+------+------+-------------+1 row in set (0.01 sec)
  • 46.
    • ALL temporary buffers are allocated for worst-case scenario’s.
    • This means a varchar(255) in UTF-8 uses 255*3 + 2 = 767 bytes PER row, even if you have only 1 single char inside.
    Tip 12: UTF-8 (1)
  • 47.
    • 13) Know your cardinality & selectivity
    Tip 13
  • 48.
    • Cardinality: the number of unique entries inside the index.
    • Selectivity: percentage of unique entries.
    • S(I) = cardinality / count * 100%
    Tip 13: Cardinality & Selectivity (1)
  • 49. Tip 13: Cardinality & Selectivity (2)
  • 50.
    • with 10 records: 5/10 * 100% = 50%
    • with 1000 records: 75/1000 * 100 = 7.5%
    • with 10.000 records: 200/10000 * 100% = 2%
    Tip 13: Cardinality & Selectivity (3) country_id (max +-200, but effectively +- 50, maybe less)
  • 51.
    • A selectivity < 30% ? Full table scan!
    • ANALYZE TABLE frequently.
    Tip 13: Cardinality & Selectivity (4)
  • 52.
    • Adding records changes your cardinality and thus selectivity.
    • Develop against a “real” dataset.
    Tip 13: Cardinality & Selectivity (5)
  • 53.
    • 14) Non-deterministic functions do not go well with query caching
    Tip 14
    • NOW(), RAND(), UUID(), CONNECTION_ID() ETC..
  • 54. Tip 14: Query caching (1) mysql> show status like '%qcache%';+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1 || Qcache_free_memory | 16768400 || Qcache_hits | 3860 || Qcache_inserts | 975 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 486 || Qcache_queries_in_cache | 0 || Qcache_total_blocks | 1 |+-------------------------+----------+8 rows in set (0.00 sec) mysql> select * from varchartest;+----+------+----------+| id | name | utf8name |+----+------+----------+| 1 | j | joshua || 2 | j | jeroen || 3 | d | david |+----+------+----------+3 rows in set (0.00 sec)mysql> show status like '%qcache%';+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1 || Qcache_free_memory | 16766864 || Qcache_hits | 3860 || Qcache_inserts | 976 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 486 || Qcache_queries_in_cache | 1 || Qcache_total_blocks | 4 |+-------------------------+----------+8 rows in set (0.00 sec)
  • 55. Tip 14: Query caching (2) mysql> select * from varchartest;+----+------+----------+| id | name | utf8name |+----+------+----------+| 1 | j | joshua || 2 | j | jeroen || 3 | d | david |+----+------+----------+3 rows in set (0.00 sec)mysql> show status like '%qcache%';+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1 || Qcache_free_memory | 16766864 || Qcache_hits | 3861 || Qcache_inserts | 976 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 486 || Qcache_queries_in_cache | 1 || Qcache_total_blocks | 4 |+-------------------------+----------+8 rows in set (0.00 sec) mysql> select * from varchartest;+----+------+----------+| id | name | utf8name |+----+------+----------+| 1 | j | joshua || 2 | j | jeroen || 3 | d | david |+----+------+----------+3 rows in set (0.00 sec)mysql> show status like '%qcache%';+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1 || Qcache_free_memory | 16766864 || Qcache_hits | 3860 || Qcache_inserts | 976 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 486 || Qcache_queries_in_cache | 1 || Qcache_total_blocks | 4 |+-------------------------+----------+8 rows in set (0.00 sec)
  • 56. Tip 14: Query caching (3) mysql> select * from varchartest;+----+------+----------+| id | name | utf8name |+----+------+----------+| 1 | j | joshua || 2 | j | jeroen || 3 | d | david |+----+------+----------+3 rows in set (0.00 sec)mysql> show status like '%qcache%';+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1 || Qcache_free_memory | 16766864 || Qcache_hits | 3861 || Qcache_inserts | 976 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 486 || Qcache_queries_in_cache | 1 || Qcache_total_blocks | 4 |+-------------------------+----------+8 rows in set (0.00 sec) mysql> select * from varchartest ORDER BY RAND();+----+------+----------+| id | name | utf8name |+----+------+----------+| 2 | j | jeroen || 1 | j | joshua || 3 | d | david |+----+------+----------+3 rows in set (0.05 sec)mysql> show status like '%qcache%';+-------------------------+----------+| Variable_name | Value |+-------------------------+----------+| Qcache_free_blocks | 1 || Qcache_free_memory | 16766864 || Qcache_hits | 3861 || Qcache_inserts | 976 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 487 || Qcache_queries_in_cache | 1 || Qcache_total_blocks | 4 |+-------------------------+----------+8 rows in set (0.00 sec)
  • 57. SELECT * FROM table WHERE YEAR(created_dt) < YEAR(NOW()); vs SELECT * FROM table WHERE YEAR(created_dt) < ‘2010’; Tip 14: Query caching (4)
  • 58.
    • 15) Certify yourself as a DBA and/or DBE.
    Tip 15
    • AND GET SOME NICE TITLES WHILE YOU’RE AT IT...
  • 59.
    • Oracle Certified MySQL Associate
    • Oracle Certified Professional MySQL 5.0 Developer
    • Oracle Certified Professional MySQL 5.0 Database Administrator
    • Oracle Certified Expert, MySQL 5.1 Cluster Database Administrator
    • “ Old”, but still, get them all!
    Tip 15: Certify yourself (1)
    • THEY ARE NOT VERY EASY EXAMS, BUT WELL WORTH IT
  • 60. Let’s summarize
    • Know how to use explain.
    • Know the most basic my.cnf settings.
    • Backup on table level.
    • Don’t use “SELECT *” when you only need 1 or 2 fields.
    • Use triggers and stored procedures.
    • Don’t use FULLTEXT searches.
    • Wildcard searches (%item%) are bad for performance.
    • Shard your volatile and non-volatile data.
    • Don’t use a large Primary Key for InnoDB tables.Don’t “Select COUNT(*)” on InnoDB.
    • Don’t rely on the VARCHAR().
    • UTF-8 is not the enemy, but it certainly isn’t your friend.Know your cardinality & selectivity.Non-deterministic functions do not go well with query caching. Certify yourself as a DBA and/or DBE.
  • 61. Any questions?
    • QUESTIONS?
    http://farm1.static.flickr.com/73/163450213_18478d3aa6_d.jpg
  • 62. Daycamp for developers http://www.enrise.com http://www.daycamp4developers.com /
  • 63.
    • THANK YOU FOR YOUR ATTENTION
    • Please rate my talk: http://joind.in/3662