<Insert Picture Here> MySQL: Crash Course Keith Larson keith.larson@oracle.com MySQL Community Manager http://sqlhjalp.com/pdf/MySQL_susecon_crashcourse_2012.pdf Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle. Who am I and who are you? Who are you? – DBAs? – Developers? • PHP • Perl • Python • .net – Admins? keith.larson@oracle.com MySQL Community Manager http://www.sqlhjalp.com/ Started with MySQL during the dot.com days. Primary real world work was with a MySQL InnoDB replicated chain environment that easily held over 4 billion rows of user data. Numerous other sites developed on LAMP stack over the last 13 years. http://3.bp.blogspot.com/-IXu-9-s-8Fg/TvTs8JbgvdI/AAAAAAAAJpo/at-pjGsDlXg/s1600/Bat%2BStorm%2BTrooper%2BLego.jpg Copyright Oracle Corporation 2012 3 Session Agenda • This is about you and your needs... • I can also cover.. • Oracle's Investment into MySQL • A high-level overview • Familiarize with the key concepts • MySQL Editions Copyright Oracle Corporation 2012 4 Copyright Oracle Corporation 2012 5 Pronunciation The official way to pronounce “MySQL” is “My Ess Que Ell” but we do not mind if you pronounce it as “my sequel” It was named after Monty's Daughter Maria. Copyright Oracle Corporation 2012 6 Session Agenda • Oracle's Investment into MySQL http://www.thesambarnes.com/wp-content/themes/ImpreZZ/images/profitable-web-project-decisions.jpg TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED Copyright Oracle Corporation 2012 7 MySQL On the Cover http://www.oracle.com/technetwork/issue-archive/2011/11-jan/index-191276.html Copyright Oracle Corporation 2012 8 Hardware and Software Engineered to Work Together Built together Tested together Managed together Serviced together Based on open standards Lower cost Lower risk More reliable MySQL Completes The Stack Continuous Innovation with more product releases than ever before • MySQL Database 5.6 • MySQL Cluster 7.2 DMR* and MySQL Labs! (“early and often”) • MySQL Database 5.5 • MySQL Enterprise Backup 3.5 • MySQL Enterprise Monitor 2.3 • MySQL Cluster Manager 1.1 All GA! • MySQL Workbench 5.2 GA! •MySQL Enterprise Monitor 2.2 •MySQL Cluster 7.1 • MySQL Cluster Manager 1.0 A Better MySQL All GA! *Development Milestone Release Q2 CY2010 Q3 CY2010 Copyright Oracle Corporation 2012 Q4 CY2010 Q1 CY2011 Q2 CY2011 10 Industry Leading Customers OEM / ISV’s Web SaaS, Cloud Telecommunications Enterprise 2.0 Rely on MySQL Copyright Oracle Corporation 2012 11 >70% of Oracle Shops run MySQL MySQL: Still Free, Open to the Community Available to download and use under the GPL: • MySQL Database (Community Server) • MySQL Cluster • MySQL Workbench Community Edition • MySQL Connectors • MySQL Proxy • Documentation (free to use, not covered under GPL) • Forums Copyright Oracle Corporation 2012 12 Session Agenda • A high-level overview http://farm3.static.flickr.com/2646/3678467304_66908d66d4.jpg TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED Copyright Oracle Corporation 2012 13 MySQL Terminology • Database ( Files ) • Database Server Instance • Database Instance ( memory)memory • Database Server Instance • Schema • Database • User • User • Table Space • Table Space • Storage Engine Copyright Oracle Corporation 2012 14 Oracle Database Architecture http://carlos.syr.edu/oracle-database-architecture/ Copyright Oracle Corporation 2012 15 MySQL Database Architecture Copyright Oracle Corporation 2012 16 MySQL Logs Error Log – log-error Binary Log – Log-bin custom set via my.cnf Slow Query Log – Log-slow-queries – Slow-query-time – log-queries-not-using-indexes General Log – Log http://dev.mysql.com/doc/refman/5.5/en/server-logs.html Copyright Oracle Corporation 2012 17 MySQL Logs SHOW VARIABLES like '%log%'; +-----------------------------------------+-------------------------------------+ | Variable_name | Value | +-----------------------------------------+-------------------------------------+ | back_log | 50 | | binlog_cache_size | 32768 | binlog_checksum | NONE | | | binlog_direct_non_transactional_updates | OFF | binlog_format | MIXED | binlog_row_image | | FULL | binlog_rows_query_log_events | | OFF | binlog_stmt_cache_size | expire_logs_days | | | 32768 | |0 | | general_log | OFF | | general_log_file | /var/lib/mysql/kdlarson-pc.log | …... Copyright Oracle Corporation 2012 18 MySQL Server Standalone (mysqld) UNIX daemon Windows service Regular process on UNIX or Windows Embedded (libmysqld) Shared / Dynamic library Copyright Oracle Corporation 2012 19 MySQL Server Components Plugin 1 Plugin 2 Plugin 3 The Core Plugins Core SQL-query processing, … InnoDB MyISAM InnoDB InnoDB MyISAM DB1 DB2 DB3 Copyright Oracle Corporation 2012 Storage Engines Full-text search plugins Audit plugins Authentication plugins … 20 MySQL Storage Engines The Storage Engine (SE) defines data storage and retrieval Every regular table belongs to some SE Most notable Storage Engines: InnoDB (default since 5.5) – fully transactional SE MyISAM (default prior to 5.5) – NON-transactional SE Default Storage Engine used it not defined Copyright Oracle Corporation 2012 CREATE TABLE `City` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `CountryCode` (`CountryCode`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; mysql> SHOW ENGINES; 21 MySQL Storage Engines Select a specialized storage engine for a particular application need. InnoDB: a high-reliability and high-performance storage engine for MySQL designed for transaction processing. It follows the ACID model. Row-level locking and Oracle-style consistent reads increase multi-user concurrency and performance MyISAM: -oldest storage engine has many features that have been developed over years. Memory: creates tables with contents that are stored in memory. MySQL Cluster offers the same features as the MEMORY engine with higher performance levels, and provides additional features Copyright Oracle Corporation 2012 22 MySQL Storage Engines CSV: data file is a plain text file ARCHIVE: is used for storing large amounts of data without indexes in a very small footprint. BLACKHOLE:accepts data but throws it away and does not store it but the binary log is enabled. Copyright Oracle Corporation 2012 23 MySQL Partitioning Open Source Limitations Relating to Storage Engines Horizontal partitioning (distribute rows, not columns) CREATE TABLE members ( Partitioning functions: firstname VARCHAR(25) NOT NULL, lastname VARCHAR(25) NOT NULL, The modulus username VARCHAR(16) NOT NULL, email VARCHAR(35), joined DATE NOT NULL Range ) PARTITION BY RANGE( YEAR(joined) ) ( PARTITION p0 VALUES LESS THAN (1960), Internal hashing function PARTITION p1 VALUES LESS THAN (1970), PARTITION p2 VALUES LESS THAN (1980), PARTITION p3 VALUES LESS THAN (1990), Linear hashing function PARTITION p4 VALUES LESS THAN MAXVALUE ); http://dev.mysql.com/doc/refman/5.1/en/partitioning-overview.html http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html Copyright Oracle Corporation 2012 24 MySQL Replication Copyright Oracle Corporation 2012 25 MySQL Replication Overview Top used Feature in MySQL Used for Scalability and HA Write to one master Read from many slaves, easily add more as needed Perfect for read/write intensive apps Asynchronous as standard Semi-Synchronous support added in MySQL 5.5 Each slave adds minimal load on master Replication formats: Statement-based replication (SBR): propagate SQL statements Row-based replication (RBR): propagate row changes Mixed-based replication: SBR or RBR depending on the query http://www.betabeat.com/2011/09/02/clone-wars-rise-of-the-fast-follower-startups/ TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED http://sqlhjalp.com/pdf/2012_Scale_Replication.pdf Copyright Oracle Corporation 2012 26 MySQL Replication Topologies sqlhjalp.com/pdf/2012_Scale_Replication.pdf available for review Copyright Oracle Corporation 2012 27 MySQL Replication Overview Replication Threads Binlog dump thread Slave I/O thread Slave SQL thread Replication Files relay log master info log relay log info log http://sqlhjalp.com/pdf/2012_Scale_Replication.pdf Copyright Oracle Corporation 2012 28 MySQL Replication Overview http://sqlhjalp.com/pdf/2012_Scale_Replication.pdf Copyright Oracle Corporation 2012 29 MySQL Replication Overview http://sqlhjalp.com/pdf/2012_Scale_Replication.pdf Copyright Oracle Corporation 2012 30 MySQL Backup The way depends on the application Possible solutions: Replication? mysqldump MySQL Enterprise Backup Best solution is using all three. # mysqldump -p --all-databases --master-data=1 /tmp/example_dump.sql Not an online solution. Can/will lock tables. http://farm6.static.flickr.com/5024/5554971120_df447dd31c.jpg TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED Copyright Oracle Corporation 2012 31 MySQL Enterprise Backup Online Backup for InnoDB Support for MyISAM (Read-only) High Performance Backup & Restore Compressed Backup Full Backup Incremental Backup Partial Backups Point in Time Recovery Unlimited Database Size Cross-Platform Windows, Linux, Unix Ensures quick, online backup and recovery of your MySQL apps. Copyright Oracle Corporation 2012 32 MySQL Enterprise Backup Usage: ibbackup [--incremental lsn] [--sleep ms] [--suspend-at-end] [--compress [level]] [--include regexp] my.cnf backupmy.cnf or ibbackup --apply-log [--use-memory mb] [--uncompress] backup-my.cnf or ibbackup --apply-log --incremental [--use-memory mb] [--uncompress] incremental-backup-my.cnf full-backup-my.cnf The backup program does NOT make a backup of the .frm files of the tables, and it does not make backups of MyISAM tables. To back up these items, either: - Use the mysqlbackup program. - Make backups of the .frm files with the Unix 'tar' or the Windows WinZip or an equivalent tool both BEFORE and AFTER ibbackup finishes its work,and also store the MySQL binlog segment that is generated between the moment you copy the .frm files to a backup and the moment ibbackup finishes its work. For extra safety, also use: mysqldump -l -d yourdatabasename to dump the table CREATE statements in a human-readable form before ibbackup finishes its work. Copyright Oracle Corporation 2012 33 Session Agenda • Familiarize with the key concepts http://jennysung.com/wp-content/uploads/2012/03/stormtroopers1.jpg TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED Copyright Oracle Corporation 2012 34 MySQL Configuration Highly configurable Command line options Configuration files (plain-text, INI-like files with groups) Several configuration files (/etc, $HOME, …) The last value takes precedence Default configuration are examples and might be not so good for Performance, ... One example: SQL MODE Very important variable Affects data consistency! It might be remembered … … or it might be not Thus: set it once for all Copyright Oracle Corporation 2012 Recommended value: STRICT_ALL_TABLES | NO_ZERO_DATE | NO_ZERO_IN_DATE | NO_ENGINE_SUBSTITUTION | NO_AUTO_CREATE_USER | IGNORE_SPACE | ERROR_FOR_DIVISION_BY_ZERO 35 MySQL Post-installation steps: Security Secure the installation Don’t run under ‘root’ Have separate directories (configuration, data, binary logs, …) Change ‘root’ password Remove default accounts Copyright Oracle Corporation 2012 36 MySQL Concepts MySQL products support unicode. Full Unicode 5.0 is supported for data, and for metadata we support only characters for Basic Multilingual Plane (BMP). Database or schema in Oracle world. Current database (per connection) Database – a set of files in “the data directory” System database (mysql) Virtual databases: INFORMATION_SCHEMA PERFORMANCE_SCHEMA Copyright Oracle Corporation 2012 37 MySQL Privileges User: username@hostname Precisely: ‘user-name-mask’@’host-name-mask’ Host name – client host name (“from” host name) User name mask: can be empty (anonymous user) – all users Host name mask: can be empty – all host names (%) can have ‘%’ (e.g.: %.foo.com) Copyright Oracle Corporation 2012 38 MySQL Privileges Connecting as foo from localhost… Should be foo@%, right ? The most specific values are used BUT: host name matching is done before user name +-----------+-------------------+ | Host | User | +-----------+-------------------+ mysql -u foo -h localhost -p | localhost | | ‘’@localhost will be chosen ! | localhost | bar | |% | | foo | localhost | root | +-----------+-------------------+ Copyright Oracle Corporation 2012 39 MySQL Privileges -- Root $ mysql -u root ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) $ mysql -u root -p Enter password: $ mysqladmin -u root -p password <passwordhere> mysql> UPDATE mysql.user SET Password=PASSWORD('<passwordhere>') WHERE User='root'; mysql> FLUSH PRIVILEGES; Copyright Oracle Corporation 2012 40 MySQL Privileges Do not know the root password? Stop the service: # /etc/init.d/mysql stop Restart with skip grand: # mysqld_safe --skip-grant-tables & Connect as root: # mysql -u root Set new password : use mysql; mysql> update user set password=PASSWORD("NEW-ROOTPASSWORD") where User='root'; mysql> flush privileges; mysql> quit Stop the service: # /etc/init.d/mysql stop Start the service: # /etc/init.d/mysql start Log in as root with password. # mysql -u root -p http://dev.mysql.com/doc/refman/5.5/en/resetting-permissions.html Copyright Oracle Corporation 2012 41 MySQL Privileges -- users mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass'; mysql> GRANT ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, SELECT, SHOW VIEW, TRIGGER, UPDATE ON *.* TO 'monty'@'localhost' WITH GRANT OPTION; mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; mysql> GRANT ALTER, CREATE VIEW, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, SELECT, SHOW VIEW, TRIGGER, UPDATE ON *.* TO 'monty'@'%' WITH GRANT OPTION; mysql> flush privileges ; http://dev.mysql.com/doc/refman/5.6/en/grant.html Copyright Oracle Corporation 2012 42 MySQL Super User Accounts mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass'; mysql> GRANT ALL ON *.* TO 'admin'@'localhost'; mysql> flush privileges ; http://www.boston.com/partners/greader/prfmkt/images/X00-m5707191.jpg TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED http://dev.mysql.com/doc/refman/5.6/en/grant.html Copyright Oracle Corporation 2012 43 MySQL Show Commands SHOW CREATE TABLE tbl_name SHOW CREATE PROCEDURE proc_name SHOW CREATE TRIGGER trigger_name SHOW CREATE VIEW view_name SHOW PROCEDURE CODE proc_name SHOW PROCEDURE STATUS [like_or_where] SHOW [FULL] PROCESSLIST SHOW GRANTS [FOR user] SHOW WARNINGS [LIMIT [offset,] row_count] SHOW {DATABASES | SCHEMAS} [LIKE 'pattern' | WHERE expr] SHOW OPEN TABLES [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr] SHOW BINARY LOGS SHOW MASTER LOGS http://dev.mysql.com/doc/refman/5.6/en/show.html Copyright Oracle Corporation 2012 44 MySQL Show Processlist Use SHOW processlist to find out what is going on: +----+-------+-----------+----+---------+------+--------------+-------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+-----------+----+---------+------+--------------+-------------------------------------+ | 6 | monty | localhost | bp | Query | 15 | Sending data | select * from station,station as s1 | | 8 | monty | localhost | | Query | 0 | | show processlist | +----+-------+-----------+----+---------+------+--------------+-------------------------------------+ Use KILL in mysql or mysqladmin to kill off runaway threads. How to find out how MySQL solves a query Run the following commands and try to understand the output: * SHOW VARIABLES; * SHOW COLUMNS FROM ...\G * EXPLAIN SELECT ...\G * FLUSH STATUS; * SELECT ...; * SHOW STATUS; Copyright Oracle Corporation 2012 45 MySQL Databases/Schema A few ways to see what databases you have on your system: – cd /var/lib/mysql • Review the directories – Log in to MySQL server • Show databases – mysql -u root -p » Enter password: – show databases; Copyright Oracle Corporation 2012 – +--------------------+ – | Database – +--------------------+ – | information_schema | – | db_example – | employees | – | exampledb | – | mysql – | orig – | performance_schema | – +--------------------+ | | | | 46 MySQL Table Space mysql> use world; ---- DATABASE / SCHEMA mysql> show tables; ---- TABLE SPACE +-----------------+ | Tables_in_world | +-----------------+ | City | Country | | | CountryLanguage | +-----------------+ 3 rows in set (0.00 sec) Copyright Oracle Corporation 2012 47 MySQL Table Space mysql> show create table City; CREATE TABLE `City` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT NULL DEFAULT '', `CountryCode` char(3) NOT NULL DEFAULT '', `District` char(20) NOT NULL DEFAULT '', `Population` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `CountryCode` (`CountryCode`), CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `Country` (`Code`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 Copyright Oracle Corporation 2012 48 MySQL Table Space mysql > desc City; +-------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+----------------+ | ID | Name | int(11) | NO | PRI | NULL | char(35) | NO | | | auto_increment | | | CountryCode | char(3) | NO | MUL | | District | char(20) | NO | | Population | int(11) | NO | | | | |0 | | | | | +-------------+----------+------+-----+---------+----------------+ 5 rows in set (0.06 sec) Copyright Oracle Corporation 2012 49 MySQL Datatypes TEXT TYPES CHAR( )A fixed section from 0 to 255 characters long. VARCHAR( )A variable section from 0 to 255 characters long. TINYTEXT A string with a maximum length of 255 characters. TEXT A string with a maximum length of 65535 characters. BLOB A string with a maximum length of 65535 characters. MEDIUMTEXT A string with a maximum length of 16777215 characters. MEDIUMBLOB A string with a maximum length of 16777215 characters. LONGTEXT A string with a maximum length of 4294967295 characters. LONGBLOB A string with a maximum length of 4294967295 characters. CREATE TABLE `example_table` ( ... `value` varchar(100) DEFAULT NULL, ... http://dev.mysql.com/doc/refman/5.5/en/data-types.html Copyright Oracle Corporation 2012 50 MySQL Datatypes NUMBER TYPES TINYINT( ) -128 to 127 normal SMALLINT( ) -32768 to 32767 normal MEDIUMINT( ) INT( ) 0 to 255 UNSIGNED. 0 to 65535 UNSIGNED. -8388608 to 8388607 normal -2147483648 to 2147483647 normal 0 to 16777215 UNSIGNED. 0 to 4294967295 UNSIGNED. BIGINT( )-9223372036854775808 to 9223372036854775807 normal 0 to 18446744073709551615 UNSIGNED. FLOAT A small number with a floating decimal point. DOUBLE( , ) A large number with a floating decimal point. DECIMAL( , ) A DOUBLE stored as a string , allowing for a fixed decimal point. Create Table: CREATE TABLE `example_table` ( `example_table_id` int(10) unsigned NOT NULL AUTO_INCREMENT, .....or `example_table_id` bigint(12) unsigned NOT NULL auto_increment http://dev.mysql.com/doc/refman/5.5/en/data-types.html Copyright Oracle Corporation 2012 51 MySQL Datatypes DATE TYPES DATE YYYY-MM-DD. DATETIME YYYY-MM-DD HH:MM:SS. TIMESTAMP YYYYMMDDHHMMSS. TIME HH:MM:SS. Create Table: CREATE TABLE `example_table` ( `example_table_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `user_id` int(9) unsigned DEFAULT NULL, `date_recorded` datetime DEFAULT NULL, PRIMARY KEY (`example_table_id`), UNIQUE KEY `user_id` (`user_id`), KEY `date_recorded` (`date_recorded`) ) ENGINE=InnoDB http://dev.mysql.com/doc/refman/5.5/en/data-types.html Copyright Oracle Corporation 2012 52 MySQL Datatypes MISC TYPES ENUM ( ) Short for ENUMERATION which means that each column may have one of a specified possible values. SET Similar to ENUM except each column may have more than one of the specified possible values. ….. `transfer_method` enum('OFF','EMAIL','FTP','BATCH POST','FTP-SSL','REAL TIME POST','CUSTOM') default NULL, …. http://dev.mysql.com/doc/refman/5.5/en/data-types.html Copyright Oracle Corporation 2012 53 MySQL Indexes URLS to help for later: http://dev.mysql.com/doc/refman/5.6/en/mysql-indexes.html http://dev.mysql.com/doc/refman/5.6/en/show-index.html http://dev.mysql.com/doc/refman/5.6/en/create-index.html http://learnmysql.blogspot.com/2010/11/mysql-query-and-index-tuning.html http://www.slideshare.net/manikandakumar/mysql-query-and-index-tuning http://www.slideshare.net/osscube/indexing-the-mysql-index-key-to-performance-tuning http://effectivemysql.com/downloads/ImprovingPerformanceWithBetterIndexes-OOW-2011.pdf http://prajwal-tuladhar.net.np/2009/09/23/474/things-you-should-know-about-mysql-index/ http://dev.mysql.com/doc/refman/5.5/en/innodb-monitors.html http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html http://dev.mysql.com/doc/refman/5.5/en/innodb-buffer-pool.html http://www.mysqlperformanceblog.com/2006/07/17/show-innodb-status-walk-through/ http://dev.mysql.com/doc/refman/5.5/en/server-parameters.html http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_key_buffer_size http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_table_open_cache http://www.mysqlperformanceblog.com/2007/11/01/innodb-performance-optimization-basics/ http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/ http://prajwal-tuladhar.net.np/2009/09/23/474/things-you-should-know-about-mysql-index/ Copyright Oracle Corporation 2012 54 MySQL Index options MySQL startup options When tuning a MySQL server, the two most important variables to configure are key_buffer_size and table_open_cache. The buffer pool is for caching data and indexes in memory so set the following to < 80% of the machine physical memory. Important options are: innodb_buffer_pool_size < 80% of memory. innodb_log_file_size=2G. # default value is 8M #dependent on recovery speed required. innodb_log_buffer_size=4M innodb_thread_concurrency=8 # Default innodb_flush_method=O_DIRECT # double buffering and swap are bad # innodb_file_per_table Copyright Oracle Corporation 2012 #depends on how many tables used. Get the big picture 1st. 55 MySQL Indexes (keys) When MySQL uses indexes Using >, >=, =, <, <=, IF NULL and BETWEEN on a key. o SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5; o SELECT * FROM table_name WHERE key_part1 IS NULL; * When you use a LIKE that doesn't start with a wildcard. o SELECT * FROM table_name WHERE key_part1 LIKE 'jani%' * Retrieving rows from other tables when performing joins. o SELECT * from t1,t2 where t1.col=t2.key_part * Find the MAX() or MIN() value for a specific index. o SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10 * ORDER BY or GROUP BY on a prefix of a key. o SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3 * When all columns used in the query are part of one key. o SELECT key_part3 FROM table_name WHERE key_part1=1 Copyright Oracle Corporation 2012 56 MySQL Indexes (keys) When MySQL doesn't use an index * Indexes are NOT used if MySQL can calculate that it will probably be faster to scan the whole table. For example if key_part1 is evenly distributed between 1 and 100, it's not good to use an index in the following query: o SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90 * If you are using HEAP tables and you don't search on all key parts with = * When you use ORDER BY on a HEAP table * If you are not using the first key part o SELECT * FROM table_name WHERE key_part2=1 * If you are using LIKE that starts with a wildcard o SELECT * FROM table_name WHERE key_part1 LIKE '%jani%' * When you search on one index and do an ORDER BY on another o SELECT * from table_name WHERE key_part1 = # ORDER BY key2 Copyright Oracle Corporation 2012 57 MySQL Indexes (keys) Optimizing tables Use NOT NULL for columns which will not store null values. This is particularly important for columns which you index. `e_id` bigint(12) unsigned NOT NULL Don't create indexes you are not going to use. Use the fact that MySQL can search on a prefix of an index; If you have and INDEX (a,b), you don't need an index on (a). UNIQUE KEY `uq_id` (`u_id`,`q_id`), KEY `q_id` (`q_id`), Instead of creating an index on long CHAR/VARCHAR column, index just a prefix of the column to save space. CREATE TABLE `table_name` ( `hostname` char(255) NOT NULL, KEY `hostname` (`hostname`(10)) ) ENGINE=InnoDB Copyright Oracle Corporation 2012 58 MySQL Index – Use Explain! Use EXPLAIN on every query that you think is too slow! mysql> explain select t3.DateOfAction, t1.TransactionID -> from t1 join t2 join t3 -> where t2.ID = t1.TransactionID and t3.ID = t2.GroupID -> order by t3.DateOfAction, t1.TransactionID; +-------+--------+---------------+---------+---------+------------------+------+---------------------------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +-------+--------+---------------+---------+---------+------------------+------+---------------------------------+ | t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort | | t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | | | t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | | 1| +-------+--------+---------------+---------+---------+------------------+------+---------------------------------+ Types ALL and range signal a potential problem. Copyright Oracle Corporation 2012 59 MySQL Index – Use Explain! mysql> EXPLAIN SELECT C.Name , T.Name FROM world.City C INNER JOIN world.Country T ON C.CountryCode = T.Code; +----+-------------+-------+------+---------------+-------------+---------+--------------+------+-------+ | id | select_type | table | type | possible_keys | key | | key_len | ref | rows | Extra +----+-------------+-------+------+---------------+-------------+---------+--------------+------+-------+ | 1 | SIMPLE | |T | ALL | PRIMARY | NULL | NULL | 1 | SIMPLE | |C | ref | CountryCode | CountryCode | 3 | NULL | 264 | | world.T.Code | 8| +----+-------------+-------+------+---------------+-------------+---------+--------------+------+-------+ Copyright Oracle Corporation 2012 60 MySQL Index – Use Explain! More Urls for you to use later about Explain http://dev.mysql.com/doc/refman/5.5/en/explain.html http://effectivemysql.com/downloads/ExplainingTheMySQLEXPLAIN-OOW-2011.pdf http://prajwal-tuladhar.net.np/2009/09/26/481/know-more-about-mysql-explain/ http://www.slideshare.net/ligaya/explain Copyright Oracle Corporation 2012 61 MySQL Stored Routines The CREATE ROUTINE , ALTER ROUTINE , EXECUTE privilege is needed for stored routines. mysql> delimiter // mysql> CREATE PROCEDURE simpleproc (OUT param1 INT) BEGIN SELECT COUNT(*) INTO param1 FROM t; END// Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL simpleproc(@a); Query OK, 0 rows affected (0.00 sec) mysql> SELECT @a; +------+ | @a | +------+ |3 | +------+ 1 row in set (0.00 sec) http://dev.mysql.com/doc/refman/5.5/en/stored-routines.html Copyright Oracle Corporation 2012 62 MySQL Triggers CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); delimiter | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END; | delimiter ; http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html Copyright Oracle Corporation 2012 63 MySQL Views > CREATE VIEW `world`.`city_view` AS SELECT C.Name as cityname , T.Name as countryname FROM world.City C INNER JOIN world.Country T ON C.CountryCode = T.Code; Query OK, 0 rows affected (0.16 sec) SELECT cityname , countryname from city_view where countryname = "Zimbabwe"; +--------------+-------------+ | cityname | countryname | +--------------+-------------+ | Harare | Bulawayo | Zimbabwe | | Zimbabwe | | Chitungwiza | Zimbabwe | | Mount Darwin | Zimbabwe | Mutare | Zimbabwe | | Gweru | Zimbabwe | | +--------------+-------------+ 6 rows in set (0.13 sec) http://dev.mysql.com/doc/refman/5.5/en/views.html Copyright Oracle Corporation 2012 64 MySQL Transactions To disable autocommit mode, use the following statement: mysql> show variables like '%autocommit%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> SET autocommit=0; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%autocommit%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | OFF | +---------------+-------+ 1 row in set (0.01 sec) http://dev.mysql.com/doc/refman/5.5/en/commit.html Copyright Oracle Corporation 2012 65 MySQL Transactions To disable autocommit mode for a single series of statements use the START TRANSACTION statement: START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT; http://dev.mysql.com/doc/refman/5.5/en/commit.html Copyright Oracle Corporation 2012 66 Session Agenda • MySQL Editions http://www.flickr.com/photos/kalexanderson/7719347704/in/set-72157628651430439/ TM & © LUCASFILM LTD. 2012. ALL RIGHTS RESERVED Copyright Oracle Corporation 2012 67 MySQL Versions Workbench – visual database design application that can be used to efficiently design, manage and document database schemata Connectors – ODBC, Java, .Net, MXJ, C/C++, DBI, Ruby, Python, etc. Community: -- http://dev.mysql.com/downloads/ Freely downloadable version of the world's most popular open source database. It is available under the GPL license and is supported by a huge and active community of open source developers. Enterprise: -- eDelivery.com (Free for 30 days) Paid subscription includes support and the following • MySQL Enterprise Backup • MySQL Enterprise Security – • MySQL Enterprise Scalability – • • External Authentication Thread Pool MySQL Enterprise High Availability – Oracle VM Template – Windows Clustering MySQL Enterprise Monitor Free for 30 day evaluation Copyright Oracle Corporation 2012 68 MySQL Download Choosing the version 5.1 – previous GA version 5.5 – the latest GA version 5.6 – development release Choosing the edition Community Edition (Community Server) Enterprise Editions (even MySQL Classic and MySQL Standard) Source or Binary MySQL Support How can I get help ? • Reach out to the community – Irc on freenode – Forums.mysql.com • Oracle Support • Certifications Copyright Oracle Corporation 2012 70 MySQL Support Oracle Premier Support for MySQL • 24 X 7 Problem Resolution Services • Unlimited Support Incidents • Knowledge Base • Maintenance Releases, Bug fixes, Patches, Updates • MySQL Consultative Support • Staffed by experienced, seasoned MySQL Engineers MySQL Enterprise Edition Most secure, scalable MySQL Database, Online Backup, Development/Monitoring Tools, backed by Oracle Premier Lifetime Support Oracle Product Oracle Premier Certifications/Integrations Support MySQL Enterprise Backup MySQL Enterprise Security MySQL Enterprise High Availability Copyright Oracle Corporation 2012 MySQL Enterprise Monitor/Query Analyzer MySQL Enterprise Scalability MySQL Workbench 72 MySQL Resources mysql.com TCO calculator: http://www.mysql.com/tcosavings/ White Papers: http://www.mysql.com/why-mysql/white-papers/ Customer use cases and success stories: http://www.mysql.com/why-mysql/case-studies/ dev.mysql.com Downloads: http://dev.mysql.com/downloads/ Documentation: http://dev.mysql.com/doc/ Forums: http://forums.mysql.com/ PlanetMySQL: http://planet.mysql.com List of resources (books) : http://dev.mysql.com/resources/ http://1.bp.blogspot.com/-FjX1nJexGeI/T7luugwIslI/AAAAAAAAAWU/PtCMZBfm1OA/s1600/internet.jpg MySQL Resources eDelivery.com Download and evaluate all MySQL products Wiki: https://wikis.oracle.com/display/mysql/Home http://forge.mysql.com/wiki/Main_Page – Older Not used as much-- 50 things to know before migrating Oracle to MySQL It is a little old but worth the read www.xaprb.com/blog/2009/03/13/50-things-to-know-before-migrating-oracle-to-mysql/ http://1.bp.blogspot.com/-FjX1nJexGeI/T7luugwIslI/AAAAAAAAAWU/PtCMZBfm1OA/s1600/internet.jpg Copyright Oracle Corporation 2012 74 keith.larson@oracle.com @larsonkeith Copyright Oracle Corporation 2012 75 <Insert Picture Here> Thanks for attending! Keith Larson keith.larson@oracle.com MySQL Community Manager http://sqlhjalp.com/pdf/MySQL_susecon_crashcourse_2012.pdf