MySQL
Features for the enterprise
Giuseppe Maxia
QA 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
write
r
e
a
d
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/write
master
read/only
slaves
web servers
R/W
R/O
load balancer
load balancer
clients
a web
application
scheme with
replication
Wednesday, December 1, 2010
read/write
master
read/only
slaves
readwrite
r
e
a
d
database load
with
replication
85% 15% 100%
Wednesday, December 1, 2010
read/write
master
read/only
slaves
readwrite
r
e
a
d
scaling
database load
with
replication
85% 15% 100%
Wednesday, December 1, 2010
Replication assessment
without 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 tables
!risk of duplicates
!insert in each table
!no constraints
MERGE TABLE
Wednesday, December 1, 2010
It isn't a merge table!
!One table
!No risk of duplicates
!insert in one table
!constraints 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
I
N
D
E
X
D
A
T
A
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
D
A
T
A I
N
D
E
X
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 range
InnoDB 4 min 30s
MyISAM 25.03s
Archive 22 min 25s
InnoDB partitioned by month 13.19
MyISAM partitioned by year 6.31
MyISAM partitioned by month 4.45
Archive partitioned by year 16.67
Archive partitioned by month 8.97
Wednesday, December 1, 2010
Leveraging replication
Wednesday, December 1, 2010
read/write
master
read/only
slaves
R/W
R/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
make
summary
tables
Wednesday, December 1, 2010
master
slave
innodb
non partitioned
slave
innodb
non partitionedinnodb
partitioned by range
slave
MyISAM
partitioned by range
Partitions
for heavy
statistics
Wednesday, December 1, 2010
master
slave
innodb
non partitioned
slave
innodb
non partitioned
ARCHIVE
partitioned by range
(date)
slave
ARCHIVE
partitioned by range
(product)
slave
ARCHIVE
partitioned 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 engine
select @@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 version
select @@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 schema
SELECT EVENT_ID, EVENT_NAME, TIMER_WAIT
FROM EVENTS_WAITS_HISTORY
WHERE THREAD_ID = 13
ORDER 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 schema
mysql> 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));
BEFO
RE
5.1
Wednesday, December 1, 2010
MySQL 5.5 enhancements
53
SHOW CREATE TABLE t G
Table: t
Create 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,
[…]
BEFO
RE
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));
AFTER
5.5
Wednesday, December 1, 2010
MySQL 5.5 enhancements
55
SHOW CREATE TABLE t
Table: t
Create 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,
[…]
AFTER
5.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=MyISAM
PARTITION 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 log
COMMIT
Wednesday, December 1, 2010
semi-synchronous replication
master
slave 1 slave 2
3
client
binary log
COMMIT
relay log
Wednesday, December 1, 2010
semi-synchronous replication
master
slave 1 slave 2
4
client
binary log
COMMIT
relay log
confirm log
reception
Wednesday, December 1, 2010
semi-synchronous replication
master
slave 1 slave 2
5
client
binary log
COMMIT
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
INNODB1.0.13
Wednesday, December 1, 2010
5.1
INNODB1.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/plugin
ignore_builtin_innodb
plugin-load=innodb=ha_innodb_plugin.so
default-storage-engine=InnoDB
innodb_file_per_table=1
innodb_file_format=barracuda
innodb_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)
mysql
INSTALL 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=InnoDB
innodb_file_per_table=1
innodb_file_format=barracuda
innodb_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 installation
select @@version, @@innodb_version;
+-----------+------------------+
| @@version | @@innodb_version |
+-----------+------------------+
| 5.1.52 | 1.0.13 |
+-----------+------------------+
D
EM
O
Wednesday, December 1, 2010
Detecting locks
session1> select c from t1 for update;
+------+
| c |
+------+
| aaa |
| bbb |
| ccc |
+------+
Wednesday, December 1, 2010
Detecting locks
session2> select c from t1 for update;
[… waiting]
Wednesday, December 1, 2010
Detecting locks
session3> select i from t1 for update;
[… waiting]
Wednesday, December 1, 2010
getting locks information
SELECT
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
update
blocking_trx_id: 710
blocking_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
update
blocking_trx_id: 70F
blocking_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
update
blocking_trx_id: 70F
blocking_thread: 1
blocking_query: NULL
Wednesday, December 1, 2010
Read more
Wednesday, December 1, 2010
The MySQL online manual
http://dev.mysql.com/doc
Wednesday, 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.com
Twitter: @datacharmer
Contact Information
Continuent Web Site:
http://www.continuent.com
Tungsten Project
http://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

Mysql features for the enterprise

  • 1.
    MySQL Features for theenterprise Giuseppe Maxia QA 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
  • 2.
    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
  • 3.
    Contents • Refresh ofMySQL 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
  • 4.
    Contents • Refresh ofMySQL 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
  • 5.
    Main features • Easeof use • Installation • Maintenance • Reliability • ACID compliant • Built-in replication • Performance • Scalable • Built-in partitioning Wednesday, December 1, 2010
  • 6.
    And more ... •Stored routines • Triggers • Views • Information and performance schema • Event scheduler • Pluggable functions • Pluggable storage engines Wednesday, December 1, 2010
  • 7.
  • 8.
    As easy as •apt-get install mysql-server • yum install mysql-server Manual installation requires less than 15 minutes Wednesday, December 1, 2010
  • 9.
  • 10.
    MVCC storage engine •Use Innodb • Transactions • Referential integrity Wednesday, December 1, 2010
  • 11.
  • 12.
    a simple web application scheme databaseserver web server clients r/w requests Wednesday, December 1, 2010
  • 13.
    database server web servers loadbalancer clients r/w requests scaling web requests Wednesday, December 1, 2010
  • 14.
    write r e a d database load on asimple web application 85% 15% Wednesday, December 1, 2010
  • 15.
    readwrite database load ona successful web application 20% 80% Wednesday, December 1, 2010
  • 16.
    database server web servers loadbalancer clients r/w requests ✘ scaling up means buying a bigger database server Wednesday, December 1, 2010
  • 17.
    readwrite the bigger database serverwill eventually have the same problem 80%20% Wednesday, December 1, 2010
  • 18.
    read/write master read/only slaves web servers R/W R/O load balancer loadbalancer clients a web application scheme with replication Wednesday, December 1, 2010
  • 19.
  • 20.
  • 21.
    Replication assessment without replicationwith 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
  • 22.
  • 23.
    Remember the MERGEtables? !separate tables !risk of duplicates !insert in each table !no constraints MERGE TABLE Wednesday, December 1, 2010
  • 24.
    It isn't amerge table! !One table !No risk of duplicates !insert in one table !constraints enforced PARTITIONED TABLE Wednesday, December 1, 2010
  • 25.
    Partition pruning 1a -unpartitioned table - SINGLE RECORD select * from table_name where colx = 120 Wednesday, December 1, 2010
  • 26.
    Partition pruning 1a -unpartitioned table - SINGLE RECORD select * from table_name where colx = 120 I N D E X D A T A Wednesday, December 1, 2010
  • 27.
    Partition pruning 1c -unpartitioned table - RANGE select * from table_name where colx between 120 and 230 Wednesday, December 1, 2010
  • 28.
    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
  • 29.
    Partition pruning 2a -table partitioned by colx - SINGLE REC select * from table_name where colx = 120 D A T A I N D E X 100-199 1-99 200-299 300-399 400-499 500-599 Wednesday, December 1, 2010
  • 30.
    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
  • 31.
    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
  • 32.
    Benchmarking results (hugeserver) engine 6 month range InnoDB 4 min 30s MyISAM 25.03s Archive 22 min 25s InnoDB partitioned by month 13.19 MyISAM partitioned by year 6.31 MyISAM partitioned by month 4.45 Archive partitioned by year 16.67 Archive partitioned by month 8.97 Wednesday, December 1, 2010
  • 33.
  • 34.
  • 35.
    backup master slaves STOP SLAVE remove slave fromload balancer START SLAVE perform backup attach slave to load balancer Let slave catch up Wednesday, December 1, 2010
  • 36.
    master slaves STOP SLAVE remove slave fromload balancer START SLAVE calculate summary tables attach slave to load balancer Let slave catch up make summary tables Wednesday, December 1, 2010
  • 37.
    master slave innodb non partitioned slave innodb non partitionedinnodb partitionedby range slave MyISAM partitioned by range Partitions for heavy statistics Wednesday, December 1, 2010
  • 38.
    master slave innodb non partitioned slave innodb non partitioned ARCHIVE partitionedby range (date) slave ARCHIVE partitioned by range (product) slave ARCHIVE partitioned by range (location) Simulating multiple dimensions Wednesday, December 1, 2010
  • 39.
    Contents • Refresh ofMySQL 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
  • 40.
    MySQL 5.5 • MySQL5.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
  • 41.
    Contents • Refresh ofMySQL 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
  • 42.
    default engine select @@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
  • 43.
    Plugin version select @@version,@@innodb_version; +-----------+------------------+ | @@version | @@innodb_version | +-----------+------------------+ | 5.5.7-rc | 1.1.3 | +-----------+------------------+ Wednesday, December 1, 2010
  • 44.
    InnoDB at aglance • 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
  • 45.
    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
  • 46.
    Contents • Refresh ofMySQL 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
  • 47.
    PERFORMANCE SCHEMA • PERFORMANCE_SCHEMA presentslow level MySQL performance information • Data can be cleared • Filters with WHERE are allowed • Must be enabled with --performance_schema Wednesday, December 1, 2010
  • 48.
    performance schema SELECT EVENT_ID,EVENT_NAME, TIMER_WAIT FROM EVENTS_WAITS_HISTORY WHERE THREAD_ID = 13 ORDER 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
  • 49.
    performance schema mysql> UPDATESETUP_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
  • 50.
    Contents • Refresh ofMySQL 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
  • 51.
    MySQL 5.5 enhancements •PARTITION BY RANGE COLUMNS • PARTITION BY LIST COLUMNS • TO_SECONDS 51 Wednesday, December 1, 2010
  • 52.
    MySQL 5.5 enhancements 52 CREATETABLE 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)); BEFO RE 5.1 Wednesday, December 1, 2010
  • 53.
    MySQL 5.5 enhancements 53 SHOWCREATE TABLE t G Table: t Create 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, […] BEFO RE 5.1 Wednesday, December 1, 2010
  • 54.
    MySQL 5.5 enhancements 54 CREATETABLE 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)); AFTER 5.5 Wednesday, December 1, 2010
  • 55.
    MySQL 5.5 enhancements 55 SHOWCREATE TABLE t Table: t Create 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, […] AFTER 5.5 Wednesday, December 1, 2010
  • 56.
    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.
    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=MyISAM PARTITION 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
  • 58.
    MySQL 5.5 enhancements •TRUNCATE PARTITION • TO_SECONDS() 58 Wednesday, December 1, 2010
  • 59.
    Contents • Refresh ofMySQL 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
  • 60.
    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
  • 61.
    Contents • Refresh ofMySQL 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
  • 62.
    semi-synchronous replication master slave 1slave 2 semisynch master plugin semisynch slave plugin Wednesday, December 1, 2010
  • 63.
    semi-synchronous replication master slave 1slave 2 COMMIT 1 client Wednesday, December 1, 2010
  • 64.
    semi-synchronous replication master slave 1slave 2 2 client binary log COMMIT Wednesday, December 1, 2010
  • 65.
    semi-synchronous replication master slave 1slave 2 3 client binary log COMMIT relay log Wednesday, December 1, 2010
  • 66.
    semi-synchronous replication master slave 1slave 2 4 client binary log COMMIT relay log confirm log reception Wednesday, December 1, 2010
  • 67.
    semi-synchronous replication master slave 1slave 2 5 client binary log COMMIT relay log Wednesday, December 1, 2010
  • 68.
    Contents • Refresh ofMySQL 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
  • 69.
    Missed announcement • AGA release • As of MySQL 5.1.47 • The InnoDB plugin is GA • Ready to use for immediate gains Wednesday, December 1, 2010
  • 70.
  • 71.
  • 72.
    INFORMATION SCHEMA table plugin INFORMATION SCHEMAtable plugin INFORMATION SCHEMA table plugin INFORMATION SCHEMA table plugin MySQL Server InnoDB plugin Wednesday, December 1, 2010
  • 73.
    Installation (1) my.cnf [mysqld] plugin_dir =/usr/local/mysql/lib/plugin ignore_builtin_innodb plugin-load=innodb=ha_innodb_plugin.so default-storage-engine=InnoDB innodb_file_per_table=1 innodb_file_format=barracuda innodb_strict_mode=1 Wednesday, December 1, 2010
  • 74.
  • 75.
    Installation (2) SET GLOBALinnodb_fast_shutdown=0; RESTART the server Wednesday, December 1, 2010
  • 76.
    Installation - 2ndmethod (1) my.cnf [mysqld] ignore_builtin_innodb Wednesday, December 1, 2010
  • 77.
    Installation - 2ndmethod (2) SET GLOBAL innodb_fast_shutdown=0; RESTART the server Wednesday, December 1, 2010
  • 78.
    Installation - 2ndmethod (3) mysql INSTALL 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
  • 79.
    Installation - 2ndmethod (4) my.cnf [mysqld] default-storage-engine=InnoDB innodb_file_per_table=1 innodb_file_format=barracuda innodb_strict_mode=1 Wednesday, December 1, 2010
  • 80.
    Installation - 2ndmethod (5) SET GLOBAL innodb_fast_shutdown=0; RESTART the server Wednesday, December 1, 2010
  • 81.
    Installation differences • Method1 (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
  • 82.
    CAVEAT • If youuninstall 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
  • 83.
  • 84.
    Checking installation select @@version,@@innodb_version; +-----------+------------------+ | @@version | @@innodb_version | +-----------+------------------+ | 5.1.52 | 1.0.13 | +-----------+------------------+ D EM O Wednesday, December 1, 2010
  • 85.
    Detecting locks session1> selectc from t1 for update; +------+ | c | +------+ | aaa | | bbb | | ccc | +------+ Wednesday, December 1, 2010
  • 86.
    Detecting locks session2> selectc from t1 for update; [… waiting] Wednesday, December 1, 2010
  • 87.
    Detecting locks session3> selecti from t1 for update; [… waiting] Wednesday, December 1, 2010
  • 88.
    getting locks information SELECT r.trx_idwaiting_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
  • 89.
  • 90.
    getting locks information *************1. row ************** waiting_trx_id: 711 waiting_thread: 3 waiting_query: select c from t1 for update blocking_trx_id: 710 blocking_thread: 2 blocking_query: select i from t1 for update Wednesday, December 1, 2010
  • 91.
    getting locks information *************2. row ************** waiting_trx_id: 711 waiting_thread: 3 waiting_query: select c from t1 for update blocking_trx_id: 70F blocking_thread: 1 blocking_query: NULL Wednesday, December 1, 2010
  • 92.
    getting locks information *************3. row ************** waiting_trx_id: 710 waiting_thread: 2 waiting_query: select i from t1 for update blocking_trx_id: 70F blocking_thread: 1 blocking_query: NULL Wednesday, December 1, 2010
  • 93.
  • 94.
    The MySQL onlinemanual http://dev.mysql.com/doc Wednesday, December 1, 2010
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
    e-mail: datacharmer@continuent.com Twitter: @datacharmer ContactInformation Continuent Web Site: http://www.continuent.com Tungsten Project http://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