SlideShare una empresa de Scribd logo
1 de 100
Descargar para leer sin conexión
MySQL Best Practices
for DBAs and Developers
Volume 1
MySQL Best Practices for DBAs and Developers - 2010.10
Title
OTN LAD Tour
South America
2010.10
Ronald Bradford
http://ronaldbradford.com
MySQL Best Practices for DBAs and Developers - 2010.10
Agenda
Essential MySQL configuration
Improving your SQL
MySQL user security
Schema optimizations
Instrumentation
Monitoring
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
Server SQL Mode
"Modes define what SQL syntax MySQL
should support and what kind of data
validation checks it should perform."
http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
Minimum
Recommended
Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
sql_mode = "STRICT_ALL_TABLES,
NO_ZERO_DATE,
NO_ZERO_IN_DATE,
NO_ENGINE_SUBSTITUTION";
Minimum
Recommended
Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
sql_mode = "STRICT_ALL_TABLES,
NO_ZERO_DATE,
NO_ZERO_IN_DATE,
NO_ENGINE_SUBSTITUTION";
mysql> SET GLOBAL
sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION";
# my.cnf
sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION"
Minimum
Recommended
Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Mode Examples
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Mode Examples
mysql> INSERT INTO orders (qty) VALUES (-1);
ERROR 1264 (22003): Out of range value for column 'i' at row 1
mysql> INSERT INTO orders (qty) VALUES (9000);
ERROR 1264 (22003): Out of range value for column 'i' at row 1
✔
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Mode Examples
mysql> INSERT INTO orders (qty) VALUES (-1);
ERROR 1264 (22003): Out of range value for column 'i' at row 1
mysql> INSERT INTO orders (qty) VALUES (9000);
ERROR 1264 (22003): Out of range value for column 'i' at row 1
✔
mysql> INSERT INTO orders (qty) VALUES (-1);
mysql> INSERT INTO orders (qty) VALUES (9000);
mysql> SELECT * FROM orders;
+-----+
| qty |
+-----+
| 0 |
| 255 |
+-----+
✘
column is a 1 byte unsigned integer
data type - TINYINT
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Mode Examples
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Mode Examples
mysql> INSERT INTO orders (d) VALUES ('2010-02-31');
ERROR 1292 (22007): Incorrect date value: '2010-02-31' for
column 'd' at row 1
✔
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Mode Examples
mysql> INSERT INTO orders (d) VALUES ('2010-02-31');
ERROR 1292 (22007): Incorrect date value: '2010-02-31' for
column 'd' at row 1
✔
mysql> INSERT INTO orders (d) VALUES ('2010-02-31');
mysql> SELECT * FROM orders;
+------------+
| d |
+------------+
| 0000-00-00 |
+------------+
✘
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
Recommended
Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
storage_engine="InnoDB"
Recommended
Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
storage_engine="InnoDB"
mysql> SET GLOBAL storage_engine="innodb";
# my.cnf
default-storage-engine=innodb
Recommended
Configuration
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
mysql> INSERT INTO orders (order_id) VALUES (1),(2);
mysql> INSERT INTO orders (order_id) VALUES (3),(2);
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
mysql> SELECT * FROM orders;
+---+
| i |
+---+
| 1 |
| 2 |
+---+
✔
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
mysql> INSERT INTO orders (order_id) VALUES (1),(2);
mysql> INSERT INTO orders (order_id) VALUES (3),(2);
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
mysql> SELECT * FROM orders;
+---+
| i |
+---+
| 1 |
| 2 |
+---+
mysql> INSERT INTO orders (order_id) VALUES (1),(2);
mysql> INSERT INTO orders (order_id) VALUES (3),(2);
ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
mysql> SELECT * FROM orders;
+---+
| i |
+---+
| 1 |
| 2 |
| 3 |
+---+
✔
✘
Default MyISAM storage engine is
non-transactional
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
Use a transactional storage engine
e.g. InnoDB
Other options exist
MySQL default is MyISAM (*)
non-transactional
table level locking
No auto recovery
Changing to InnoDB
in MySQL 5.5
MySQL Best Practices for DBAs and Developers - 2010.10
Configuration Best Practices
MySQL Idiosyncrasies that BITE
Data Integrity
Storage Engine defaults
Referential Integrity
Much more ...
http://rb42.com/idiosyncrasies
MySQL Best Practices for DBAs and Developers - 2010.10
Security
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
Default is woeful
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
Default is woeful
Minimum
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
Default is woeful
Minimum
$ mysql_secure_installation
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
Default is woeful
Minimum
$ mysql_secure_installation
Recommended
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
Default is woeful
Minimum
$ mysql_secure_installation
Recommended
Operating System
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Physical Security
Default is woeful
Minimum
$ mysql_secure_installation
Recommended
Operating System
Permissions & Privileges
MySQL Best Practices for DBAs and Developers - 2010.10
Operating System Security
Defaults are not secure
Never run as 'root' user
Separate Data/Binary Logs/Logs/
Configuration/Backups
Individual directory permissions
• Minimize security risk
• Better auditability
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Installation Best Practice
Best Practice
/mysql
/etc
/data
/binlog
/log
/mysql-version
/etc/my.cnf
/etc/profile.d/mysql.sh
/etc/init.d/mysqld
Single partition per
MySQL Instance
Global files as symlinks
from partition
MySQL Best Practices for DBAs and Developers - 2010.10
MySQL Installation Security
Software installed by root
Separate MySQL permissions for directories
$ chown -R root:root /mysql
$ chown -R mysql:mysql /mysql/{data,log,binlog,etc}
$ chmod 700 /mysql/{data,binlog}
$ chmod 750 /mysql/{etc,log}
MySQL Best Practices for DBAs and Developers - 2010.10
Application User Security
•Username
•Password
•Host (location of username)
MySQL Best Practices for DBAs and Developers - 2010.10
Application User Security
CREATE USER appuser@localhost IDENTIFIED BY 'sakila';
GRANT SELECT,INSERT,UPDATE,DELETE
ON schema.* TO appuser@localhost;
Best Practice
✔
•Username
•Password
•Host (location of username)
MySQL Best Practices for DBAs and Developers - 2010.10
Application User Security
CREATE USER appuser@localhost IDENTIFIED BY 'sakila';
GRANT SELECT,INSERT,UPDATE,DELETE
ON schema.* TO appuser@localhost;
CREATE USER superman@'%';
GRANT ALL ON *.* TO superman@'%';
Best Practice
Normal Practice
✔
✘
•Username
•Password
•Host (location of username)
MySQL Best Practices for DBAs and Developers - 2010.10
Why not use GRANT ALL
MySQL Best Practices for DBAs and Developers - 2010.10
Why not use GRANT ALL
GRANT ALL ON *.* TO user@’%’
MySQL Best Practices for DBAs and Developers - 2010.10
Why not use GRANT ALL
GRANT ALL ON *.* TO user@’%’
*.* gives you access to all tables in all schemas
MySQL Best Practices for DBAs and Developers - 2010.10
Why not use GRANT ALL
GRANT ALL ON *.* TO user@’%’
*.* gives you access to all tables in all schemas
@’%’ give you access from any external location
MySQL Best Practices for DBAs and Developers - 2010.10
Why not use GRANT ALL
GRANT ALL ON *.* TO user@’%’
*.* gives you access to all tables in all schemas
@’%’ give you access from any external location
ALL gives you
MySQL Best Practices for DBAs and Developers - 2010.10
Why not use GRANT ALL
GRANT ALL ON *.* TO user@’%’
*.* gives you access to all tables in all schemas
@’%’ give you access from any external location
ALL gives you
ALTER,ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES,
CREATE USER, CREATEVIEW, DELETE, DROP, EVENT, EXECUTE, FILE, INDEX, INSERT,
LOCK TABLES, PROCESS, REFERENCES, RELOAD, REPLICATION CLIENT, REPLICATION
SLAVE, SELECT, SHOW DATABASES, SHOWVIEW, SHUTDOWN, SUPER,TRIGGER,
UPDATE, USAGE
See MySQL Idiosyncrasies that BITE presentation -- http://rb42.com/idiosyncrasies
MySQL Best Practices for DBAs and Developers - 2010.10
Application User Security Best Practices
ApplicationViewer (Read Only Access)
SELECT
Application User (Read/Write Access)
INSERT, UPDATE, DELETE, SELECT
Application DBA (Schema Access Only)
CREATE, DROP, CREATE ROUTINE,
SELECT, INSERT, UPDATE, DELETE
• Track Data Security
• Separation of responsibilities
MySQL Best Practices for DBAs and Developers - 2010.10
SQL
MySQL Best Practices for DBAs and Developers - 2010.10
Development Best Practices
Comment your SQL
Format your SQL
Future proof your SQL
Log your SQL
Analyze your SQL
Always use transactions
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Commenting
Identify queries by code function
Identify OLTP / Batch / Cache queries
SELECT /* XXX123 */ ...
UPDATE /* YYY999 */ ...
SELECT /* Batch */...
• DBA/SA can identify code function
and purpose quickly
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Commenting (2)
26 Query SELECT /* 5m cache */ .....
26 Query SELECT /* ViewPost */ t.*, tt.*, tr.object_id FROM
wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id =
t.term_id INNER JOIN wp_term_relationships AS tr ON
tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN
('category', 'post_tag') AND tr.object_id IN (2849, 2842, 2836,
2824, 2812, 2680, 2813, 2800, 2770, 2784) ORDER BY t.name ASC
26 Query SELECT /* batch */ key, value FROM usermeta WHERE user_id
= 2
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Formatting
Create single line queries
Don't embed newlines
Enables per line analysis by CLI tools
• DBA/SA can use simple CLI tools
including grep,awk,cut etc for SQL analysis
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Formatting (2)
26 Query SELECT FOUND_ROWS()
26 Query SELECT post_id,start,end,allday,rpt,IF(end>='2010-06-04
00:00:00',1,0) AS active
FROM wp_ec3_schedule
WHERE post_id IN (2849,2842,2836,2824,2812,2680,2770,2784)
ORDER BY start
26 Query SELECT * FROM wp_users WHERE user_login = 'ronald'
26 Query SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER
JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN
wp_term_relationships AS tr ON tr.term_taxonomy_id =
tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag')
AND tr.object_id IN (2849, 2842, 2836, 2824, 2812, 2680, 2813, 2800,
2770, 2784) ORDER BY t.name ASC
26 Query SELECT meta_key, meta_value FROM wp_usermeta WHERE
user_id = 2
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Formatting (2)
$ cut -c12-80 general.log
SELECT FOUND_ROWS()
SELECT post_id,start,end,allday,rpt,IF(end>='2010-06-04',1,0
p_ec3_schedule
post_id IN (2849,2842,2836,2824,2812,2680,2770,2784)
BY start
SELECT * FROM wp_users WHERE user_login = 'ronald'
SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN ...
SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 2
MySQL Best Practices for DBAs and Developers - 2010.10
Future proofing your SQL
Specify INSERT column names
INSERT INTO table(a,b,c) VALUES(...)
mysql> INSERT INTO example VALUES (10,10,'A');
mysql> ALTER TABLE example ADD d DATE;
mysql> INSERT INTO example VALUES (10,10,'A');
ERROR 1136 (21S01): Column count doesn't match
value count at row 1
• Reduce likelihood of runtime errors
when structural changes to objects
MySQL Best Practices for DBAs and Developers - 2010.10
Future proofing your SQL
Always use column aliases in joins
SELECT a.col1, b.col2 ...
mysql> SELECT id, name, val
> FROM parent p, child c
> WHERE p.id = c.parent_id;
mysql> alter table child add name varchar(10);
mysql> SELECT id, name, val FROM parent p, child
c WHERE p.id = c.parent_id;
ERROR 1052 (23000): Column 'name' in field list
is ambiguous
MySQL Best Practices for DBAs and Developers - 2010.10
Future proofing your SQL
SELECT * is generally bad
What columns are actually used in code
TEXT/BLOB can cause extra disk I/O
New columns can change performance
MySQL Best Practices for DBAs and Developers - 2010.10
Avoid Fancy Constructs
DELAYED
IGNORE
LOW PRIORITY
REPLACE
• Changes ACID and statement precedence
• May have additional performance overhead
MySQL Best Practices for DBAs and Developers - 2010.10
Use Deterministic Functions
Use '2010-06-21' instead of CURDATE()
Same for NOW()
Don't Use ORDER BY RAND()
Leverage Query Cache (if enabled)
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Analysis
MySQL Best Practices for DBAs and Developers - 2010.10
General Query Log
Logs all SQL Statements
Turn on for all development environments
Aggregate and email results to developer
Works best in single user environment
• Developers are seeing SQL in operation
• Enables access to SQL to analyze
MySQL Best Practices for DBAs and Developers - 2010.10
General Query Log
mysql> SET GLOBAL general_log=OFF;
mysql> SET GLOBAL general_log=ON;
mysql> SELECT event_time,argument FROM mysql.general_log;
+---------------------+---------------------------------------------------+
| event_time | argument |
+---------------------+---------------------------------------------------+
| 2010-10-11 21:48:05 | select * from test1 |
| 2010-10-11 21:48:30 | SELECT event_time,argument FROM mysql.general_log |
+---------------------+---------------------------------------------------+
# my.cnf
general_log = ON
general_log_file = /mysql/log/general.log
log_output = FILE,TABLE
WARNING
Never enable in production
http://dev.mysql.com/doc/refman/5.1/en/query_log.html
MySQL Best Practices for DBAs and Developers - 2010.10
Leveraging General Query Log
For single user development environment
In SQL Session
In Application
Run Function/Process
In SQL Session
mysql> SELECT 'Function X Start';
mysql> SELECT 'Function X End';
MySQL Best Practices for DBAs and Developers - 2010.10
General Query Log Output
$ tail /mysql/log/general.log
101011 21:58:00 3 Query SELECT 'Function X Start'
101011 21:58:09 2 Query SELECT * from sample_int
101011 21:58:41 2 Query SELECT * from example
101011 21:58:47 3 Query SELECT 'Function X End'
http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
MySQL Best Practices for DBAs and Developers - 2010.10
SQL Analysis
Bulk trending analysis
Volume of SQL statements
Query Execution Plan (QEP)
Online v Batch/Cache SQL via
commenting
• Identify bottlenecks ASAP without load
• Iterative Design feedback
MySQL Best Practices for DBAs and Developers - 2010.10
Know your SQL
MySQL Best Practices for DBAs and Developers - 2010.10
Common SQL Errors
Remove redundant SQL
Use general query log
You may be surprised!
MySQL Best Practices for DBAs and Developers - 2010.10
Common Coding Errors - Repeating Queries
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist` WHERE (ArtistID = 196 )
5 Query SELECT * FROM `artist` WHERE (ArtistID = 2188 )
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
The WRONG way
SQL for one page load
8 unwanted full table scans *BUG*
Removed gave 20x faster page load
MySQL Best Practices for DBAs and Developers - 2010.10
Common Coding Errors - Repeating Queries
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist` WHERE (ArtistID = 196 )
5 Query SELECT * FROM `artist` WHERE (ArtistID = 2188 )
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
5 Query SELECT * FROM `artist`
The WRONG way
SQL for one page load
8 unwanted full table scans *BUG*
Removed gave 20x faster page load
Not cached (too big)
If cached, two queries
MySQL Best Practices for DBAs and Developers - 2010.10
RAT v CAT Processing
SELECT * FROM activities_theme WHERE theme_parent_id=0
SELECT * FROM activities_theme WHERE theme_parent_id=1
SELECT * FROM activities_theme WHERE theme_parent_id=2
SELECT * FROM activities_theme WHERE theme_parent_id=11
SELECT * FROM activities_theme WHERE theme_parent_id=16
SELECT *
FROM activities_theme
WHERE theme_parent_id in (0,1,2,11,16)
Row (RAT) Processing
Chunk (CAT) Processing
MySQL Best Practices for DBAs and Developers - 2010.10
RAT v CAT Processing
SELECT * FROM activities_theme WHERE theme_parent_id=0
SELECT * FROM activities_theme WHERE theme_parent_id=1
SELECT * FROM activities_theme WHERE theme_parent_id=2
SELECT * FROM activities_theme WHERE theme_parent_id=11
SELECT * FROM activities_theme WHERE theme_parent_id=16
SELECT *
FROM activities_theme
WHERE theme_parent_id in (0,1,2,11,16)
Row (RAT) Processing
Chunk (CAT) Processing
✔
✘
MySQL Best Practices for DBAs and Developers - 2010.10
Common Coding Errors - Boundary Conditions
The following SQL executed 6,000
times in 5 minute analysis period
0 is an invalid pages_id
SELECT pages_id, pages_livestats_code, pages_title,
pages_parent, pages_exhibid, pages_theme,
pages_accession_num
FROM pages WHERE pages_id = 0
The WRONG way
MySQL Best Practices for DBAs and Developers - 2010.10
In a highly tuned system
the greatest time in a
query is network
overhead
MySQL Best Practices for DBAs and Developers - 2010.10
Common Coding Errors
Remove duplicate code
• Less code to maintain
• Remove chance of human errors
MySQL Best Practices for DBAs and Developers - 2010.10
Defining your database connection
$ cd public_html
$ grep "mysql*_connect" * */* */*/*
db-disp.php:$cid = mysql_connect("localhost", "museum", "******") or die ('I
cannot connect to the database because: ' . mysql_error());
test.php:$cid = mysql_connect("localhost", "museum", "******");
PMCollection/connection.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser",
"$sqlpass");
PMCollection/connection_live.php: $dbcnx = mysql_connect("$sqlhost",
"$sqluser", "$sqlpass");
PMCollection/connection_local.php: $dbcnx = mysql_connect("$sqlhost",
"$sqluser", "$sqlpass");
PMEcards/connection.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser",
"$sqlpass");
core/connection.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser",
"$sqlpass");
discussion_admin/db_fns.php: $cid = mysql_connect("localhost", "museum",
"******");
discussion_admin/header.php:// $cid = mysql_connect("localhost", "museum",
"******");
discussion_admin/inc_title.php: //$cid = mysql_connect("localhost",
"museum", "******");
discussion_admin/stats.php: //$cid = mysql_connect("localhost", "museum",
The WRONG way
MySQL Best Practices for DBAs and Developers - 2010.10
Database connection example
class database {
function getConnection($type, $message) {
try {
$con = mysqli_connect($cp->host,$cp->user,$cp->passwd,$cp->database);
if (!$con) {
$message = new message ("fatal", "Unable to obtain a '$type' ...
return;
}
mysqli_query($con, "SET NAMES 'utf8'");
} catch (Exception $e) {
$message = new message ("fatal", "Unable to obtain a '$type' ...
debug($e->getMessage());
}
return $con;
}
The RIGHT way
MySQL Best Practices for DBAs and Developers - 2010.10
Database Connections
Open and close database connections
only when necessary
• Reduce unnecessary database load
• Increases page serve volume
• Increases true DB throughput
MySQL Best Practices for DBAs and Developers - 2010.10
Database Connections Initialization
$ cat header.php
...
$con = getConnection();
...
if($this_user->user_row["status"]!='ws' &&
in_array($this_page->getValue(),$page)){
header("Location: /permission.php");
exit();
}
...
if () {
header("Location: abc.php");
exit();
}
...
if () {
header("Location: xyz.php");
exit();
}
...
The WRONG way
MySQL Best Practices for DBAs and Developers - 2010.10
Schema Design
MySQL Best Practices for DBAs and Developers - 2010.10
Design Best Practices
Optimal Data Types
Saving Disk Space
Naming Standards
MySQL Best Practices for DBAs and Developers - 2010.10
About MySQL Data Types
Numeric Data Types
Oracle has 1
MySQL has 9
TINYINT,SMALLINT,MEDIUMINT,INT,
BIGINT,FLOAT,DOUBLE,DECIMAL,BIT
MySQL Best Practices for DBAs and Developers - 2010.10
Optimal Auto Increment Primary Key
Don't use BIGINT AUTO_INCREMENT
Use INT UNSIGNED AUTO_INCREMENT
BIGINT is 8 bytes
INT is 4 Bytes
INT UNSIGNED stores 4.3 billion values
• Can reduce index space by 50+%
• Better memory usage, less I/O
http://ronaldbradford.com//blog/bigint-v-int-is-there-a-big-deal-2008-07-18/
MySQL Best Practices for DBAs and Developers - 2010.10
INT(1)
This is not 1 byte, it's 4 bytes
(1) is only for client display only
Client with 10+ flags using INT(1)
40 bytes reduced to 10 bytes
or 2 bytes using bit operators
INT(1) is not what it
looks like
Horror Stories
MySQL Best Practices for DBAs and Developers - 2010.10
Dates
MySQL supports
DATE, DATETIME, TIMESTAMP, YEAR
TIMESTAMP for Epoch values
TIMESTAMP is 4 bytes
DATETIME is 8 bytes
Supports DEFAULT CURRENT_TIMESTAMP
Neither store milliseconds
MySQL Best Practices for DBAs and Developers - 2010.10
The beauty of ENUM
Values Check Constraint
Ideal for static codes
Compact - i.e. 1 byte for 'True', 'False'
Human readable values
5.1 Non blocking ALTER
MySQL Best Practices for DBAs and Developers - 2010.10
TRUE/FALSE Datatype Examples
CREATE TABLE enums (
flag1 CHAR(1) NULL COMMENT 'T or F, Y or N',
flag2 TINYINT NULL COMMENT '0 or 1',
flag3 BIT NULL COMMENT 'True or False',
flag4 ENUM ('True','False') NULL,
flag5 VARCHAR(5) NULL
);
INSERT INTO enums(flag4, flag1, flag2)
VALUES ('True', 'T', 1), ('False', 'F', 0);
SELECT flag1, flag2, flag4 FROM enums;
+-------+-------+-------+
| flag1 | flag2 | flag4 |
+-------+-------+-------+
| T | 1 | True |
| F | 0 | False |
+-------+-------+-------+
•All are 1 Byte, which
is more readable?
MySQL Best Practices for DBAs and Developers - 2010.10
Schema Management
Always have current schema.sql
Use Patch/Revert SQL for upgrades
See http://schemasync.org
• Reproducibility
• Upgrade/Downgrade path
MySQL Best Practices for DBAs and Developers - 2010.10
Testing
MySQL Best Practices for DBAs and Developers - 2010.10
Testing is not about
what works; testing is
about breaking your
software
MySQL Best Practices for DBAs and Developers - 2010.10
Resilience
What is your backup strategy?
What is your recovery strategy?
How long does it take?
Have you actually tested it end to end?
Take the survey
http://rb42.com/mysql-backup-quiz
MySQL Best Practices for DBAs and Developers - 2010.10
Instrumentation
MySQL Best Practices for DBAs and Developers - 2010.10
Application Instrumentation
Creating one primary abstract DB call
Enable logging of ALL SQL statements
Enable embedded HTML output
Total Execution Time/Count
Individual SQL Execution Time/SQL
• Enable runtime analysis via browser
• No additional tools needed to gather
MySQL Best Practices for DBAs and Developers - 2010.10
Sharding 101
63
Joomla
•SQL Statements Example
MySQL Best Practices for DBAs and Developers - 2010.10
Sharding 101
64
Cold Fusion
•SQL Statements Example
MySQL Best Practices for DBAs and Developers - 2010.10
Application Instrumentation Benefits
End to End Timing
Component Timing
(i.e. a series of SQL)
Observe as desired
Intelligent Activation
e.g. Page Load exceeds x ms
MySQL Best Practices for DBAs and Developers - 2010.10
Monitoring
MySQL Best Practices for DBAs and Developers - 2010.10
If you don't have
monitoring in
place, make it
your top priority
MySQL Best Practices for DBAs and Developers - 2010.10
Monitoring
Monitoring
Alerting
Dashboard
Public Status
Successful Scalability
http://ronaldbradford.com/blog/successful-mysql-scalability-presentation-2010-09-17/
MySQL Best Practices for DBAs and Developers - 2010.10
Don't change a setting
without evidence to
prove/disprove the
benefit
Number 1 problem!
MySQL Best Practices for DBAs and Developers - 2010.10
Bad MySQL Configuration
[sort|join|read|read_rnd] _buffer_size
Defaults are 128K - 256K
Settings of 1M, 2M,16M, 128M
Pre allocated per thread buffer
Larger buffer is slower to create > 256K
Wastes valuable process memory
MySQL Best Practices for DBAs and Developers - 2010.10
Where is the bottleneck?
Is the database the problem?
Front End Performance
The website will always be too slow
Identify the true components
End to End time
Database may be only a small
portion
MySQL Best Practices for DBAs and Developers - 2010.10
Conclusion
MySQL Best Practices for DBAs and Developers - 2010.10
Objectives
Identify poor development practices
Recommended best practices
MySQL development tips and tricks
Standard & expected RDBMS practices
MySQL Best Practices for DBAs and Developers - 2010.10
Questions?
MySQL Best Practices for DBAs and Developers - 2010.10
RonaldBradford.com

Más contenido relacionado

La actualidad más candente

What's New MySQL 8.0?
What's New MySQL 8.0?What's New MySQL 8.0?
What's New MySQL 8.0?OracleMySQL
 
MySQL For Oracle DBA's and Developers
MySQL For Oracle DBA's and DevelopersMySQL For Oracle DBA's and Developers
MySQL For Oracle DBA's and DevelopersRonald Bradford
 
Successful Scalability Principles - Part 1
Successful Scalability Principles - Part 1Successful Scalability Principles - Part 1
Successful Scalability Principles - Part 1Ronald Bradford
 
10x Performance Improvements - A Case Study
10x Performance Improvements - A Case Study10x Performance Improvements - A Case Study
10x Performance Improvements - A Case StudyRonald Bradford
 
MySQL Performance Best Practices
MySQL Performance Best PracticesMySQL Performance Best Practices
MySQL Performance Best PracticesOlivier DASINI
 
Lessons Learned Managing Large AWS Environments
Lessons Learned Managing Large AWS EnvironmentsLessons Learned Managing Large AWS Environments
Lessons Learned Managing Large AWS EnvironmentsRonald Bradford
 
MySQL 8.0.21 - New Features Summary
MySQL 8.0.21 - New Features SummaryMySQL 8.0.21 - New Features Summary
MySQL 8.0.21 - New Features SummaryOlivier DASINI
 
My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2Morgan Tocker
 
MySQL's new Secure by Default Install -- All Things Open October 20th 2015
MySQL's new Secure by Default Install -- All Things Open October 20th 2015MySQL's new Secure by Default Install -- All Things Open October 20th 2015
MySQL's new Secure by Default Install -- All Things Open October 20th 2015Dave Stokes
 
MySQL 5.7 in a Nutshell
MySQL 5.7 in a NutshellMySQL 5.7 in a Nutshell
MySQL 5.7 in a NutshellEmily Ikuta
 
MySQL High Availability Solutions - Avoid loss of service by reducing the r...
MySQL High Availability Solutions  -  Avoid loss of service by reducing the r...MySQL High Availability Solutions  -  Avoid loss of service by reducing the r...
MySQL High Availability Solutions - Avoid loss of service by reducing the r...Olivier DASINI
 
MySQL For Oracle Developers
MySQL For Oracle DevelopersMySQL For Oracle Developers
MySQL For Oracle DevelopersRonald Bradford
 
MySQL Document Store for Modern Applications
MySQL Document Store for Modern ApplicationsMySQL Document Store for Modern Applications
MySQL Document Store for Modern ApplicationsOlivier DASINI
 
MySQL 5.7 - What's new and How to upgrade
MySQL 5.7 - What's new and How to upgradeMySQL 5.7 - What's new and How to upgrade
MySQL 5.7 - What's new and How to upgradeAbel Flórez
 
Ohio Linux Fest -- MySQL's NoSQL
Ohio Linux Fest -- MySQL's NoSQLOhio Linux Fest -- MySQL's NoSQL
Ohio Linux Fest -- MySQL's NoSQLDave Stokes
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opcShinya Sugiyama
 

La actualidad más candente (20)

What's New MySQL 8.0?
What's New MySQL 8.0?What's New MySQL 8.0?
What's New MySQL 8.0?
 
MySQL For Oracle DBA's and Developers
MySQL For Oracle DBA's and DevelopersMySQL For Oracle DBA's and Developers
MySQL For Oracle DBA's and Developers
 
Successful Scalability Principles - Part 1
Successful Scalability Principles - Part 1Successful Scalability Principles - Part 1
Successful Scalability Principles - Part 1
 
10x Performance Improvements - A Case Study
10x Performance Improvements - A Case Study10x Performance Improvements - A Case Study
10x Performance Improvements - A Case Study
 
MySQL Performance Best Practices
MySQL Performance Best PracticesMySQL Performance Best Practices
MySQL Performance Best Practices
 
Lessons Learned Managing Large AWS Environments
Lessons Learned Managing Large AWS EnvironmentsLessons Learned Managing Large AWS Environments
Lessons Learned Managing Large AWS Environments
 
MySQL 8.0.21 - New Features Summary
MySQL 8.0.21 - New Features SummaryMySQL 8.0.21 - New Features Summary
MySQL 8.0.21 - New Features Summary
 
My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2My sql 5.7-upcoming-changes-v2
My sql 5.7-upcoming-changes-v2
 
MySQL's new Secure by Default Install -- All Things Open October 20th 2015
MySQL's new Secure by Default Install -- All Things Open October 20th 2015MySQL's new Secure by Default Install -- All Things Open October 20th 2015
MySQL's new Secure by Default Install -- All Things Open October 20th 2015
 
MySQL 5.7 in a Nutshell
MySQL 5.7 in a NutshellMySQL 5.7 in a Nutshell
MySQL 5.7 in a Nutshell
 
MySQL High Availability Solutions - Avoid loss of service by reducing the r...
MySQL High Availability Solutions  -  Avoid loss of service by reducing the r...MySQL High Availability Solutions  -  Avoid loss of service by reducing the r...
MySQL High Availability Solutions - Avoid loss of service by reducing the r...
 
MySQL For Oracle Developers
MySQL For Oracle DevelopersMySQL For Oracle Developers
MySQL For Oracle Developers
 
MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017MySQL8.0 in COSCUP2017
MySQL8.0 in COSCUP2017
 
Mysql all
Mysql allMysql all
Mysql all
 
Introduction Mysql
Introduction Mysql Introduction Mysql
Introduction Mysql
 
MySQL Document Store for Modern Applications
MySQL Document Store for Modern ApplicationsMySQL Document Store for Modern Applications
MySQL Document Store for Modern Applications
 
MySQL 5.7 - What's new and How to upgrade
MySQL 5.7 - What's new and How to upgradeMySQL 5.7 - What's new and How to upgrade
MySQL 5.7 - What's new and How to upgrade
 
Ohio Linux Fest -- MySQL's NoSQL
Ohio Linux Fest -- MySQL's NoSQLOhio Linux Fest -- MySQL's NoSQL
Ohio Linux Fest -- MySQL's NoSQL
 
Multi thread slave_performance_on_opc
Multi thread slave_performance_on_opcMulti thread slave_performance_on_opc
Multi thread slave_performance_on_opc
 
Perf Tuning Short
Perf Tuning ShortPerf Tuning Short
Perf Tuning Short
 

Destacado

Access Ch4 Creating Reports And Forms (Jy)
Access Ch4   Creating Reports And Forms (Jy)Access Ch4   Creating Reports And Forms (Jy)
Access Ch4 Creating Reports And Forms (Jy)Chun Hoi Lam
 
Relational Databases
Relational DatabasesRelational Databases
Relational DatabasesJason Hando
 
Comparing free software for spatial DBMSs
Comparing free software for spatial DBMSsComparing free software for spatial DBMSs
Comparing free software for spatial DBMSsSmirnov Sergey
 
Chapter 7 relation database language
Chapter 7 relation database languageChapter 7 relation database language
Chapter 7 relation database languageJafar Nesargi
 
Relational Database Management System
Relational Database Management SystemRelational Database Management System
Relational Database Management SystemMian Abdul Raheem
 
Mca ii-dbms- u-i-introductory concepts of dbms
Mca ii-dbms- u-i-introductory concepts of dbmsMca ii-dbms- u-i-introductory concepts of dbms
Mca ii-dbms- u-i-introductory concepts of dbmsRai University
 
Database Management System
Database Management SystemDatabase Management System
Database Management SystemVarun Arora
 
Introduction to Database Concepts
Introduction to Database ConceptsIntroduction to Database Concepts
Introduction to Database ConceptsRosalyn Lemieux
 
Open source software vs proprietary software
Open source software vs proprietary softwareOpen source software vs proprietary software
Open source software vs proprietary softwareLavan1997
 
Introduction to RDBMS
Introduction to RDBMSIntroduction to RDBMS
Introduction to RDBMSSarmad Ali
 

Destacado (20)

Bis Chapter3
Bis Chapter3Bis Chapter3
Bis Chapter3
 
Raj mysql
Raj mysqlRaj mysql
Raj mysql
 
Access Ch4 Creating Reports And Forms (Jy)
Access Ch4   Creating Reports And Forms (Jy)Access Ch4   Creating Reports And Forms (Jy)
Access Ch4 Creating Reports And Forms (Jy)
 
Relational databases
Relational databasesRelational databases
Relational databases
 
Relational Databases
Relational DatabasesRelational Databases
Relational Databases
 
Comparing free software for spatial DBMSs
Comparing free software for spatial DBMSsComparing free software for spatial DBMSs
Comparing free software for spatial DBMSs
 
Chapter 7 relation database language
Chapter 7 relation database languageChapter 7 relation database language
Chapter 7 relation database language
 
Ch1
Ch1Ch1
Ch1
 
Relational Database Management System
Relational Database Management SystemRelational Database Management System
Relational Database Management System
 
Chapter2
Chapter2Chapter2
Chapter2
 
Mca ii-dbms- u-i-introductory concepts of dbms
Mca ii-dbms- u-i-introductory concepts of dbmsMca ii-dbms- u-i-introductory concepts of dbms
Mca ii-dbms- u-i-introductory concepts of dbms
 
Database Management System
Database Management SystemDatabase Management System
Database Management System
 
MYSQL
MYSQLMYSQL
MYSQL
 
Introduction to Database Concepts
Introduction to Database ConceptsIntroduction to Database Concepts
Introduction to Database Concepts
 
Chapter25
Chapter25Chapter25
Chapter25
 
Open source software vs proprietary software
Open source software vs proprietary softwareOpen source software vs proprietary software
Open source software vs proprietary software
 
RDBMS
RDBMSRDBMS
RDBMS
 
Rdbms
RdbmsRdbms
Rdbms
 
Introduction to RDBMS
Introduction to RDBMSIntroduction to RDBMS
Introduction to RDBMS
 
DBMS an Example
DBMS an ExampleDBMS an Example
DBMS an Example
 

Similar a MySQL Best Practices - OTN

OSMC 2008 | Monitoring MySQL by Geert Vanderkelen
OSMC 2008 | Monitoring MySQL by Geert VanderkelenOSMC 2008 | Monitoring MySQL by Geert Vanderkelen
OSMC 2008 | Monitoring MySQL by Geert VanderkelenNETWAYS
 
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksQuery Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksJaime Crespo
 
MySQL Idiosyncrasies That Bite
MySQL Idiosyncrasies That BiteMySQL Idiosyncrasies That Bite
MySQL Idiosyncrasies That BiteRonald Bradford
 
Percona Live 2019 - MySQL Security
Percona Live 2019 - MySQL SecurityPercona Live 2019 - MySQL Security
Percona Live 2019 - MySQL SecurityVinicius M Grippa
 
Confoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New FeaturesConfoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New FeaturesDave Stokes
 
My SQL Idiosyncrasies That Bite OTN
My SQL Idiosyncrasies That Bite OTNMy SQL Idiosyncrasies That Bite OTN
My SQL Idiosyncrasies That Bite OTNRonald Bradford
 
MySQL Idiosyncrasies That Bite 2010.07
MySQL Idiosyncrasies That Bite 2010.07MySQL Idiosyncrasies That Bite 2010.07
MySQL Idiosyncrasies That Bite 2010.07Ronald Bradford
 
DB Floripa - ProxySQL para MySQL
DB Floripa - ProxySQL para MySQLDB Floripa - ProxySQL para MySQL
DB Floripa - ProxySQL para MySQLMarcelo Altmann
 
Odv oracle customer_demo
Odv oracle customer_demoOdv oracle customer_demo
Odv oracle customer_demoViaggio Italia
 
Brief introduction into SQL injection attack scenarios
Brief introduction into SQL injection attack scenariosBrief introduction into SQL injection attack scenarios
Brief introduction into SQL injection attack scenariosPayampardaz
 
Fluentd 20150918 no_demo_public
Fluentd 20150918 no_demo_publicFluentd 20150918 no_demo_public
Fluentd 20150918 no_demo_publicSaewoong Lee
 
2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗
2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗
2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗YUCHENG HU
 
MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)
MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)
MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)Valeriy Kravchuk
 
MySQL sys schema deep dive
MySQL sys schema deep diveMySQL sys schema deep dive
MySQL sys schema deep diveMark Leith
 

Similar a MySQL Best Practices - OTN (20)

OSMC 2008 | Monitoring MySQL by Geert Vanderkelen
OSMC 2008 | Monitoring MySQL by Geert VanderkelenOSMC 2008 | Monitoring MySQL by Geert Vanderkelen
OSMC 2008 | Monitoring MySQL by Geert Vanderkelen
 
Curso de MySQL 5.7
Curso de MySQL 5.7Curso de MySQL 5.7
Curso de MySQL 5.7
 
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricksQuery Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
 
MySQL Idiosyncrasies That Bite
MySQL Idiosyncrasies That BiteMySQL Idiosyncrasies That Bite
MySQL Idiosyncrasies That Bite
 
Percona Live 2019 - MySQL Security
Percona Live 2019 - MySQL SecurityPercona Live 2019 - MySQL Security
Percona Live 2019 - MySQL Security
 
Confoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New FeaturesConfoo 2021 -- MySQL New Features
Confoo 2021 -- MySQL New Features
 
My SQL Idiosyncrasies That Bite OTN
My SQL Idiosyncrasies That Bite OTNMy SQL Idiosyncrasies That Bite OTN
My SQL Idiosyncrasies That Bite OTN
 
MySQL Idiosyncrasies That Bite 2010.07
MySQL Idiosyncrasies That Bite 2010.07MySQL Idiosyncrasies That Bite 2010.07
MySQL Idiosyncrasies That Bite 2010.07
 
DB Floripa - ProxySQL para MySQL
DB Floripa - ProxySQL para MySQLDB Floripa - ProxySQL para MySQL
DB Floripa - ProxySQL para MySQL
 
My sql 5.6&MySQL Cluster 7.3
My sql 5.6&MySQL Cluster 7.3My sql 5.6&MySQL Cluster 7.3
My sql 5.6&MySQL Cluster 7.3
 
Instalar MySQL CentOS
Instalar MySQL CentOSInstalar MySQL CentOS
Instalar MySQL CentOS
 
Odv oracle customer_demo
Odv oracle customer_demoOdv oracle customer_demo
Odv oracle customer_demo
 
ProxySQL para mysql
ProxySQL para mysqlProxySQL para mysql
ProxySQL para mysql
 
Guob - MySQL e LGPD
Guob - MySQL e LGPDGuob - MySQL e LGPD
Guob - MySQL e LGPD
 
Brief introduction into SQL injection attack scenarios
Brief introduction into SQL injection attack scenariosBrief introduction into SQL injection attack scenarios
Brief introduction into SQL injection attack scenarios
 
Fluentd 20150918 no_demo_public
Fluentd 20150918 no_demo_publicFluentd 20150918 no_demo_public
Fluentd 20150918 no_demo_public
 
2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗
2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗
2012 09 MariaDB Boston Meetup - MariaDB 是 Mysql 的替代者吗
 
MySQL
MySQLMySQL
MySQL
 
MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)
MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)
MariaDB 10.5 new features for troubleshooting (mariadb server fest 2020)
 
MySQL sys schema deep dive
MySQL sys schema deep diveMySQL sys schema deep dive
MySQL sys schema deep dive
 

Más de Ronald Bradford

MySQL Backup and Recovery Essentials
MySQL Backup and Recovery EssentialsMySQL Backup and Recovery Essentials
MySQL Backup and Recovery EssentialsRonald Bradford
 
Successful MySQL Scalability
Successful MySQL ScalabilitySuccessful MySQL Scalability
Successful MySQL ScalabilityRonald Bradford
 
Capturing, Analyzing and Optimizing MySQL
Capturing, Analyzing and Optimizing MySQLCapturing, Analyzing and Optimizing MySQL
Capturing, Analyzing and Optimizing MySQLRonald Bradford
 
LIFTOFF - MySQLCamp for the Oracle DBA
LIFTOFF - MySQLCamp for the Oracle DBALIFTOFF - MySQLCamp for the Oracle DBA
LIFTOFF - MySQLCamp for the Oracle DBARonald Bradford
 
IGNITION - MySQLCamp for the Oracle DBA
IGNITION - MySQLCamp for the Oracle DBAIGNITION - MySQLCamp for the Oracle DBA
IGNITION - MySQLCamp for the Oracle DBARonald Bradford
 
Dolphins Now And Beyond - FOSDEM 2010
Dolphins Now And Beyond - FOSDEM 2010Dolphins Now And Beyond - FOSDEM 2010
Dolphins Now And Beyond - FOSDEM 2010Ronald Bradford
 
Drizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and EcosystemDrizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and EcosystemRonald Bradford
 
MySQL for the Oracle DBA - Object Management
MySQL for the Oracle DBA - Object ManagementMySQL for the Oracle DBA - Object Management
MySQL for the Oracle DBA - Object ManagementRonald Bradford
 
Know Your Competitor - Oracle 10g Express Edition
Know Your Competitor - Oracle 10g Express EditionKnow Your Competitor - Oracle 10g Express Edition
Know Your Competitor - Oracle 10g Express EditionRonald Bradford
 
The Ideal Performance Architecture
The Ideal Performance ArchitectureThe Ideal Performance Architecture
The Ideal Performance ArchitectureRonald Bradford
 
Getting started with MySQL on Amazon Web Services
Getting started with MySQL on Amazon Web ServicesGetting started with MySQL on Amazon Web Services
Getting started with MySQL on Amazon Web ServicesRonald Bradford
 
Best Practices in Migrating to MySQL - Part 1
Best Practices in Migrating to MySQL - Part 1Best Practices in Migrating to MySQL - Part 1
Best Practices in Migrating to MySQL - Part 1Ronald Bradford
 
Extending The My Sql Data Landscape
Extending The My Sql Data LandscapeExtending The My Sql Data Landscape
Extending The My Sql Data LandscapeRonald Bradford
 

Más de Ronald Bradford (15)

MySQL Backup and Recovery Essentials
MySQL Backup and Recovery EssentialsMySQL Backup and Recovery Essentials
MySQL Backup and Recovery Essentials
 
Successful MySQL Scalability
Successful MySQL ScalabilitySuccessful MySQL Scalability
Successful MySQL Scalability
 
Capturing, Analyzing and Optimizing MySQL
Capturing, Analyzing and Optimizing MySQLCapturing, Analyzing and Optimizing MySQL
Capturing, Analyzing and Optimizing MySQL
 
LIFTOFF - MySQLCamp for the Oracle DBA
LIFTOFF - MySQLCamp for the Oracle DBALIFTOFF - MySQLCamp for the Oracle DBA
LIFTOFF - MySQLCamp for the Oracle DBA
 
IGNITION - MySQLCamp for the Oracle DBA
IGNITION - MySQLCamp for the Oracle DBAIGNITION - MySQLCamp for the Oracle DBA
IGNITION - MySQLCamp for the Oracle DBA
 
Dolphins Now And Beyond - FOSDEM 2010
Dolphins Now And Beyond - FOSDEM 2010Dolphins Now And Beyond - FOSDEM 2010
Dolphins Now And Beyond - FOSDEM 2010
 
Drizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and EcosystemDrizzle - Status, Principles and Ecosystem
Drizzle - Status, Principles and Ecosystem
 
SQL v No SQL
SQL v No SQLSQL v No SQL
SQL v No SQL
 
MySQL for the Oracle DBA - Object Management
MySQL for the Oracle DBA - Object ManagementMySQL for the Oracle DBA - Object Management
MySQL for the Oracle DBA - Object Management
 
Know Your Competitor - Oracle 10g Express Edition
Know Your Competitor - Oracle 10g Express EditionKnow Your Competitor - Oracle 10g Express Edition
Know Your Competitor - Oracle 10g Express Edition
 
The Ideal Performance Architecture
The Ideal Performance ArchitectureThe Ideal Performance Architecture
The Ideal Performance Architecture
 
Getting started with MySQL on Amazon Web Services
Getting started with MySQL on Amazon Web ServicesGetting started with MySQL on Amazon Web Services
Getting started with MySQL on Amazon Web Services
 
Best Practices in Migrating to MySQL - Part 1
Best Practices in Migrating to MySQL - Part 1Best Practices in Migrating to MySQL - Part 1
Best Practices in Migrating to MySQL - Part 1
 
Extending The My Sql Data Landscape
Extending The My Sql Data LandscapeExtending The My Sql Data Landscape
Extending The My Sql Data Landscape
 
Best Design Practices A
Best Design Practices ABest Design Practices A
Best Design Practices A
 

MySQL Best Practices - OTN

  • 1. MySQL Best Practices for DBAs and Developers Volume 1 MySQL Best Practices for DBAs and Developers - 2010.10 Title OTN LAD Tour South America 2010.10 Ronald Bradford http://ronaldbradford.com
  • 2. MySQL Best Practices for DBAs and Developers - 2010.10 Agenda Essential MySQL configuration Improving your SQL MySQL user security Schema optimizations Instrumentation Monitoring
  • 3. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Configuration
  • 4. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices Server SQL Mode "Modes define what SQL syntax MySQL should support and what kind of data validation checks it should perform." http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
  • 5. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices Minimum Recommended Configuration
  • 6. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices sql_mode = "STRICT_ALL_TABLES, NO_ZERO_DATE, NO_ZERO_IN_DATE, NO_ENGINE_SUBSTITUTION"; Minimum Recommended Configuration
  • 7. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices sql_mode = "STRICT_ALL_TABLES, NO_ZERO_DATE, NO_ZERO_IN_DATE, NO_ENGINE_SUBSTITUTION"; mysql> SET GLOBAL sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION"; # my.cnf sql_mode="STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION" Minimum Recommended Configuration
  • 8. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Mode Examples
  • 9. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Mode Examples mysql> INSERT INTO orders (qty) VALUES (-1); ERROR 1264 (22003): Out of range value for column 'i' at row 1 mysql> INSERT INTO orders (qty) VALUES (9000); ERROR 1264 (22003): Out of range value for column 'i' at row 1 ✔
  • 10. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Mode Examples mysql> INSERT INTO orders (qty) VALUES (-1); ERROR 1264 (22003): Out of range value for column 'i' at row 1 mysql> INSERT INTO orders (qty) VALUES (9000); ERROR 1264 (22003): Out of range value for column 'i' at row 1 ✔ mysql> INSERT INTO orders (qty) VALUES (-1); mysql> INSERT INTO orders (qty) VALUES (9000); mysql> SELECT * FROM orders; +-----+ | qty | +-----+ | 0 | | 255 | +-----+ ✘ column is a 1 byte unsigned integer data type - TINYINT
  • 11. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Mode Examples
  • 12. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Mode Examples mysql> INSERT INTO orders (d) VALUES ('2010-02-31'); ERROR 1292 (22007): Incorrect date value: '2010-02-31' for column 'd' at row 1 ✔
  • 13. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Mode Examples mysql> INSERT INTO orders (d) VALUES ('2010-02-31'); ERROR 1292 (22007): Incorrect date value: '2010-02-31' for column 'd' at row 1 ✔ mysql> INSERT INTO orders (d) VALUES ('2010-02-31'); mysql> SELECT * FROM orders; +------------+ | d | +------------+ | 0000-00-00 | +------------+ ✘
  • 14. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices Recommended Configuration
  • 15. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices storage_engine="InnoDB" Recommended Configuration
  • 16. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices storage_engine="InnoDB" mysql> SET GLOBAL storage_engine="innodb"; # my.cnf default-storage-engine=innodb Recommended Configuration
  • 17. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices
  • 18. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices mysql> INSERT INTO orders (order_id) VALUES (1),(2); mysql> INSERT INTO orders (order_id) VALUES (3),(2); ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY' mysql> SELECT * FROM orders; +---+ | i | +---+ | 1 | | 2 | +---+ ✔
  • 19. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices mysql> INSERT INTO orders (order_id) VALUES (1),(2); mysql> INSERT INTO orders (order_id) VALUES (3),(2); ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY' mysql> SELECT * FROM orders; +---+ | i | +---+ | 1 | | 2 | +---+ mysql> INSERT INTO orders (order_id) VALUES (1),(2); mysql> INSERT INTO orders (order_id) VALUES (3),(2); ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY' mysql> SELECT * FROM orders; +---+ | i | +---+ | 1 | | 2 | | 3 | +---+ ✔ ✘ Default MyISAM storage engine is non-transactional
  • 20. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices Use a transactional storage engine e.g. InnoDB Other options exist MySQL default is MyISAM (*) non-transactional table level locking No auto recovery Changing to InnoDB in MySQL 5.5
  • 21. MySQL Best Practices for DBAs and Developers - 2010.10 Configuration Best Practices MySQL Idiosyncrasies that BITE Data Integrity Storage Engine defaults Referential Integrity Much more ... http://rb42.com/idiosyncrasies
  • 22. MySQL Best Practices for DBAs and Developers - 2010.10 Security
  • 23. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security
  • 24. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security Default is woeful
  • 25. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security Default is woeful Minimum
  • 26. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security Default is woeful Minimum $ mysql_secure_installation
  • 27. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security Default is woeful Minimum $ mysql_secure_installation Recommended
  • 28. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security Default is woeful Minimum $ mysql_secure_installation Recommended Operating System
  • 29. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Physical Security Default is woeful Minimum $ mysql_secure_installation Recommended Operating System Permissions & Privileges
  • 30. MySQL Best Practices for DBAs and Developers - 2010.10 Operating System Security Defaults are not secure Never run as 'root' user Separate Data/Binary Logs/Logs/ Configuration/Backups Individual directory permissions • Minimize security risk • Better auditability
  • 31. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Installation Best Practice Best Practice /mysql /etc /data /binlog /log /mysql-version /etc/my.cnf /etc/profile.d/mysql.sh /etc/init.d/mysqld Single partition per MySQL Instance Global files as symlinks from partition
  • 32. MySQL Best Practices for DBAs and Developers - 2010.10 MySQL Installation Security Software installed by root Separate MySQL permissions for directories $ chown -R root:root /mysql $ chown -R mysql:mysql /mysql/{data,log,binlog,etc} $ chmod 700 /mysql/{data,binlog} $ chmod 750 /mysql/{etc,log}
  • 33. MySQL Best Practices for DBAs and Developers - 2010.10 Application User Security •Username •Password •Host (location of username)
  • 34. MySQL Best Practices for DBAs and Developers - 2010.10 Application User Security CREATE USER appuser@localhost IDENTIFIED BY 'sakila'; GRANT SELECT,INSERT,UPDATE,DELETE ON schema.* TO appuser@localhost; Best Practice ✔ •Username •Password •Host (location of username)
  • 35. MySQL Best Practices for DBAs and Developers - 2010.10 Application User Security CREATE USER appuser@localhost IDENTIFIED BY 'sakila'; GRANT SELECT,INSERT,UPDATE,DELETE ON schema.* TO appuser@localhost; CREATE USER superman@'%'; GRANT ALL ON *.* TO superman@'%'; Best Practice Normal Practice ✔ ✘ •Username •Password •Host (location of username)
  • 36. MySQL Best Practices for DBAs and Developers - 2010.10 Why not use GRANT ALL
  • 37. MySQL Best Practices for DBAs and Developers - 2010.10 Why not use GRANT ALL GRANT ALL ON *.* TO user@’%’
  • 38. MySQL Best Practices for DBAs and Developers - 2010.10 Why not use GRANT ALL GRANT ALL ON *.* TO user@’%’ *.* gives you access to all tables in all schemas
  • 39. MySQL Best Practices for DBAs and Developers - 2010.10 Why not use GRANT ALL GRANT ALL ON *.* TO user@’%’ *.* gives you access to all tables in all schemas @’%’ give you access from any external location
  • 40. MySQL Best Practices for DBAs and Developers - 2010.10 Why not use GRANT ALL GRANT ALL ON *.* TO user@’%’ *.* gives you access to all tables in all schemas @’%’ give you access from any external location ALL gives you
  • 41. MySQL Best Practices for DBAs and Developers - 2010.10 Why not use GRANT ALL GRANT ALL ON *.* TO user@’%’ *.* gives you access to all tables in all schemas @’%’ give you access from any external location ALL gives you ALTER,ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE USER, CREATEVIEW, DELETE, DROP, EVENT, EXECUTE, FILE, INDEX, INSERT, LOCK TABLES, PROCESS, REFERENCES, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SELECT, SHOW DATABASES, SHOWVIEW, SHUTDOWN, SUPER,TRIGGER, UPDATE, USAGE See MySQL Idiosyncrasies that BITE presentation -- http://rb42.com/idiosyncrasies
  • 42. MySQL Best Practices for DBAs and Developers - 2010.10 Application User Security Best Practices ApplicationViewer (Read Only Access) SELECT Application User (Read/Write Access) INSERT, UPDATE, DELETE, SELECT Application DBA (Schema Access Only) CREATE, DROP, CREATE ROUTINE, SELECT, INSERT, UPDATE, DELETE • Track Data Security • Separation of responsibilities
  • 43. MySQL Best Practices for DBAs and Developers - 2010.10 SQL
  • 44. MySQL Best Practices for DBAs and Developers - 2010.10 Development Best Practices Comment your SQL Format your SQL Future proof your SQL Log your SQL Analyze your SQL Always use transactions
  • 45. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Commenting Identify queries by code function Identify OLTP / Batch / Cache queries SELECT /* XXX123 */ ... UPDATE /* YYY999 */ ... SELECT /* Batch */... • DBA/SA can identify code function and purpose quickly
  • 46. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Commenting (2) 26 Query SELECT /* 5m cache */ ..... 26 Query SELECT /* ViewPost */ t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag') AND tr.object_id IN (2849, 2842, 2836, 2824, 2812, 2680, 2813, 2800, 2770, 2784) ORDER BY t.name ASC 26 Query SELECT /* batch */ key, value FROM usermeta WHERE user_id = 2
  • 47. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Formatting Create single line queries Don't embed newlines Enables per line analysis by CLI tools • DBA/SA can use simple CLI tools including grep,awk,cut etc for SQL analysis
  • 48. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Formatting (2) 26 Query SELECT FOUND_ROWS() 26 Query SELECT post_id,start,end,allday,rpt,IF(end>='2010-06-04 00:00:00',1,0) AS active FROM wp_ec3_schedule WHERE post_id IN (2849,2842,2836,2824,2812,2680,2770,2784) ORDER BY start 26 Query SELECT * FROM wp_users WHERE user_login = 'ronald' 26 Query SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN wp_term_taxonomy AS tt ON tt.term_id = t.term_id INNER JOIN wp_term_relationships AS tr ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy IN ('category', 'post_tag') AND tr.object_id IN (2849, 2842, 2836, 2824, 2812, 2680, 2813, 2800, 2770, 2784) ORDER BY t.name ASC 26 Query SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 2
  • 49. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Formatting (2) $ cut -c12-80 general.log SELECT FOUND_ROWS() SELECT post_id,start,end,allday,rpt,IF(end>='2010-06-04',1,0 p_ec3_schedule post_id IN (2849,2842,2836,2824,2812,2680,2770,2784) BY start SELECT * FROM wp_users WHERE user_login = 'ronald' SELECT t.*, tt.*, tr.object_id FROM wp_terms AS t INNER JOIN ... SELECT meta_key, meta_value FROM wp_usermeta WHERE user_id = 2
  • 50. MySQL Best Practices for DBAs and Developers - 2010.10 Future proofing your SQL Specify INSERT column names INSERT INTO table(a,b,c) VALUES(...) mysql> INSERT INTO example VALUES (10,10,'A'); mysql> ALTER TABLE example ADD d DATE; mysql> INSERT INTO example VALUES (10,10,'A'); ERROR 1136 (21S01): Column count doesn't match value count at row 1 • Reduce likelihood of runtime errors when structural changes to objects
  • 51. MySQL Best Practices for DBAs and Developers - 2010.10 Future proofing your SQL Always use column aliases in joins SELECT a.col1, b.col2 ... mysql> SELECT id, name, val > FROM parent p, child c > WHERE p.id = c.parent_id; mysql> alter table child add name varchar(10); mysql> SELECT id, name, val FROM parent p, child c WHERE p.id = c.parent_id; ERROR 1052 (23000): Column 'name' in field list is ambiguous
  • 52. MySQL Best Practices for DBAs and Developers - 2010.10 Future proofing your SQL SELECT * is generally bad What columns are actually used in code TEXT/BLOB can cause extra disk I/O New columns can change performance
  • 53. MySQL Best Practices for DBAs and Developers - 2010.10 Avoid Fancy Constructs DELAYED IGNORE LOW PRIORITY REPLACE • Changes ACID and statement precedence • May have additional performance overhead
  • 54. MySQL Best Practices for DBAs and Developers - 2010.10 Use Deterministic Functions Use '2010-06-21' instead of CURDATE() Same for NOW() Don't Use ORDER BY RAND() Leverage Query Cache (if enabled)
  • 55. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Analysis
  • 56. MySQL Best Practices for DBAs and Developers - 2010.10 General Query Log Logs all SQL Statements Turn on for all development environments Aggregate and email results to developer Works best in single user environment • Developers are seeing SQL in operation • Enables access to SQL to analyze
  • 57. MySQL Best Practices for DBAs and Developers - 2010.10 General Query Log mysql> SET GLOBAL general_log=OFF; mysql> SET GLOBAL general_log=ON; mysql> SELECT event_time,argument FROM mysql.general_log; +---------------------+---------------------------------------------------+ | event_time | argument | +---------------------+---------------------------------------------------+ | 2010-10-11 21:48:05 | select * from test1 | | 2010-10-11 21:48:30 | SELECT event_time,argument FROM mysql.general_log | +---------------------+---------------------------------------------------+ # my.cnf general_log = ON general_log_file = /mysql/log/general.log log_output = FILE,TABLE WARNING Never enable in production http://dev.mysql.com/doc/refman/5.1/en/query_log.html
  • 58. MySQL Best Practices for DBAs and Developers - 2010.10 Leveraging General Query Log For single user development environment In SQL Session In Application Run Function/Process In SQL Session mysql> SELECT 'Function X Start'; mysql> SELECT 'Function X End';
  • 59. MySQL Best Practices for DBAs and Developers - 2010.10 General Query Log Output $ tail /mysql/log/general.log 101011 21:58:00 3 Query SELECT 'Function X Start' 101011 21:58:09 2 Query SELECT * from sample_int 101011 21:58:41 2 Query SELECT * from example 101011 21:58:47 3 Query SELECT 'Function X End' http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
  • 60. MySQL Best Practices for DBAs and Developers - 2010.10 SQL Analysis Bulk trending analysis Volume of SQL statements Query Execution Plan (QEP) Online v Batch/Cache SQL via commenting • Identify bottlenecks ASAP without load • Iterative Design feedback
  • 61. MySQL Best Practices for DBAs and Developers - 2010.10 Know your SQL
  • 62. MySQL Best Practices for DBAs and Developers - 2010.10 Common SQL Errors Remove redundant SQL Use general query log You may be surprised!
  • 63. MySQL Best Practices for DBAs and Developers - 2010.10 Common Coding Errors - Repeating Queries 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` WHERE (ArtistID = 196 ) 5 Query SELECT * FROM `artist` WHERE (ArtistID = 2188 ) 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` The WRONG way SQL for one page load 8 unwanted full table scans *BUG* Removed gave 20x faster page load
  • 64. MySQL Best Practices for DBAs and Developers - 2010.10 Common Coding Errors - Repeating Queries 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` WHERE (ArtistID = 196 ) 5 Query SELECT * FROM `artist` WHERE (ArtistID = 2188 ) 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` 5 Query SELECT * FROM `artist` The WRONG way SQL for one page load 8 unwanted full table scans *BUG* Removed gave 20x faster page load Not cached (too big) If cached, two queries
  • 65. MySQL Best Practices for DBAs and Developers - 2010.10 RAT v CAT Processing SELECT * FROM activities_theme WHERE theme_parent_id=0 SELECT * FROM activities_theme WHERE theme_parent_id=1 SELECT * FROM activities_theme WHERE theme_parent_id=2 SELECT * FROM activities_theme WHERE theme_parent_id=11 SELECT * FROM activities_theme WHERE theme_parent_id=16 SELECT * FROM activities_theme WHERE theme_parent_id in (0,1,2,11,16) Row (RAT) Processing Chunk (CAT) Processing
  • 66. MySQL Best Practices for DBAs and Developers - 2010.10 RAT v CAT Processing SELECT * FROM activities_theme WHERE theme_parent_id=0 SELECT * FROM activities_theme WHERE theme_parent_id=1 SELECT * FROM activities_theme WHERE theme_parent_id=2 SELECT * FROM activities_theme WHERE theme_parent_id=11 SELECT * FROM activities_theme WHERE theme_parent_id=16 SELECT * FROM activities_theme WHERE theme_parent_id in (0,1,2,11,16) Row (RAT) Processing Chunk (CAT) Processing ✔ ✘
  • 67. MySQL Best Practices for DBAs and Developers - 2010.10 Common Coding Errors - Boundary Conditions The following SQL executed 6,000 times in 5 minute analysis period 0 is an invalid pages_id SELECT pages_id, pages_livestats_code, pages_title, pages_parent, pages_exhibid, pages_theme, pages_accession_num FROM pages WHERE pages_id = 0 The WRONG way
  • 68. MySQL Best Practices for DBAs and Developers - 2010.10 In a highly tuned system the greatest time in a query is network overhead
  • 69. MySQL Best Practices for DBAs and Developers - 2010.10 Common Coding Errors Remove duplicate code • Less code to maintain • Remove chance of human errors
  • 70. MySQL Best Practices for DBAs and Developers - 2010.10 Defining your database connection $ cd public_html $ grep "mysql*_connect" * */* */*/* db-disp.php:$cid = mysql_connect("localhost", "museum", "******") or die ('I cannot connect to the database because: ' . mysql_error()); test.php:$cid = mysql_connect("localhost", "museum", "******"); PMCollection/connection.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser", "$sqlpass"); PMCollection/connection_live.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser", "$sqlpass"); PMCollection/connection_local.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser", "$sqlpass"); PMEcards/connection.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser", "$sqlpass"); core/connection.php: $dbcnx = mysql_connect("$sqlhost", "$sqluser", "$sqlpass"); discussion_admin/db_fns.php: $cid = mysql_connect("localhost", "museum", "******"); discussion_admin/header.php:// $cid = mysql_connect("localhost", "museum", "******"); discussion_admin/inc_title.php: //$cid = mysql_connect("localhost", "museum", "******"); discussion_admin/stats.php: //$cid = mysql_connect("localhost", "museum", The WRONG way
  • 71. MySQL Best Practices for DBAs and Developers - 2010.10 Database connection example class database { function getConnection($type, $message) { try { $con = mysqli_connect($cp->host,$cp->user,$cp->passwd,$cp->database); if (!$con) { $message = new message ("fatal", "Unable to obtain a '$type' ... return; } mysqli_query($con, "SET NAMES 'utf8'"); } catch (Exception $e) { $message = new message ("fatal", "Unable to obtain a '$type' ... debug($e->getMessage()); } return $con; } The RIGHT way
  • 72. MySQL Best Practices for DBAs and Developers - 2010.10 Database Connections Open and close database connections only when necessary • Reduce unnecessary database load • Increases page serve volume • Increases true DB throughput
  • 73. MySQL Best Practices for DBAs and Developers - 2010.10 Database Connections Initialization $ cat header.php ... $con = getConnection(); ... if($this_user->user_row["status"]!='ws' && in_array($this_page->getValue(),$page)){ header("Location: /permission.php"); exit(); } ... if () { header("Location: abc.php"); exit(); } ... if () { header("Location: xyz.php"); exit(); } ... The WRONG way
  • 74. MySQL Best Practices for DBAs and Developers - 2010.10 Schema Design
  • 75. MySQL Best Practices for DBAs and Developers - 2010.10 Design Best Practices Optimal Data Types Saving Disk Space Naming Standards
  • 76. MySQL Best Practices for DBAs and Developers - 2010.10 About MySQL Data Types Numeric Data Types Oracle has 1 MySQL has 9 TINYINT,SMALLINT,MEDIUMINT,INT, BIGINT,FLOAT,DOUBLE,DECIMAL,BIT
  • 77. MySQL Best Practices for DBAs and Developers - 2010.10 Optimal Auto Increment Primary Key Don't use BIGINT AUTO_INCREMENT Use INT UNSIGNED AUTO_INCREMENT BIGINT is 8 bytes INT is 4 Bytes INT UNSIGNED stores 4.3 billion values • Can reduce index space by 50+% • Better memory usage, less I/O http://ronaldbradford.com//blog/bigint-v-int-is-there-a-big-deal-2008-07-18/
  • 78. MySQL Best Practices for DBAs and Developers - 2010.10 INT(1) This is not 1 byte, it's 4 bytes (1) is only for client display only Client with 10+ flags using INT(1) 40 bytes reduced to 10 bytes or 2 bytes using bit operators INT(1) is not what it looks like Horror Stories
  • 79. MySQL Best Practices for DBAs and Developers - 2010.10 Dates MySQL supports DATE, DATETIME, TIMESTAMP, YEAR TIMESTAMP for Epoch values TIMESTAMP is 4 bytes DATETIME is 8 bytes Supports DEFAULT CURRENT_TIMESTAMP Neither store milliseconds
  • 80. MySQL Best Practices for DBAs and Developers - 2010.10 The beauty of ENUM Values Check Constraint Ideal for static codes Compact - i.e. 1 byte for 'True', 'False' Human readable values 5.1 Non blocking ALTER
  • 81. MySQL Best Practices for DBAs and Developers - 2010.10 TRUE/FALSE Datatype Examples CREATE TABLE enums ( flag1 CHAR(1) NULL COMMENT 'T or F, Y or N', flag2 TINYINT NULL COMMENT '0 or 1', flag3 BIT NULL COMMENT 'True or False', flag4 ENUM ('True','False') NULL, flag5 VARCHAR(5) NULL ); INSERT INTO enums(flag4, flag1, flag2) VALUES ('True', 'T', 1), ('False', 'F', 0); SELECT flag1, flag2, flag4 FROM enums; +-------+-------+-------+ | flag1 | flag2 | flag4 | +-------+-------+-------+ | T | 1 | True | | F | 0 | False | +-------+-------+-------+ •All are 1 Byte, which is more readable?
  • 82. MySQL Best Practices for DBAs and Developers - 2010.10 Schema Management Always have current schema.sql Use Patch/Revert SQL for upgrades See http://schemasync.org • Reproducibility • Upgrade/Downgrade path
  • 83. MySQL Best Practices for DBAs and Developers - 2010.10 Testing
  • 84. MySQL Best Practices for DBAs and Developers - 2010.10 Testing is not about what works; testing is about breaking your software
  • 85. MySQL Best Practices for DBAs and Developers - 2010.10 Resilience What is your backup strategy? What is your recovery strategy? How long does it take? Have you actually tested it end to end? Take the survey http://rb42.com/mysql-backup-quiz
  • 86. MySQL Best Practices for DBAs and Developers - 2010.10 Instrumentation
  • 87. MySQL Best Practices for DBAs and Developers - 2010.10 Application Instrumentation Creating one primary abstract DB call Enable logging of ALL SQL statements Enable embedded HTML output Total Execution Time/Count Individual SQL Execution Time/SQL • Enable runtime analysis via browser • No additional tools needed to gather
  • 88. MySQL Best Practices for DBAs and Developers - 2010.10 Sharding 101 63 Joomla •SQL Statements Example
  • 89. MySQL Best Practices for DBAs and Developers - 2010.10 Sharding 101 64 Cold Fusion •SQL Statements Example
  • 90. MySQL Best Practices for DBAs and Developers - 2010.10 Application Instrumentation Benefits End to End Timing Component Timing (i.e. a series of SQL) Observe as desired Intelligent Activation e.g. Page Load exceeds x ms
  • 91. MySQL Best Practices for DBAs and Developers - 2010.10 Monitoring
  • 92. MySQL Best Practices for DBAs and Developers - 2010.10 If you don't have monitoring in place, make it your top priority
  • 93. MySQL Best Practices for DBAs and Developers - 2010.10 Monitoring Monitoring Alerting Dashboard Public Status Successful Scalability http://ronaldbradford.com/blog/successful-mysql-scalability-presentation-2010-09-17/
  • 94. MySQL Best Practices for DBAs and Developers - 2010.10 Don't change a setting without evidence to prove/disprove the benefit Number 1 problem!
  • 95. MySQL Best Practices for DBAs and Developers - 2010.10 Bad MySQL Configuration [sort|join|read|read_rnd] _buffer_size Defaults are 128K - 256K Settings of 1M, 2M,16M, 128M Pre allocated per thread buffer Larger buffer is slower to create > 256K Wastes valuable process memory
  • 96. MySQL Best Practices for DBAs and Developers - 2010.10 Where is the bottleneck? Is the database the problem? Front End Performance The website will always be too slow Identify the true components End to End time Database may be only a small portion
  • 97. MySQL Best Practices for DBAs and Developers - 2010.10 Conclusion
  • 98. MySQL Best Practices for DBAs and Developers - 2010.10 Objectives Identify poor development practices Recommended best practices MySQL development tips and tricks Standard & expected RDBMS practices
  • 99. MySQL Best Practices for DBAs and Developers - 2010.10 Questions?
  • 100. MySQL Best Practices for DBAs and Developers - 2010.10 RonaldBradford.com