Mysql features for the enterprise

Preview:

DESCRIPTION

MySQL main features, with emphasis of what's new in MySQL 5.5, and how to use the InnoDB plugin in 5.1

Citation preview

MySQLFeatures for the enterprise

Giuseppe MaxiaQA Director

Continuent, Inc

This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Wednesday, December 1, 2010

about me - Giuseppe Maxia

• a.k.a. The Data Charmer• QA Director at Continuent, Inc• Long time hacking with MySQL features• Formerly, MySQL community manager, database

consultant, designer, coder.• A passion for QA, open source, and community• Blogger

•http://datacharmer.blogspot.com

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

Main features• Ease of use

• Installation

• Maintenance

• Reliability

• ACID compliant

• Built-in replication

• Performance

• Scalable

• Built-in partitioning

Wednesday, December 1, 2010

And more ...• Stored routines

• Triggers

• Views

• Information and performance schema

• Event scheduler

• Pluggable functions

• Pluggable storage engines

Wednesday, December 1, 2010

Installation

Wednesday, December 1, 2010

As easy as• apt-get install mysql-server

• yum install mysql-server

Manual installation requires less than 15 minutes

Wednesday, December 1, 2010

ACID

Wednesday, December 1, 2010

MVCC storage engine

• Use Innodb

• Transactions

• Referential integrity

Wednesday, December 1, 2010

Replication principles

Wednesday, December 1, 2010

a simple web application

scheme

database server

web server

clients

r/w requests

Wednesday, December 1, 2010

database server

web servers

load balancer

clients

r/w requests

scaling web requests

Wednesday, December 1, 2010

writeread

database load on a simple

web application

85% 15%

Wednesday, December 1, 2010

readwrite

database load on a successful web

application

20% 80%

Wednesday, December 1, 2010

database server

web servers

load balancer

clients

r/w requests✘

scaling up means buying

a bigger database

server

Wednesday, December 1, 2010

readwrite

the bigger database server will eventually

have the same problem

80%20%

Wednesday, December 1, 2010

read/writemaster

read/onlyslaves

web servers

R/W

R/O

load balancer

load balancer

clients

a web application

scheme with replication

Wednesday, December 1, 2010

read/writemaster

read/onlyslaves

readwriteread

database load with

replication

85% 15% 100%

Wednesday, December 1, 2010

read/writemaster

read/onlyslaves

readwriteread

scaling database load

with replication

85% 15% 100%

Wednesday, December 1, 2010

Replication assessmentwithout replication with replication

database handling

performance

Point in Time recovery

failover

write scaling

backup

read scaling

easy harder

high lower (binary logs)

none easy

none possible

none minimal

with downtime without downtime

none easy

Wednesday, December 1, 2010

Partitioning

Wednesday, December 1, 2010

Remember the MERGE tables?separate tablesrisk of duplicatesinsert in each tableno constraints

MERGE TABLE

Wednesday, December 1, 2010

It isn't a merge table!One tableNo risk of duplicatesinsert in one tableconstraints enforced

PARTITIONED TABLE

Wednesday, December 1, 2010

Partition pruning 1a - unpartitioned table - SINGLE RECORD

select * from table_name where colx = 120

Wednesday, December 1, 2010

Partition pruning 1a - unpartitioned table - SINGLE RECORD

select * from table_name where colx = 120

INDEX

DATA

Wednesday, December 1, 2010

Partition pruning 1c - unpartitioned table - RANGE

select * from table_name where colx between 120 and 230

Wednesday, December 1, 2010

Partition pruning 2a - table partitioned by colx - SINGLE REC

select * from table_name where colx = 120

100-199

1-99

200-299

300-399

400-499

500-599

Wednesday, December 1, 2010

Partition pruning 2a - table partitioned by colx - SINGLE REC

select * from table_name where colx = 120

DATA I

NDEX

100-199

1-99

200-299

300-399

400-499

500-599

Wednesday, December 1, 2010

Partition pruning 2b - table partitioned by colx - SINGLE REC

select * from table_name where colx = 350

100-199

1-99

200-299

300-399

400-499

500-599

Wednesday, December 1, 2010

Partition pruning 2c - table partitioned by colx - RANGE

100-199

1-99

200-299

300-399

400-499

500-599

select * from table_name where colx between 120 and 230

Wednesday, December 1, 2010

Benchmarking results (huge server)engine 6 month rangeInnoDB 4 min 30sMyISAM 25.03sArchive 22 min 25sInnoDB partitioned by month 13.19MyISAM partitioned by year 6.31MyISAM partitioned by month 4.45Archive partitioned by year 16.67Archive partitioned by month 8.97

Wednesday, December 1, 2010

Leveraging replication

Wednesday, December 1, 2010

read/writemaster

read/onlyslaves

R/WR/O

load balancer

load balancing

Wednesday, December 1, 2010

backup master

slaves

STOP SLAVE

remove slave from load balancer

START SLAVE

perform backup

attach slave to load

balancer

Let slave catch up

Wednesday, December 1, 2010

master

slaves

STOP SLAVE

remove slave from load balancer

START SLAVE

calculate summary

tables

attach slave to load

balancer

Let slave catch up

makesummary

tables

Wednesday, December 1, 2010

master

slave

innodbnon partitioned

slave

innodbnon partitionedinnodb

partitioned by range

slave

MyISAMpartitioned by range

Partitionsfor heavy statistics

Wednesday, December 1, 2010

master

slave

innodbnon partitioned

slave

innodbnon partitioned

ARCHIVEpartitioned by range

(date)

slave

ARCHIVEpartitioned by range

(product)

slave

ARCHIVEpartitioned by range

(location)

Simulating multiple

dimensions

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

MySQL 5.5

• MySQL 5.5.7-rc released in November

• MySQL 5.5.x-GA coming in December

• Default storage engine is now InnoDB

• Lots of goodies

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default

engine, Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

default engineselect @@version,@@storage_engine;+-----------+------------------+| @@version | @@storage_engine |+-----------+------------------+| 5.1.52 | MyISAM |+-----------+------------------+

select @@version, @@storage_engine;+-----------+------------------+| @@version | @@storage_engine |+-----------+------------------+| 5.5.7-rc | InnoDB |+-----------+------------------+

Wednesday, December 1, 2010

Plugin versionselect @@version, @@innodb_version;+-----------+------------------+| @@version | @@innodb_version |+-----------+------------------+| 5.5.7-rc | 1.1.3 |+-----------+------------------+

Wednesday, December 1, 2010

InnoDB at a glance

• Performance Improvements✦ Improved recovery performance✦ Multiple buffer pool instances✦ Multiple rollback segments✦ Native asynchronous I/O for Linux✦ Extended change buffering

Wednesday, December 1, 2010

Faster!

• How fast?

• In my benchmarks, 10% to 50% faster.

• Others have reported much higher gains.

• You decide.

• Test it under your load.

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

PERFORMANCE SCHEMA

• PERFORMANCE_SCHEMA presents low level MySQL performance information

• Data can be cleared

• Filters with WHERE are allowed

• Must be enabled with --performance_schema

Wednesday, December 1, 2010

performance schemaSELECT EVENT_ID, EVENT_NAME, TIMER_WAITFROM EVENTS_WAITS_HISTORY WHERE THREAD_ID = 13ORDER BY EVENT_ID;+----------+-----------------------------------------+------------+| EVENT_ID | EVENT_NAME | TIMER_WAIT |+----------+-----------------------------------------+------------+| 86 | wait/synch/mutex/mysys/THR_LOCK::mutex | 686322 || 87 | wait/synch/mutex/mysys/THR_LOCK_malloc | 320535 || 88 | wait/synch/mutex/mysys/THR_LOCK_malloc | 339390 || 89 | wait/synch/mutex/mysys/THR_LOCK_malloc | 377100 || 90 | wait/synch/mutex/sql/LOCK_plugin | 614673 || 91 | wait/synch/mutex/sql/LOCK_open | 659925 || 92 | wait/synch/mutex/sql/THD::LOCK_thd_data | 494001 || 93 | wait/synch/mutex/mysys/THR_LOCK_malloc | 222489 || 94 | wait/synch/mutex/mysys/THR_LOCK_malloc | 214947 || 95 | wait/synch/mutex/mysys/LOCK_alarm | 312993 |+----------+-----------------------------------------+------------+

Wednesday, December 1, 2010

performance schemamysql> UPDATE SETUP_INSTRUMENTS SET ENABLED = 'NO' WHERE NAME = 'wait/synch/mutex/myisammrg/MYRG_INFO::mutex';

mysql> UPDATE SETUP_CONSUMERS SET ENABLED = 'NO' WHERE NAME = 'file_summary_by_instance';

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

MySQL 5.5 enhancements• PARTITION BY RANGE COLUMNS• PARTITION BY LIST COLUMNS• TO_SECONDS

51

Wednesday, December 1, 2010

MySQL 5.5 enhancements

52

CREATE TABLE t ( dt date)PARTITION BY RANGE (TO_DAYS(dt))( PARTITION p01 VALUES LESS THAN (TO_DAYS('2007-01-01')), PARTITION p02 VALUES LESS THAN (TO_DAYS('2008-01-01')), PARTITION p03 VALUES LESS THAN (TO_DAYS('2009-01-01')), PARTITION p04 VALUES LESS THAN (MAXVALUE));

BEFORE

5.1

Wednesday, December 1, 2010

MySQL 5.5 enhancements

53

SHOW CREATE TABLE t \G Table: tCreate Table: CREATE TABLE `t` ( `dt` date DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1/*!50100 PARTITION BY RANGE (TO_DAYS(dt))(PARTITION p01 VALUES LESS THAN (733042) ENGINE = MyISAM,[…]

BEFORE

5.1

Wednesday, December 1, 2010

MySQL 5.5 enhancements

54

CREATE TABLE t ( dt date)PARTITION BY RANGE COLUMNS (dt)( PARTITION p01 VALUES LESS THAN ('2007-01-01'), PARTITION p02 VALUES LESS THAN ('2008-01-01'), PARTITION p03 VALUES LESS THAN ('2009-01-01'), PARTITION p04 VALUES LESS THAN (MAXVALUE));

AFTER5.5

Wednesday, December 1, 2010

MySQL 5.5 enhancements

55

SHOW CREATE TABLE t Table: tCreate Table: CREATE TABLE `t` ( `dt` date DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1/*!50500 PARTITION BY RANGE COLUMNS(dt)(PARTITION p01 VALUES LESS THAN ('2007-01-01') ENGINE = MyISAM,[…]

AFTER5.5

Wednesday, December 1, 2010

MySQL 5.5 - Multiple columns

56

CREATE TABLE t ( a int, b int)PARTITION BY RANGE COLUMNS (a,b)( PARTITION p01 VALUES LESS THAN (10,1), PARTITION p02 VALUES LESS THAN (10,10), PARTITION p03 VALUES LESS THAN (10,20), PARTITION p04 VALUES LESS THAN (MAXVALUE, MAXVALUE));

Wednesday, December 1, 2010

57

CREATE TABLE employees ( emp_no int(11) NOT NULL, birth_date date NOT NULL, first_name varchar(14) NOT NULL, last_name varchar(16) NOT NULL, gender char(1) DEFAULT NULL, hire_date date NOT NULL) ENGINE=MyISAMPARTITION BY RANGE COLUMNS(gender,hire_date)(PARTITION p01 VALUES LESS THAN ('F','1990-01-01'), PARTITION p02 VALUES LESS THAN ('F','2000-01-01'), PARTITION p03 VALUES LESS THAN ('F',MAXVALUE), PARTITION p04 VALUES LESS THAN ('M','1990-01-01'), PARTITION p05 VALUES LESS THAN ('M','2000-01-01'), PARTITION p06 VALUES LESS THAN ('M',MAXVALUE), PARTITION p07 VALUES LESS THAN (MAXVALUE,MAXVALUE)

Wednesday, December 1, 2010

MySQL 5.5 enhancements• TRUNCATE PARTITION• TO_SECONDS()

58

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

SIGNAL and RESIGNAL

• Allow error handling in stored routines

• The execution is passed to an error handler

• Accessible error values are SQLSTATE, MESSAGE_TEXT and MYSQL_ERRNO

• RESIGNAL can pass along the original or a new information

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

semi-synchronous replication

master

slave 1 slave 2

semisynch master plugin

semisynch slave plugin

Wednesday, December 1, 2010

semi-synchronous replication

master

slave 1 slave 2

COMMIT

1

client

Wednesday, December 1, 2010

semi-synchronous replication

master

slave 1 slave 2

2

client

binary logCOMMIT

Wednesday, December 1, 2010

semi-synchronous replication

master

slave 1 slave 2

3

client

binary logCOMMIT

relay log

Wednesday, December 1, 2010

semi-synchronous replication

master

slave 1 slave 2

4

client

binary logCOMMIT

relay log

confirm log reception

Wednesday, December 1, 2010

semi-synchronous replication

master

slave 1 slave 2

5

client

binary logCOMMIT

relay log

Wednesday, December 1, 2010

Contents• Refresh of MySQL main features

• Future: MySQL 5.5✦ performance (InnoDB default engine,

Performance schema)✦ ease of use (partitioning, SIGNAL)✦ reliability (semisynch replication)

• Current: MySQL 5.1✦ performance: InnoDB plugin 1.0.13

Wednesday, December 1, 2010

Missed announcement

• A GA release

• As of MySQL 5.1.47

• The InnoDB plugin is GA

• Ready to use for immediate gains

Wednesday, December 1, 2010

5.1

INNODB

1.0.

13Wednesday, December 1, 2010

5.1

INNODB

1.0.

13

Wednesday, December 1, 2010

INFORMATION SCHEMA table plugin

INFORMATION SCHEMA table plugin

INFORMATION SCHEMA table plugin

INFORMATION SCHEMA table plugin

MySQL Server

InnoDB plugin

Wednesday, December 1, 2010

Installation (1)my.cnf

[mysqld]plugin_dir = /usr/local/mysql/lib/pluginignore_builtin_innodbplugin-load=innodb=ha_innodb_plugin.sodefault-storage-engine=InnoDBinnodb_file_per_table=1innodb_file_format=barracudainnodb_strict_mode=1

Wednesday, December 1, 2010

Installation (1a)my.cnf

[mysqld]plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so#(all in one line with no spaces)

Wednesday, December 1, 2010

Installation (2)SET GLOBAL innodb_fast_shutdown=0;

RESTART the server

Wednesday, December 1, 2010

Installation - 2nd method (1)my.cnf

[mysqld]ignore_builtin_innodb

Wednesday, December 1, 2010

Installation - 2nd method (2)SET GLOBAL innodb_fast_shutdown=0;

RESTART the server

Wednesday, December 1, 2010

Installation - 2nd method (3)mysqlINSTALL PLUGIN INNODB SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_TRX SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_LOCKS SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_LOCK_WAITS SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_CMP SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_CMP_RESET SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_CMPMEM SONAME 'ha_innodb_plugin.so';INSTALL PLUGIN INNODB_CMPMEM_RESET SONAME 'ha_innodb_plugin.so';

Wednesday, December 1, 2010

Installation - 2nd method (4)my.cnf

[mysqld]

default-storage-engine=InnoDBinnodb_file_per_table=1innodb_file_format=barracudainnodb_strict_mode=1

Wednesday, December 1, 2010

Installation - 2nd method (5)SET GLOBAL innodb_fast_shutdown=0;

RESTART the server

Wednesday, December 1, 2010

Installation differences• Method 1 (plugin-load in my.cnf)

✦ Only one operation✦ But error prone (one looooong command)✦ plugins not stored in mysql.plugin table

• Method 2 (install plugin) ✦ plugin info saved to mysql.plugin table✦ Easier to write✦ 2 restarts required

Wednesday, December 1, 2010

CAVEAT

• If you uninstall the InnoDB plugin, remember:✦ The tables are not backward compatible✦ You must uninstall all the

INFORMATION_SCHEMA plugin tables BEFORE removing the InnoDB plugin

✦ If the plugin is busy, it may not be removed until you restart the server

Wednesday, December 1, 2010

hands on

Wednesday, December 1, 2010

Checking installationselect @@version, @@innodb_version;+-----------+------------------+| @@version | @@innodb_version |+-----------+------------------+| 5.1.52 | 1.0.13 |+-----------+------------------+

DEM

O

Wednesday, December 1, 2010

Detecting lockssession1> select c from t1 for update;+------+| c |+------+| aaa || bbb || ccc |+------+

Wednesday, December 1, 2010

Detecting lockssession2> select c from t1 for update;

[… waiting]

Wednesday, December 1, 2010

Detecting lockssession3> select i from t1 for update;

[… waiting]

Wednesday, December 1, 2010

getting locks informationSELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query FROM innodb_lock_waits w INNER JOIN innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN innodb_trx r ON r.trx_id = w.requesting_trx_id

Wednesday, December 1, 2010

getting locks information

Wednesday, December 1, 2010

getting locks information************* 1. row ************** waiting_trx_id: 711 waiting_thread: 3 waiting_query: select c from t1 for updateblocking_trx_id: 710blocking_thread: 2 blocking_query: select i from t1 for update

Wednesday, December 1, 2010

getting locks information************* 2. row ************** waiting_trx_id: 711 waiting_thread: 3 waiting_query: select c from t1 for updateblocking_trx_id: 70Fblocking_thread: 1 blocking_query: NULL

Wednesday, December 1, 2010

getting locks information************* 3. row ************** waiting_trx_id: 710 waiting_thread: 2 waiting_query: select i from t1 for updateblocking_trx_id: 70Fblocking_thread: 1 blocking_query: NULL

Wednesday, December 1, 2010

Read more

Wednesday, December 1, 2010

The MySQL online manual

http://dev.mysql.com/docWednesday, December 1, 2010

High Performance MySQL

Wednesday, December 1, 2010

MySQL High Availability

Wednesday, December 1, 2010

Web Operations

Wednesday, December 1, 2010

Cloud Application Architectures

Wednesday, December 1, 2010

e-mail: datacharmer@continuent.comTwitter: @datacharmer

Contact Information

Continuent Web Site:http://www.continuent.com

Tungsten Projecthttp://sourceforge.net/projects/tungsten

This work is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

Wednesday, December 1, 2010

Recommended