日期:2011-05-02 15:44:00 来源:本站整理
从MySQL得到最大的性能[MySQL防范]
本文“从MySQL得到最大的性能[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
优化是一项复杂的任务,因为它终究需求对整个系统的理解.当用你的系统/利用的小知识做一些部分优化是大概的时刻,你越想让你的系统更优化,你必须知道它也越多. 因此,本章将试图注释并给出优化MySQL的差别办法的一些例子.但是记着老是有某些(逐突变难)是系统更快的办法留着去做. 为了使一个系统更快的最重要部份当然是基本计划.你也需求知道你的系统将做这样的事情,那就是你的瓶颈. 最常见的瓶颈是:
磁盘寻道.磁盘花时间找到一个数据,用在1999年的现代磁盘其平均时间普通小于10ms,因此理论上我们能大约一秒寻道 1000 次.这个时间用新磁盘提高很慢并且很难对一个表优化.优化它的办法是将数据散布在多个磁盘上. 当磁盘在我们需求读数据的精确位置时,磁盘读/写.用1999年的现代,一个磁盘传输近似10-20Mb/s.这必寻道更简单优化,因为你能从多个磁盘并行地读. CPU周期.当我们读数据进内存时,(或假如它已经在那边)我们需求处理它以到达我们的后果.当我们有相对内存较小的表时,这是最常见的限制因素,但是用小表速度普通不是问题. 内存带宽.当CPU需求超越合适cpu缓存的数据时,缓存带宽就成为内存的一个瓶颈.这是对大大都系统的一个不常见的瓶颈但是你应当知道它. 10.2 系统/编译时和启动参数的疗养我们以系统级的东西开始,因为这些抉择的某一些很早就做好了.在其他情形下,快速浏览这部份大概就够了,因为它对大收获并不重要,但是有一个关于在这个层次上收获有多大的感受老是好的. 利用的缺省OS确切重要!为了最大程度地利用多CPU,应当利用Solaris(因为线程工作得确切不错)或Linux(因为2.2本的核心又确切不错的SMP支持).并且在32位的机械上,Linux缺省有2G的文件大小限制.当新的文件系统被释出时( XFS ),但愿这不久被改正. 因为我们没在很多平台上运行生产MySQL,我们警告你在大概挑选它前,测试你打算运行的平台.
其他倡议:
假如你有充足的RAM,你能删除全部交换设备.一些操作系统在某些情形下将利用一个SWAP设备,即便你有闲暇的内存. 利用--skip -locking的MySQL选项避免外部锁定.注意这将不影响MySQL功效,只要它仅运行在一个服务器上.只要在你运行myisamchk从前,记得要停掉服务器(或锁定相关部份).在一些系统上这个开关是强迫的,因为外部锁定不是在任何情形下都工作.当用MIT-pthreads编译时,-- skip-locking选项缺省为翻开(on),因为flock()没在全部的平台上被MIT-pthreads充分支持.唯一的情形是假如你对同一数据运行MySQL服务器(不是客户),你不能利用--skip-locking之时,不然对没有先清掉(flushing)或先锁定mysqld服务器的表上运行myisamchk.你仍旧能利用LOCK TABLES/ UNLOCK TABLES,即便你正在利用--skip-locking.
编译和链接怎样影响MySQL的速度
大大都下列测试在Linux上并用MySQL基准举行的,但是它们应当对其他操作系统和工作负载给出一些指导. 当你用-static链接时,你得到最快的可履行文件.利用Unix套接字而非TCP/IP衔接一个数据库也可给出好一些的性能. 在Linux上,当用pgcc和-O6编译时,你将得到最快的代码.为了用这些选项编译"sql_yacc.cc",你需求大约200M内存,因为 gcc/pgcc需求很多内存使全部函数嵌入(inline).在配置MySQL时,你也应当设定CXX=gcc以避免包含libstdC++库(它不需求). 只通过利用一个较好的编译器或较好的编译器选项,在利用中你能得到一个10-30%的加快.假如你自己编译SQL服务器,这分外重要! 在Intel上,你应当比方利用pgcc或Cygnus CodeFusion编译器得到最大速度.我们已经测试了新的 Fujitsu编译器,但是它是还没充足不出错来优化编译MySQL.
这里是我们做过的一些丈量表:
假如你以-O6利用pgcc并且编译任何东西,mysqld服务器是比用gcc快11%(用字符串99的版本). 假如你动态地链接(没有-static),后果慢了13%.注意你仍能利用一个动态衔接的MySQL库.只有服务器对性能是关键的. 假如你利用TCP/IP而非Unix套接字,后果慢7.5%. 在一个Sun SPARCstation 10上,gcc2.7.3是比Sun Pro C++ 4.2快13%. 在Solaris 2.5.1上,在单个处理器上MIT-pthreads比带原生线程的Solaris慢8-12%.以更多的负载/cpus,差别应当变得更大. 由TcX供应的MySQL-Linux的分发用pgcc编译并静态链接.
正如前面所述,磁盘寻道是一本性能的大瓶颈.当数据开始增长乃至缓存变得不大概时,这个问题变得越来越明显.对大数据库,在那你或多或少地要随机存取数据,你可以依靠你将至少需求一次磁盘寻道来读取并且几次磁盘寻道写入.为了使这个问题最小化,利用有低寻道时间的磁盘. 为了增添可用磁盘轴的数目(并且从而削减寻道开销),标记联接文件到差别磁盘或分割磁盘是大概的. 利用标记衔接这意味着你将索引/数据文件标记从正常的数据目录链接到其他磁盘(那也可以被分割的).这使得寻道和读取时间更好(假如磁盘不用于其他事情).见10.2.2.1 利用数据库和表的标记链接. 分割分割意味着你有很多磁盘并把第一块放在第一个磁盘上,在第二块放在第二个磁盘上,并且第 n块在第(n mod number_of_disks)磁盘上,等等.这意味着,假如你的正常数据大小于分割大小(或完善地布列过),你将得到较好一些的性能.注意,分割能否很依靠于OS和分割大小.因此用差别的分割大小测试你的利用程序.见10.8 利用你自己的基准.注意对分割的速度差别很依靠于参数,取决于你若何分割参数和磁盘数目,你可以得出以数目级的差别.注意你必须挑选为随机或次序存取优化. 为了坚固,你大概想要利用攻击RAID 0+1(分割+镜像),但是在这种情形下,你将需求2*N个驱动器来保存N个驱动器的数据.假如你有钱,这大概是最好的挑选!但是你也大概必须投资一些卷管理软件投资以高效地处理它. 一个好挑选是让稍重要的数据(它能再生)上存在RAID 0磁盘上,而将确切重要的数据(像主机信息和日记文件)存在一个RAID 0+1或RAID N磁盘上.假如因为更新颖偶位你有很多写入,RAID N大概是一个问题. 你也可以对数据库利用的文件系统设置参数.一个简单的改变是以noatime选项挂装文件系统.这是它跳过更新在inode中的最后拜候时间,并且这将避免一些磁盘寻道.
你可以从数据库目录移动表和数据库到别处,并且用链接到新地址的标记替换它们.你大概想要这样做,比方,转移一个数据库到有更多闲暇空间的一个文件系统. 假如MySQL注意到一个表是一个标记链接,它将解析标记链接并且利用其实际指向的表,它可工作在支持realpath()调用的全部系统上(至少 Linux和Solaris支持realpath())!在不支持realpath()的系统上,你应当差别时通过真实途径和标记链接拜候表!假如你这样做,表在任何更新后将不一致. MySQL缺省不支持数据库链接.只要你不在数据库之间做一个标记链接,一切将工作正常.假定你在MySQL数据目录下有一个数据库db1,并且做了一个标记链接DB2指向db1:
shell&> cd /path/to/datadir shell&> ln -s db1 db2目前,对在db1中的任一表tbl_a,在db2种也好象有一个表tbl_a.假如一个线程更新db1.tbl_a并且另一个线程更新db2.tbl_a,将有问题. 假如你确切需求这样,你必须改变下列在"mysys/mf_format.c"中的代码:
if (!lstat(to,&stat_buff)) /* Check if it's a symbolic link */ if (S_ISLNK(stat_buff.st_mode) && realpath(to,buff)) 把代码改变成这样: if (realpath(to,buff))以上是“从MySQL得到最大的性能[MySQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论