MySQL的优化
2007-11-11 13:53:54 来源:WEB开发网优化硬件
如果你需要庞大的数据库表(> 2G),你应该考虑使用64位的硬件结构,像Alpha、Sparc或即将推出的IA64。因为MySQL(和PHP搭配之最佳组合)内部使用大量64位的整数,64位的CPU将提供更好的性能。对大数据库,优化的次序一般是RAM、快速硬盘、CPU能力。更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查,一台UPS就能够在电源故障时让系统安全关闭。据库存放在一个专用服务器的系统,应该考虑1G的以太网。延迟与吞吐量同样重要。优化磁盘配备一个专用磁盘,如果确是进行很多修改工作,将更新日志和事务日志放在专用磁盘上。低寻道时间对数据库磁盘非常重要。对与大表,你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表,索引Mediun int类型的列,需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上,大多数块将被缓存,所以大概只需要1-2次寻道。
然而对于写入(如上),你将需要4次寻道请求来找到在哪里存放新键码,而且一般要2次寻道来更新索引并写入一行。对于非常大的数据库,你的应用将受到磁盘寻道速度的限制,随着数据量的增加呈N log N数据级递增。将数据库和表分在不同的磁盘上。在MySQL(和PHP搭配之最佳组合)中,你可以为此而使用符号链接。条列磁盘(RAID 0)将提高读和写的吞吐量。带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。在Linux上,在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。在Linux上,用async (默认)和noatime挂载磁盘(mount)。对于某些特定应用,可以对某些特定表使用内存磁盘,但通常不需要。
优化操作系统
不要交换区。如果内存不足,增加更多的内存或配置你的系统使用较少内存。不要使用NFS磁盘(会有NFS锁定的问题)。增加系统和MySQL(和PHP搭配之最佳组合)服务器的打开文件数量。(在safe_MySQL(和PHP搭配之最佳组合)d脚本中加入ulimit -n #)。增加系统的进程和线程数量。如果你有相对较少的大表,告诉文件系统不要将文件打碎在不同的磁道上(Solaris)。使用支持大文件的文件系统(Solaris)。选择使用哪种文件系统。在Linux上的Reiserfs对于打开、读写都非常快。文件检查只需几秒种。
选择应用编程接口
PERL可在不同的操作系统和数据库之间移植。适宜快速原型。应该使用DBI/DBD接口。
PHP比PERL易学。使用比PERL少的资源。通过升级到PHP4可以获得更快的速度。
C MySQL(和PHP搭配之最佳组合)的原生接口。较快并赋予更多的控制。低层,所以必须付出更多。
C++较高层次,给你更多的时间来编写应用。仍在开发中
ODBC运行在Windows和Unix上。几乎可在不同的SQL服务器间移植。较慢。MyODBC只是简单的直通驱动程序,比用原生接口慢19%。有很多方法做同样的事。很难像很多ODBC驱动程序那样运行,在不同的领域还有不同的错误。问题成堆。Microsoft偶尔还会改变接口。不明朗的未来。(Microsoft更推崇OLE而非ODBC)
JDBC理论上可在不同的操作系统何时据库间移植。可以运行在web客户端。
Python和其他可能不错,可我们不用它们。
优化应用
应该集中精力解决问题。在编写应用时,应该决定什么是最重要的:速度、操作系统间的可移植性、SQL服务器间的可移植性、使用持续的连接。缓存应用中的数据以减少SQL服务器的负载。不要查询应用中不需要的列。
不要使用SELECT * FROM table_name...测试应用的所有部分,但将大部分精力放在在可能最坏的合理的负载下的测试整体应用。通过以一种模块化的方式进行,你应该能用一个快速“哑模块”替代找到的瓶颈,然后很容易地标出下一个瓶颈。
如果在一个批处理中进行大量修改,使用LOCK TABLES。例如将多个UPDATES或DELETES集中在一起。应该使用可移植的应用Perl DBI/DBD、ODBC、JDBC、Python(或其他有普遍SQL接口的语言)你应该只使用存在于所有目的SQL服务器中或可以很容易地用其他构造模拟的SQL构造。www.MySQL(和PHP搭配之最佳组合).com上的Crash-me页可以帮助你。
为操作系统/SQL服务器编写包装程序来提供缺少的功能。
如果你需要更快的速度,你应该:找出瓶颈(CPU、磁盘、内存、SQL服务器、操作系统、API或应用)并集中全力解决。使用给予你更快速度/灵活性的扩展。逐渐了解SQL服务器以便能为你的问题使用可能最快的SQL构造并避免瓶颈。
优化表布局和查询
使用复制以获得更快的选择(select)速度。如果你有一个慢速的网络连接数据库,使用压缩客户/服务器协议。
不要害怕时应用的第一个版本不能完美地移植,在你解决问题时,你总是可以在以后优化它。
挑选编译器和编译选项。位你的系统寻找最好的启动选项。
多用EXPLAIN SELECT、SHOW VARIABLES、SHOW STATUS和SHOW PROCESSLIST。
了解查询优化器的工作原理。优化表的格式。维护你的表(myisamchk、CHECK TABLE、 OPTIMIZE TABLE)
使用MySQL(和PHP搭配之最佳组合)的扩展功能以让一切快速完成。如果你注意到了你将在很多场合需要某些函数,编写MySQL(和PHP搭配之最佳组合) UDF函数。不要使用表级或列级的GRANT,除非你确实需要。
编译和安装MySQL(和PHP搭配之最佳组合)
通过位你的系统挑选可能最好的编译器,你通常可以获得10-30%的性能提高。在Linux/Intel平台上,用pgcc(gcc的奔腾芯片优化版)编译MySQL(和PHP搭配之最佳组合)。然而,二进制代码将只能运行在Intel奔腾CPU上。对于一种特定的平台,使用MySQL(和PHP搭配之最佳组合)参考手册上推荐的优化选项。一般地,对特定CPU的原生编译器(如Sparc的Sun Workshop)应该比gcc提供更好的性能,但不总是这样。
用你将使用的字符集编译MySQL(和PHP搭配之最佳组合)。
静态编译生成MySQL(和PHP搭配之最佳组合)d的执行文件(用--with-MySQL(和PHP搭配之最佳组合)d-ldflags=all-static)并用strip sql/MySQL(和PHP搭配之最佳组合)d整理最终的执行文件。
注意,既然MySQL(和PHP搭配之最佳组合)不使用C++扩展,不带扩展支持编译MySQL(和PHP搭配之最佳组合)将赢得巨大的性能提高。如果操作系统支持原生线程,使用原生线程(而不用mit-pthreads)。用MySQL(和PHP搭配之最佳组合)基准测试来测试最终的二进制代码。(完)
更多精彩
赞助商链接