hello,大家好,我是小鱼
本文主要通过针对 MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议。主要 涉及 MySQL 的安装以及相关参数设置的优化,但不包括 mysqld 之外的比如存储引擎相关的参数优化哈。
选择合适的发行版本
1.二进制发行版
包括 RPM 等包装好的特定二进制版本
由于 MySQL 开源的特性,不仅仅 MySQL AB 提供了多个平台上面的多种二进制发行版本可以供大家选 择,还有不少第三方公司(或者个人)也给我们提供了不少选择。
使用 MySQL AB 提供的二进制发行版本我们可以得到哪些好处?
- 通过非常简单的安装方式快速完成 MySQL 的部署;
- 安装版本是经过比较完善的功能和性能测试的编译版本;
- 所使用的编译参数更具通用性的,且比较稳定;
- 如果购买了 MySQL 的服务,将能最大程度的得到 MySQL 的技术支持
第三方提供的 MySQL 发行版本大多是在 MySQL AB 官方提供的源代码方面做了或多或少的针对性改 动,然后再编译而成。这些改动有些是在某些功能上面的改进,也有些是在某写操作的性能方面的改 进。还有些由各OS 厂商所提供的发行版本,则可能是在有些代码方面针对自己的OS 做了一些相应的底层 调用的调整,以使 MySQL 与自己的 OS 能够更完美的结合。当然,也有一些第三方发行版本并没有动过 MySQL 一行代码,仅仅只是在编译参数方面做了一些相关的调整,而让MySQL 在某些特定场景下表现更优秀。
这样一说,听起来好像第三方发行的 MySQL 二进制版本要比 MySQL AB 官方提供的二进制发行版有更 大的吸引力,那么我们是否就应该选用第三方提供的二进制发行版呢?先别着急,我们还需要进一步分 析一下第三方发行版本可能存在哪些问题。
首先,由于第三方发行版本对 MySQL 所做的改动,很多都是为了应对发行者自己所处的特定场景而 做出来的。所以,第三方发行版本并不一定适合其他所有使用者所处的环境。
其次,由于第三方发行版本的发行者并一定都是一个足够让人信任的公司(或者个人),在其生成 自己的发行版本之前,是否有做过足够全面的功能和性能测试我们不得而知,在我们使用的时候是否会 出现 MySQL AB 官方的发行版本中并不存在的 bug?
最后,如果我们购买了 MySQL 的相关服务,而又使用了第三方的发行版本,当我们的系统出现问题 的时候,恐怕 MySQL 的支持工程师的支持工作会大打折扣,甚至可能会拒绝提供支持。
如果大家可以完全抛开以上这些可能存在隐患的顾虑,完全可以尝试使用非 MySQL AB 官方提供的二 进制版本,而选用可能具有更多特性或者更高性能的发行版本了。
之前我也对网络上各种第三方二进制分发版本做过一些测试和比较,也发现了一些比较不错的版 本,如 Percona 在整合了一些比较优秀的 Patch 之后的发行版本整体质量都还不错,使用者也比较多。 当然,Percona 不仅仅分发二进制版本,同时也分发整合了一些优秀 Patch 的源码包。对于希望使 Percona 提供的一些 Patch 的朋友,同时又希望能够自行编译以进一步优化和定制 MySQL 的朋友,也可以 下载 Percona 提供的源码包。
对于二进制分发版本的安装,对于安装本身来说,我们基本上没有太多可以优化的地方,唯一可以 做的就是当我们决定了选择第三方分发版本之后,可以根据自身环境和应用特点来选择适合我们环境的优化发行版本来安装。
2.源码安装
与二进制发行版本相比,如果我们选择了通过源代码进行安装,那么在安装过程中我们能够对 MySQL 所做的调整将会更多更灵活一些。因为通过源代码编译我们可以:
- 针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码;
- 根据不同的软件平台环境调整相关的编译参数;
- 针对我们特定应用场景选择需要什么组件不需要什么组件;
- 根据我们的所需要存储的数据内容选择只安装我们需要的字符集;
- 同一台主机上面可以安装多个 MySQL;
- 等等其他一些可以根据特定应用场景所作的各种调整。
在源码安装给我们带来更大灵活性的同时,同样也给我们带来了可能引入的隐患
- 对编译参数的不够了解造成编译参数使用不当可能使编译出来的二进制代码不够稳定;
- 对自己的应用环境把握失误而使用的优化参数可能反而使系统性能更差;
- 还有一个并不能称之为隐患的小问题就是源码编译安装将使安装部署过程更为复杂,所花费的 时间更长;
通过源码安装的最大特点就是可以让我们自行调整编译参数,最大程度的定制安装结果。下面我将 自己在通过源码编译安装中的一些优化心得做一个简单的介绍,希望能够对大家有所帮助。
在通过源码安装的时候,最关键的一步就是配置编译参数,也就是执行通过 configure
命令所设定 的各种编译选项。我们可以在 MySQL 源码所在的文件夹下面通过执行执行./configure —help
得到 可以设置的所有编译参数选项,如下:
`configure' configures this package to adapt to many kinds of systems. Usage: ./configure [OPTION]... [VAR=VALUE]... ... ... Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX ... ... For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] ... ... Program names: --program-prefix=PREFIX prepend PREFIX to installed program names System types: --build=BUILD configure for building on BUILD [guessed] ... ... Optional Features: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) ... ... Optional Packages: --with-charset=CHARSET ... ... --without-innodb Do not include the InnoDB table handler ... ... Some influential environment variables: CC C compiler command ... ... CCASFLAGS assembler compiler flags (defaults to CFLAGS) ... ...
上面的输出内容中很多都已经省略了,大家完全可以通过自行测试得到更为丰富的内容输出。下面 针对几个比较重要的编译参数做一个简单的介绍:
参数 | 说明 |
—prefix : |
设定安装路径,默认为“/usr/local” |
—datadir : |
设定 MySQL 数据文件存放路径 |
—with-charset : |
设定系统的默认字符集 |
—with-collation : |
系统默认的校验规则 |
—with-extra-charsets : |
出了默认字符集之外需要编译安装的字符集 |
—with-unix-socket-path : |
设定 socket 文件地址 |
—with-tcp-port : |
指定特定监听端口,默认为 3306 |
—with-mysqld-user : |
指定运行 mysqld 的 os 用户,默认为 mysql |
—without-query-cache : |
禁用 Query Cache 功能 |
—without-innodb : |
禁用 Innodb 存储引擎 |
--with-partition : |
在 5.1 版本中开启 partition 支持特性 |
--enable-thread-safe-client : |
以线程方式编译客户端 |
—with-pthread : |
强制使用 pthread 线程库编译 |
—with-named-thread-libs : |
指定使用某个特定的线程库编译 |
—without-debug : |
使用非 debug 模式 |
—with-mysqld-ldflags : |
mysqld 的额外 link 参数 |
—with-client-ldflags : |
client 的额外 link 参数 |
以上这些参数是在源码安装中比较常用的一些编译参数,其中前面几个编译参数主要是为了方便我 们在安装的时候可以定制自己的系统,让系统更适合我们自己应用环境的相关规范,做到环境统一,并 按照实际需求生成相应的二进制代码。而后面的一些参数主要是用来优化编译结果的。
我想大家应该都能理解一般来说,一个系统功能越复杂,其性能一般都会越差。所以,在我们安装 编译 MySQL 的时候应该尽量只选用我们需要的组件,仅安装我们需要的存储引擎,仅编译我们需要的字 符集,让我们的系统能够尽可能的简单,因为这样的 MySQL 也会给我们带来尽可能高的性能。
此外,对于一些特定的软件环境上,可能会有多种线程库的选择的,如果你对各个线程库较为了 解,完全可以通过编译参数设定让MySQL使用最合适的线程库,让MySQL 在我们特定的环境中发挥他最优 化的一面。
源码包的编译参数中默认会以 Debug 模式生成二进制代码,而 Debug 模式给 MySQL 带来的性能损失是 比较大的,所以当我们编译准备安装的产品代码的时候,一定不要忘记使用—without-debug
参数禁 用 Debug 模式。
而—with-mysqld-ldflags
和—with-client-ldflags
两个编译参数如果设置为-all-static
的话,可以告诉编译器以静态方式编译来使编译结果代码得到最高的性能。使用静态编译和动 态方式编译的代码相比,性能差距可能会达到 5%到 10%之多。
就我个人来说最常使用的编译配置参数如下,各位可以以参照自行增删相关内容:
./configure --prefix=/usr/local/mysql \ --without-debug \ --without-bench \ --enable-thread-safe-client \ --enable-assembler \ --enable-profiling \ --with-mysqld-ldflags=-all-static \ --with-client-ldflags=-all-static \ --with-charset=latin1 \ --with-extra-charset=utf8,gbk \ --with-innodb \ --with-csv-storage-engine \ --with-federated-storage-engine \ --with-mysqld-user=mysql \ --without-embedded-server \ --with-server-suffix=-community \ --with-unix-socket-path=/usr/local/mysql/sock/mysql.sock