MySQL 是一个强大的开源关系数据库管理系统(简称 RDBMS)。它发布于 1995 年(20年前)。它采用结构化查询语言(SQL),这可能是数据库内容管理中最流行的选择。最新的 MySQL 版本是 5.6.25,于 2015 年 5 月 29 日发布。
关于 MySQL 一个有趣的事实是它的名字来自于 Michael Widenius(MySQL 的创始人)的女儿“ My”。尽管有许多关于 MySQL 有趣的传闻,不过本文主要是向你展示一些有用的实践,以帮助你管理你的 MySQL 服务器。
MySQL 性能优化
2009 年 4 月,MySQL 被 Oracle 收购。其结果是MySQL 社区分裂,创建了一个叫 MariaDB 的分支 。创建该分支的主要原因是为了保持这个项目可以在 GPL 下的自由。
今天,MySQL 和 MariaDB 是用于类似 WordPress、Joomla、Magento 和其他 web 应用程序的最流行的 RDMS 之一(如果不是最多的)。
这篇文章将告诉你一些基本的,但非常有用的关于如何优化 MySQL/MariaDB 性能的技巧。注意,本文假定您已经安装了 MySQL 或 MariaDB。如果你仍然不知道如何在系统上安装它们,你可以按照以下说明去安装:
重要提示: 在开始之前,不要盲目的接受这些建议。每个 MySQL 设置都是不同的,在进行任何更改之前需要慎重考虑。
你需要明白这些:
MySQL/MariaDB 配置文件位于 /etc/my.cnf。 每次更改此文件后你需要重启 MySQL 服务,以使更改生效。
这篇文章使用 MySQL 5.6 版本。
1. 启用 InnoDB 的每张表一个数据文件设置首先,有一个重要的解释, InnoDB 是一个存储引擎。MySQL 和 MariaDB 使用 InnoDB 作为默认存储引擎。以前,MySQL 使用系统表空间来保存数据库中的表和索引。这意味着服务器唯一的目的就是数据库处理,它们的存储盘不用于其它目的。
InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。
这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。
MySQL 5.6及以上的版本默认启用 innodb_file_per_table。你可以在 /etc/my.cnf 文件中看到。该指令看起来是这样的:
innodb_file_per_table=1
2. 将 MySQL 数据库数据存储到独立分区上注意:此设置只在 MySQL 上有效, 在 MariaDB 上无效。
有时候操作系统的读/写会降低你 MySQL 服务器的性能,尤其是如果操作系统和数据库的数据位于同一块磁盘上。因此,我建议你使用单独的磁盘(最好是 SSD)用于 MySQL 服务。
要完成这步,你需要将新的磁盘连接到你的计算机/服务器上。对于这篇文章,我假定磁盘挂在到 /dev/sdb。
下一步是准备新的分区:# fdisk /dev/sdb
现在按 “N” 来创建新的分区。接着按 “P”,使其创建为主分区。在此之后,从 1-4 设置分区号。之后,你可以选择分区大小。这里按 enter。在下一步,你需要配置分区的大小。
如果你希望使用全部的磁盘,再按一次 enter。否则,你可以手动设置新分区的大小。准备就绪后按 “w” 保存更改。现在,我们需要为我们的新分区创建一个文件系统。这可以用下面命令轻松地完成:
# mkfs.ext4 /dev/sdb1
现在我们会挂载新分区到一个目录。我在根目录下创建了一个名为 “ssd” 的目录:
# mkdir /ssd/
挂载新分区到刚才创建的目录下:
# mount /dev/sdb1 /ssd/
你可以在 /etc/fstab 文件中添加如下行设置为开机自动挂载:
/dev/sdb1 /ssd ext3 defaults 00
现在我们将 MySQL 移动到新磁盘中首先停止 MySQL 服务:
# service mysqld stop
我建议你同时停止 Apache/nginx,以防止任何试图写入数据库的操作:
# service httpd stop
# service nginx stop
现在复制整个 MySQL 目录到新分区中:
# cp /var/lib/mysql /ssd/ -Rp
这可能需要一段时间,具体取决于你的 MySQL 数据库的大小。一旦这个过程完成后重命名 MySQL 目录:
# mv /var/lib/mysql /var/lib/mysql-backup
然后创建一个符号链接:
# ln -s /ssd/mysql /var/lib/mysql
现在启动你的 MySQL 和 web 服务:
# service mysqld start
# service httpd start
# service nginx start
以后你的数据库将使用新的磁盘访问。
3. 优化使用 InnoDB 的缓冲池