2013-07-11

AskApache.com

Unless you are 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.

MySQL Server Software

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.

MySQL Engine

InnoDB not MyISAM. InnoDB may be surpassed by in-development engines like TokuDB. I ONLY use InnoDB, for everything.

Types of MySQL Servers to optimize

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).

Tuning Scripts for MySQL

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

SWAP

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 /etc/security/limits.conf and your /etc/sysctl.conf

Tuning-Primer

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.



Sundry MySQL Scripts and Docs

MySQL Performance Tuning Primer Script

phpMyAdmin Advisor

This tool is very similar to the tuning-primer tool. Nice and fast, and likely the most up-to-date tool.



MySQLTuner

MySQLTuner: a script written in Perl that will assist you with your MySQL configuration and make recommendations for increased performance and stability.



mysqlreport

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 Guide To Understanding mysqlreport

mysqlreport Documentation

Monitoring MySQL

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

mytop - a top clone for MySQL.

innotop

innotop

InnoDB Performance Monitoring with innotop

Get me some Query Logs

phpMyAdmin Monitor

More Resources

https://www.kernel.org/doc/Documentation/sysctl/fs.txt

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.

…MySQL Performance Tuning Scripts and Know-How… originally appeared on AskApache.com

The post MySQL Performance Tuning Scripts and Know-How appeared first on AskApache.

Show more