Unless you are a MySQL performance tuning expert, or a total linux-freak-guru like myself, and even if you are, it can be enormously challenging and somewhat overwhelming to locate and eliminate MySQL bottlenecks. While many DBAs focus on improving the performance of the queries themselves, this post will focus on the highest-impact items: MySQL Server Performance and OS Performance for MySQL.
This post is a "best-of" compilation of the tricks and scripts I have found to be the most effective over the past decade. I'd like to write a 50 page article but am limiting this to 1 page.
For anyone serious about High Performance MySQL, I would highly highly recommend the fantastic book: "High Performance MySQL: Optimization, Backups, Replication, and more" - O'Reilly. I have spent many hours poring over it's wisdom-filled pages and gaining much practical know-how.
Each new MySQL server release contains ENORMOUS performance enhancements over previous versions. That is the absolute very first thing you should do: Upgrade your MySQL Server and Client libraries and keep them updated.
There are several "flavors" of MySQL believe it or not.. Most people use the stock MySQL Server. I, along with WikiPedia, Arch-Linux, and others, use MariaDB. MariaDB is a greatly enhanced 100% compatible replacement for the stock MySQL Server. It is based on the excellent work by the Percona project. The percona flavor of MySQL is the other truly improved version of MySQL to consider. I personally have spent a couple years using Percona, then I upgraded from Percona to MariaDB (which has a lot of Percona juju built in) and am no longer thinking about which version to go with. MariaDB is the bomb-diggity.
InnoDB not MyISAM. InnoDB may be surpassed by in-development engines like TokuDB. I ONLY use InnoDB, for everything.
Seriously? Optimize EVERYTHING! The screenshots below are actual from one of my live servers. That server used to be 8GB RAM, but now as you may see in the screenshots, it is now only 2GB of RAM. I was able to save some serious $$$ by optimizing my server, without sacrificing speed... In fact I gained some speed in many instances.
I've used these optimization techniques on monster servers with 32GB of ram and many slaves, and also on a machine with 1GB of ram (running arch-linux).
The first thing to understand and believe is that there is absolutely no substitute for having a professional tune your DB. I personally use 2 professionals to tune clients DBs... I optimize it first, then I optimize it again after both pros are finished.
- A DBA who knows MySQL optimization inside and out, percona/mariadb experience = "the best".
- A Linux system admin GURU who can make sure the subtle and not-so-subtle settings and tweaks to the OS is geared for max performance.
If you are just learning or doing it yourself, props to you! In that case, you should utilize ALL 4 of these tools. The one thing you need to do before running any of them is make sure your MySQL server has been online for at least a week without restarting, otherwise the results will mostly all be questionable. I especially like the Tuning-Primer shell script, and the phpMyAdmin Advisor (which is fairly new to phpMyAdmin - using 4.1-DEV-BETA).
The biggest areas to focus in on (IMHO) are:
- MEMORY/RAM, specifically the buffers
- ACID - Do you need full ACID, or can you (likely) make some sacrifices there for speed
- tmp tables, tmpdir (use a tmpfs mounted dir)
- Thread/Connections - How many processes and threads should be running
- open_files / table_cache - May need to boost your
MySQL Tuning Primer Script - tuning-primer.sh - This script takes information from "
SHOW STATUS LIKE..." and "
SHOW VARIABLES LIKE..." then attempts to produce sane recommendations for tuning server variables. It is compatible with all versions of MySQL 3.23 and above.
This tool is very similar to the tuning-primer tool. Nice and fast, and likely the most up-to-date tool.
MySQLTuner: a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability.
mysqlreport: makes a friendly report of important MySQL status values. mysqlreport transforms the values from SHOW STATUS into an easy-to-read report that provides an in-depth understanding of how well MySQL is running. mysqlreport is a better alternative (and practically the only alternative) to manually interpreting SHOW STATUS.
The mysqladmin command is great and all, but these 3 tools are much more useful for the specialized task of monitoring MySQL. The most powerful is innotop, then mytop, and finally the phpMyAdmin Monitor is great for general big-picture monitoring. Also, make sure you understand and use slow query logging and
mysqldumpslow as well.
mytop - a top clone for MySQL.
- Optimization and Tuning Articles on how to get the most out of MariaDB, including new features.
- Slow Query Log Overview
- MySQL Performance – Howto – part 1 (high performance tuning scripts), SysBench on CentOS – HowTo - Part 2
- pt-query-digest - Analyze MySQL queries from logs, processlist, and tcpdump.
July 11th, 2013