摘要本节简单介绍了如何在服务器级优化数据库的性能以及提高数据库性能涉及到的硬件问题选择一个尽量快的系统使用RAID磁盘阵列是非常容易想到的方法对于数据库守护程序既可以在编译时就提供合适的参数也可以在选项文件中提供需要优化的参数
前面各段介绍了普通的 MySQL 用户利用表创建和索引操作以及利用查询的编写能够进行的优化不过还有一些只能由 MySQL 管理员和系统管理员来完成的优化这些管理员在 MySQL 服务器或运行 MySQL 的机器上具有控制权有的服务器参数直接适用于查询处理可将它们打开而有的硬件配置问题直接影响查询处理速度应该对它们进行调整
磁盘问题
正如前面所述磁盘寻道是一个性能的大瓶颈当数据开始增长以致缓存变得不可能时这个问题变得越来越明显对大数据库在那你或多或少地要随机存取数据你可以依靠你将至少需要一次磁盘寻道来读取并且几次磁盘寻道写入为了使这个问题最小化使用有低寻道时间的磁盘
为了增加可用磁盘轴的数量(并且从而减少寻道开销)符号联接文件到不同磁盘或分割磁盘是可能的
使用符号连接
这意味着你将索引/数据文件符号从正常的数据目录链接到其他磁盘(那也可以被分割的)这使得寻道和读取时间更好(如果磁盘不用于其他事情)
分割
分割意味着你有许多磁盘并把第一块放在第一个磁盘上在第二块放在第二个磁盘上并且第 n块在第(n mod number_of_disks)磁盘上等等这意味着如果你的正常数据大小于分割大小(或完美地排列过)你将得到较好一些的性能注意分割是否很依赖于OS和分割大小因此用不同的分割大小测试你的应用程序见 使用你自己的基准注意对分割的速度差异很依赖于参数取决于你如何分割参数和磁盘数量你可以得出以数量级的不同注意你必须选择为随机或顺序存取优化
为了可靠你可能想要使用袭击RAID +(分割+镜像)但是在这种情况下你将需要*N个驱动器来保存N个驱动器的数据如果你有钱这可能是最好的选择!然而你也可能必须投资一些卷管理软件投资以高效地处理它
一个好选择是让稍重要的数据(它能再生)上存在RAID 磁盘上而将确实重要的数据(像主机信息和日志文件)存在一个RAID +或RAID N磁盘上如果因为更新奇偶位你有许多写入RAID N可能是一个问题
你也可以对数据库使用的文件系统设置参数一个容易的改变是以noatime选项挂装文件系统这是它跳过更新在inode中的最后访问时间而且这将避免一些磁盘寻道
硬件问题
可利用硬件更有效地改善服务器的性能
在机器中安装更多的内存这样能够增加服务器的高速缓存和缓沖区的尺寸使服务器更经常地使用存放在内存中的信息降低从磁盘取信息的要求
如果有足够的 RAM 使所有交换在内存文件系统中完成那么应该重新配置系统去掉所有磁盘交换设置否则即使有足以满足交换的 RAM某些系统仍然要与磁盘进行交换
增加更快的磁盘以减少 I/O 等待时间寻道时间是这里决定性能的主要因素逐字地移动磁头是很慢的一旦磁头定位从磁道读块则较快
在不同的物理设备上设法重新分配磁盘活动如果可能应将您的两个最繁忙的数据库存放在不同的物理设备上请注意使用同一物理设备上的不同分区是不够的这样没有帮助因为它们仍将争用相同的物理资源(磁盘头)移动数据库的过程在第 章中介绍
在将数据重新放到不同设备之前应该保证了解该系统的装载特性如果在特定的物理设备上已经有了某些特定的主要活动将数据库放到该处实际上可能会使性能更坏例如不要把数据库移到处理大量Web 通信的Web 服务器设备上
在设置 MySQL 时应该配置其使用静态库而不是共享库使用共享库的动态二进制系统可节省磁盘空间但静态二进制系统更快(然而如果希望装入用户自定义的函数则不能使用静态二进制系统因为 UDF 机制依赖于动态连接)
服务器参数的选择
服务器有几个能够改变从而影响其操作的参数(或称变量)系统变量的当前值可以通过执行mysqladmin varibles命令来检查其中几个参数主要与查询有关有必要在此提一下
delayed_queue_size
此参数在执行其他 INSERT DELAYED 语句的客户机阻塞以前确定来自 INSERT DELAYED 语句的放入队列的行的数目增加这个参数的值使服务器能从这种请求中接收更多的行因而客户机可以继续执行而不阻塞
key_buffer_size
此参数为用来存放索引块的缓沖区尺寸如果内存多增加这个值能节省索引创建和修改的时间较大的值使 MySQL 能在内存中存储更多的索引块这样增加了在内存中找到键值而不用读磁盘块的可能性
在 MySQL 版及以后的版本中如果增加了键缓沖区的尺寸可能还希望用 initfile 选项启动服务器这样能够指定一个服务器启动时执行的 SQL 语句文件如果有想要存放在内存中的只读表可将它们拷贝到索引查找非常快的 HEAP 表
back_log
引入客户机连接请求的数量这些请求在从当前客户机中处理时排队如果你有一个很忙的站点可以增加改变量的值
编译和链接怎样影响MySQL的速度
大多数下列测试在Linux上并用MySQL基准进行的但是它们应该对其他操作系统和工作负载给出一些指示
当你用static链接时你得到最快的可执行文件使用Unix套接字而非TCP/IP连接一个数据库也可给出好一些的性能
在Linux上当用pgcc和O编译时你将得到最快的代码为了用这些选项编译你需要大约M内存因为gcc/pgcc需要很多内存使所有函数嵌入(inline)在配置MySQL时你也应该设定CXX=gcc以避免包括libstdc++库(它不需要)
只通过使用一个较好的编译器或较好的编译器选项在应用中你能得到一个%的加速如果你自己编译SQL服务器这特别重要!
在Intel上你应该例如使用pgcc或Cygnus CodeFusion编译器得到最大速度我们已经测试了新的 Fujitsu编译器但是它是还没足够不出错来优化编译MySQL
这里是我们做过的一些测量表
·如果你以O使用pgcc并且编译任何东西mysqld服务器是比用gcc快%(用字符串的版本)
·如果你动态地链接(没有static)结果慢了%注意你仍能使用一个动态连接的MySQL库只有服务器对性能是关键的
·如果你使用TCP/IP而非Unix套接字结果慢%
·在一个Sun SPARCstation 上gcc是比Sun Pro C++ 快%
·在Solaris 上在单个处理器上MITpthreads比带原生线程的Solaris慢%以更多的负载/cpus差别应该变得更大
由TcX提供的MySQLLinux的分发用pgcc编译并静态链接
总结
本节简单介绍了如何在服务器级优化数据库的性能以及提高数据库性能涉及到的硬件问题选择一个尽量快的系统使用RAID磁盘阵列是非常容易想到的方法
对于数据库守护程序既可以在编译时就提供合适的参数也可以在选项文件中提供需要优化的参数
思考题
使用ANALYSE过程分析语句SELECT * FROM pet判断是否有必要改变列的类型
现在让你需要优化表pet可以用那些手段做到?