在前面两篇中,分别提到了如何用DBG和Xdebug扩展模块,在IDE中进行PHP Remote Debugging。
谈到IDE,PHPeclipse也是一个目前比较流行的PHP开发环境。其正式的版本中,使用DBG作为调试器。目前在其开发版本中,包含了对Xdebug的支持。PHPeclipse在使用DBG的时候,不需要DBG Listener,其内置了监听器,缺省所使用得端口也有所改变。
对php.ini进行设置,以实现同时对DBG和Xdebug模块,以及多个PHP IDE的支持。具体的设置如下:
...
extension=php_dbg.dll
[Debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.JIT_enabled=on
debugger.JIT_port=7869, 10000/16
...
zend_extension_ts="ext/php_xdebug.dll"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
xdebug.show_mem_delta=on
xdebug.idekey=<idekey>
在使用调试器的时候,不要启用Zend Optimizer。Xdebug必须占用zend_extension_ts,才能进行Remote Debugging。
这里,Xdebug的loading,使用了相对路径,也可以使用绝对路径,以适应PHP扩展模块目录的位置变化。
PHP Remote Debugging,相应的配置要涉及到Web Server端和IDE端,以及实际页面的访问。一开始的时候,有些摸不着头脑,理清楚了,就比较简单。
了解PHP的调试,一定会走到PHP在线帮助的“Appendix E. Debugging PHP”。在这一页的最后,又见到了熟悉的老朋友,一段Python代码,一个简单的在线调试监听器。运行这段Python code之后,在浏览器上输入在线调试指令,真的就连接过来了,从而知道PHP Remote Debugging是如何开始的。
无论DBG还是Xdebug,都在调试开始指令中,包含了所调试PHP脚本的完整的路径名和文件名。这样,IDE就可以直接打开相应的文件进行调试,在本机直接跳过HTTP URL到FS File这样的映射(Mapping)。
所使用的PHP解释器,是Web Server上的那个Parser,而不是IDE附带或连接的PHP。在Remote Debugging的过程中,IDE使用的PHP根本就没有用上。所以,IDE的PHP不必和Web Server的保持一致,甚至可以不设置。
DBG模块,可以对多个Port提供调试支持。PHPeclipse中的调试端口不固定,要写成debugger.JIT_port=7869, 10000/16这个样子。
Remote Debugging的过程,从Client/Server的角度来看,IDE充当了Server,在指定端口上监听调试连接。PHP的DBG和Xdebug扩展模块,则是Client。调试从浏览器的开始指令发起,PHP的调试器从Web Server那里得到调试指令,就去和对应端口的Server,即IDE联系,从而开始一个Remote Debugging的对话。
前面的Post中,提到Xdebug所使用的DBGp,是一个基于XML的多语言调试协议。在DBGp的开始指令中,还包含了脚本语言项。因此,Xdebug is not for PHP only, but also Python, Ruby...。如果在项目中,要在PHP、Python和Ruby之间跨越,使用Xdebug作为Remote Debugging的手段,无疑是非常合适的。这应该就是为什么Komodo选择Xdebug的原因吧。
Tags -
php ,
debug ,
dbg ,
xdebug ,
zend ,
optimizer ,
调试
PHP Remote Debugging,另一个比较流行的调试模块是Xdebug。Xdebug,使用上非常方便,在遇到exception的时候,能够将Application当前的状况,变量、call trace等信息,友好地直接输出到web页面上。
从Xdebug上下载Xdebug for PHP的扩展模块,将其置于PHP的ext目录中。在php.ini中增加,
extension=php_xdebug.dll
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
这样就可以在Web Application遇到语法或值溢出等exception的时候,显示相关变量和调用堆栈。
对于PHP Remote Debugging,需要在php.ini中对Xdebug进行更多的设置。
zend_extension_ts="ext/php_xdebug.dll"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.idekey=<idekey>
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
xdebug.show_mem_delta=on
并将和Zend Optimizer有关的选项全部关闭。在phpinfo()中,检查是否成功启动Xdebug。
Xdebug支持多个调试协议,GDB、DBGp和PHP3。这里使用的是DBGp,一个基于XML的多语言调试协议。
目前,Xdebug的最新版本是2.0.0 Beta。和DBG Debugger相比,支持Xdebug的IDE还不太多。这里以Komodo为例,说明基于Xdebug扩展,如何进行Remote Debugging。
安装好Komodo 3.5.3之后,设置Preferences - Debugger - Proxy中的,
Listen for debug connections on port: 9000
再选择Debug - Listen for Remote Debugger。如果出现勾号,没有出错信息的话,Komodo is ready for remote debugging。
输入Xdebug调试开始指令,
http://localhost/myscript.php?XDEBUG_SESSION_START=1
切换到Komodo,对PHP程序进行在线调试。
上述指令,会启动一个持续的Xdebug调试session,后续PHP脚本会自动进入在线调试状态。也可以只对单个PHP脚本进行单次Remote Debugging。
http://localhost/myscript.php?XDEBUG_SESSION_START
这样就不需要再输入调试中止指令,直接退出Remote Debugging。调试中止指令,格式如下,
http://localhost/myscript.php?XDEBUG_SESSION_STOP
需要指出的是,XDEBUG_SESSION_STOP不会立即停止对当前PHP的在线调试,而是停止对此以后的PHP的Remote Debugging。
Xdebug提供了一个xdebug_break()函数,直接在程序中设置断点,而不是在Komodo中设置。
Tags -
php ,
debug ,
xdebug ,
调试
PHP Remote Debugging,是对PHP Web应用程序进行调试的最直接、最有力的手段。尤其是现在,框架横行的时代,光靠阅读源码和简单的echo,显然进展不快。
Remote Debugging,直译过来是“远程调试”,个人更愿意翻译成“在线调试”,即在实际使用Web Server的情况下,对Web Application进行调试。
诸多PHP IDE,都集成了广泛使用的DBG调试模块。这里以PHPEdit为例,介绍如何使用DBG进行PHP程序的在线调试。PHPEdit包含了DBG Listener和DBG Debugger,能够进行单步跟踪、全局和局部变量检查等功能,用它进行Remote Debugging,非常方便、实用。
在启动PHPEdit的时候,DBG Listener也会一同启动。在系统托盘区,可以找到一个类似雷达天线的图标,那个就是PHP DBG Listener。DBG Listener的基本设置,
Bind address: 0.0.0.0
Port: 7869
IDE COM class: PHPEdit IDE
X Breakpoint on script start
X Breakpoint on script finish
最后这两行设置,会在PHP脚本的开始和结束的地方,自动设置断点。这样就不必手工去设置断点了。当你不清楚程序的整体结构和入口点的时候,这就显得很方便。DBG Listener通常是处于等待(Waiting)的状态。
设置PHPEdit,以便进行在线调试。在PHPEdit Perferences中,选择Debugger。
X HTTP (SAPI or remote CGI)
X Use backslashed in filenames on remote filesystem (win32)
X Make file name low case before mapping
后续的Mapping部分,是将实际要访问的HTTP URL和本机的文件目录对应起来。如果Web Server和PHPEdit在同一台机器上,就没有必要在本机再建立一个工作备份,Mapping可不设。
设置完成之后,点击Debug - Start Listener,以准备接受Remote Debugging指令。一旦PHPEdit和DBG Listener配置好之后,就不需要每次都去Start Listener,PHPEdit会自动开始对Remote Debugging的监听。
Web Server这一端,需要修改php.ini以提供对DBG的支持。在php.ini的Dynamic Extensions段,增加
extension=php_dbg.dll
[Debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.JIT_enabled=on
debugger.JIT_port=7869
DBG的扩展模块,可以从这里下载。选择合适的版本,放到php的扩展目录下,并改名为php_dbg.dll。对于版本号高于5.1.2的PHP,用for 5.1.2的那个dll即可。
通过查看phpinfo()的输出信息,确认PHP DBG模块被正确安装。
This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with DBG v2.15.1, (C) 2000,2006, by Dmitri Dmitrienko
...
dbg
DBG php debugger, version 2.15.1, Copyright 2001, 2006, Dmitri
Dmitrienko, www.nusphere.com
Version 2.15.1
Linked as a shared library.
Profiler compiled, enabled
Directive Local Value Master Value
debugger.enable_session_cookie On On
debugger.enabled On On
debugger.fail_silently On On
debugger.ignore_nops Off Off
debugger.JIT_enabled On On
debugger.JIT_host clienthost clienthost
debugger.JIT_level 3 3
debugger.JIT_port 7869 7869
debugger.profiler_enabled On On
debugger.session_nocache On On
debugger.timeout_seconds 300 300
现在一切准备就绪,可以开始PHP Remote Debugging了。DBG Remote Debugging不会自动开启,需要激活一下。在浏览器中,输入
http://localhost/myscript.php?DBGSESSID=1@localhost:7869
就会切换到PHPEdit,打开myscript.php,光标会自动停在myscript.php中PHP程序部分的开始。接下来,就是标准的debug操作,跟踪、步进、变量察看等等。随着PHP代码的运行结束,最后输出的Web Page就会出现在浏览器中。这样就完成了一个DBG的调试周期。
一旦开启DBG在线调试,之后就不再需要附加Active Command了。以后对每个PHP页的访问,都会自动进入调试状态。
使用下面的命令,中止DBG Remote Debugging,取消调试。
http://localhost/myscript.php?DBGSESSID=0
DBG Listener可以支持多个IDE,如果安装有多个支持DBG的IDE,需要注意实际使用哪个IDE进行调试。
如果在未开启DBG Listener或相应的IDE的情况下,使用Active Command,或者在Remote Debugging过程中,IDE退出,浏览器上都会得到出错信息。此时,需要附加取消调试的指令,才能恢复对PHP页面的正常访问。
Tags -
php ,
debug ,
ide ,
dbg ,
调试
InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
MyIASM是IASM表的新版本,有如下扩展:
二进制层次的可移植性。
NULL列索引。
对变长行比ISAM表有更少的碎片。
支持大文件。
更好的索引压缩。
更好的键码统计分布。
更好和更快的auto_increment处理。
以下是一些细节和具体实现的差别:
1.InnoDB不支持FULLTEXT类型的索引。
2.InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。
3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。
Tags -
mysql ,
数据库 ,
innodb ,
myisam
总结了一些MySQL优化方面的技巧
一. 启动参数优化修改 my.cnf (或者my.ini),加入/修改以下几行
#设定缓存的连接数,节省连接时的开销
back_log = 64
#禁用文件系统外部锁
external-locking = 0
#禁用BDB,如果你确实不需要的话,innodb也是如此
skip-bdb
#索引缓冲,如果是专用的数据库服务器,可以设置高达服务器内存的一半,如果不是专用的,
#还是设置得低一点
key_buffer = 512M
#缓存数据表数量,如果内存较大,可以设置稍微高一点,否则还是设置低一点
#设置这个参数可以参见系统状态中的 open_tables(表示当前打开的数据表总数)
#和 opened_tables(表示所有打开的数据表总数)
table_cache = 128
#禁用dns解析,如果你的授权信息中采用dns授权方式了,就不能启用该选项
skip-name-resolve
#记录慢查询和没有使用索引的查询,便于帮助分析问题所在
long_query_time = 1
log-slow-queries = /usr/local/mysql/data/slow.log
log-queries-not-using-indexes
其他参数诸如 sort_buffer_size,net_buffer_length,read_buffer_size,read_rnd_buffer_size,myisam_sort_buffer_size,
thread_cache_size,query_cache_size,max_binlog_cache_size 等请查询MySQL手册,然后做出合适的调整.
二. 其他小TIPS* 针对Innodb表,尽量不执行 SELECT COUNT(*) 语句,因为Innodb表没有类似MyISAM那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢.
* 尽量使用MyISAM表,除非必须使用其他类型,因为MyISAM类型的总体读写效率是相当高的,缺点是表级锁,而不是行/页级锁.
* 善用 EXPLAIN来帮助你分析查询优化情况
* 如果需要对一个较大的且并发读写较多的数据表做 GROUP BY 等统计操作,建议使用摘要表来存储统计信息,定期更新统计表,这可能获得很大的性能改善.
* 查询时如果有 ORDER BY分句的话,注意让它的字段顺序和索引字段顺序对应,这样能加快排序速度
* 如果有一个多字段索引,则查询时,必须按照索引顺序来使用,否则该索引不会用到.例如:
索引 `idx_`(col1, col2, col3),那么查询 SELECT .... FROM ... WHERE col1=1 AND col2=2; 使用索引,而查询 ... WHERE col2=2 AND col3=3; 或 ... WHERE col1=1 AND col3=3; 则不使用索引.
* WHERE 中的条件如果有恒量类型的(如 `field` = 1),就尽量放在前面,这样能更快的执行过滤.
* 2 个表连接时,连接字段的类型最好一致(包括字段长度),这样的话索引速度快多了.
* 大部分情况下,字符类型的字段索引值需要一部分,例如 CREATE INDEX char_idx ON tbl1 ( name(10) );
* 尽量使用最合适的数据类型,能使用 ENUM 就不使用 TINYINT ,能使用 SMALLINT 就不使用 MEDIUMINT.这样能节省存储空间,增加数据存储量,提高搜索速度.不要担心这样会对省级产生很大的影响,因为加入从 TINYINT 类型改变为 INT 的话,并不会改变原来的数据.
* 如果知道某个表总是频繁使用的话,可以把它放到 hot_cache 中,用以下方法:
SET GLOBAL hot_cache.key_buffer_size=128*1024;
CACHE INDEX `xxx` IN hot_cache;
* 把拖沓复杂,速度慢的的查询分解成多个简洁明了的查询,这样尽管查询次数多了,但是总体速度和效率却可能反而更高了,而且也减少了锁表的可能.
* 执行查询时,尽量不使用外部函数,因为这样的话就无法使用可能存在的索引,并且无论如何都会极大地降低效率.如: ... WHERE `create_time` > UNIX_TIMESTAMP(NOW()); 这样的查询.可以在程序中把当前的时间取得,然后直接执行构造好了的SQL语句.
* 在索引字段上使用 LIKE 查询时,左边不要使用 '%' 修饰符,这样就可以利用索引,否则无法使用索引.如 ... `name` LIKE 'yejr%';.
* 如果有可能,多使用存储过程,这大概能获得 22% 的性能提高.
* 如果并发访问量相对最大连接数小多了的话,最好使用永久连接,这样能节省不少连接时的系统资源损耗.
* 定期的在MyISAM表上执行 OPTIMIZE TABLE,这能整理随便,提高索引效率.
* 如果你主要按 col1,col2,...顺序检索记录,请在对表大量更改后执行 ALTER TABLE ... ORDER BY col1, col2, ... 语句,这可以获得更好的性能.
* 对于频繁更改的MyISAM表,应尽量避免更新所有变长字段(VARCHAR、BLOB和TEXT).
* 对于记录总数超过500万的单表,就应该赶紧考虑分表了.分表策略有多种,比如按ID号段,或者按时间切分,等等.
* 创建数据表时尽量指定字段不能为NULL,并且有默认值.
* 使用 LOAD DATA,而不是使用大批量的 INSERT 语句来导入数据.
* 使数据表名和字段名尽可能的短,例如在 user 表中使用字段名 name,而不是 user_name.
* 用 DELAY_KEY_WRITE = 1 选项让MyISAM更快地更新索引,因为在表关闭之前它们不刷新到硬盘上.缺点是如果服务器如果突然被杀掉了,重启之后就必须运行 myisamchk 修复索引才行.
* 采用复制机制来分摊读数据的负载,把写数据只放在主服务器上,把读平均分摊到各个从服务器上,能大大提高系统负载.
数据库性能优化涉及到系统硬件和软件的方方面面,本文讨论的主要是编译和配置优化、服务器参数调整、如何选用合适的表类型,以及如何用数据库内建的命令辅助 分析和优化性能,特别是如何用EXPLAIN辅助优化查询的性能。原文出处:
http://www.devshed.com/Server_Side/MySQL/Optimize/在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分。对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接 影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验 进行判断,然后设置合理的参数。
下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化;二是MySQL自身(my.cnf)的优化。
(1) 服务器硬件对MySQL性能的影响
a) 磁盘寻道能力(磁盘I/O),以目前高转速SCSI硬盘(7200转/秒)为例,这种硬盘理论上每秒寻道7200次,这是物理特性决定的,没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作,对磁盘的读写量可想而知。所以,通常认为磁盘I/O是制约MySQL性能的最大因素之一,对于日均访问量 在100万PV以上的Discuz!论坛,由于磁盘I/O的制约,MySQL的性能会非常低下!解决这一制约因素可以考虑以下几种解决方案:
使用 RAID-0+1磁盘阵列,注意不要尝试使用RAID-5,MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快;抛弃传统的硬盘,使用速度更 快的闪存式存储设备。经过Discuz!公司技术工程的测试,使用闪存式存储设备可比传统硬盘速度高出6-10倍左右。
b) CPU 对于MySQL应用,推荐使用S.M.P.架构的多路对称CPU,例如:可以使用两颗Intel Xeon 3.6GHz的CPU。
c) 物理内存对于一台使用MySQL的Database Server来说,服务器内存建议不要小于2GB,推荐使用4GB以上的物理内存。
(2) MySQL自身因素当解决了上述服务器硬件制约因素后,让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。
由于my.cnf文件的优化设置是与服务器硬件配置息息相关的,因而我们指定一个假想的服务器硬件环境:
CPU: 2颗Intel Xeon 2.4GHz
内存: 4GB DDR
硬盘: SCSI 73GB
许多新手往往把重新编译源代码看成是一种无可避免的灾祸,其实编译源代码还能对程序的最终性能起到显著的影响。编译过程可以用不同流水线上装配同样型号 的汽车比拟:第一条流水线由素质较低的工人操作,装配程序未能尽善尽美,零件装配误差较大;第二条流水线由高素质的技术工人操作,汽车装配程序合理,且利 用最好的工具保证产品的高质量。虽然两条流水线上装配出来的汽车外观一模一样,但两种汽车的性能表现却可能大不相同。对于编译器来说情况也完全相似,有些 编译器装配出来的程序要比其他编译器的更好。
编译时考虑所有可用的选项也是极其重要的。很可能某些编译器的默认选项值不能符合要求, 或者,为了满足应用的特定需求,我们需要指定一些特殊的编译选项。正如MySQL文档所指出的,只要采用了更好的编译器或者使用更合理的编译选项,应用性 能的提高程度可以达到10-30%。
既然如此,编译时具体应该注意哪些问题才能让MySQL数据库运行得更快呢?
▲ 使用pgcc编译器
如果系统使用的是奔腾处理器,那么pgcc(Pentium GCC)正是为这些系统下运行的程序提供的专用编译器。pgcc是gcc编译器(
http://www.gnu.org/software/gcc/)的 奔腾优化版,用pgcc编译MySQL代码可以让整体性能提高10%以上!关于pgcc的更多信息,请参见http: //www.goof.com/pcg/。当然,如果系统使用的不是奔腾处理器,采用这种方法提高MySQL的运行速度就不合适了,因为正如其名字所示, pgcc是专门为奔腾系统提供的。
▲ 把mysqld编译成静态模式
以不带共享库的形式编译mysqld同样可以提高性能。在配置行加入下面这个选项可以将mysqld编译成静态模式:
% >./configure -with-mysqld-ldflags=-all-static [--其他配置选项]
▲ 配置示例
下面的配置命令经常用于提高MySQL的性能:
% >CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6
-mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti"
./configure --prefix=/usr/local --enable-assembler --with-mysqld-ldflags=-all-static
--disable-shared
详细解释每个gcc选项的作用已经超出了本文的范围,请访问gcc的说明文档了解这些信息(
http://gcc.gnu.org/)。注意不要拘泥于这个例子,请在命令行执行man gcc仔细了解每一个gcc选项的含义。
正确的编译方法固然重要,但它只是提高MySQL服务器性能工作的一部分。MySQL服务器的许多参数会影响服务器的性能表现,而且我们可以把这些参数保存到配置文件,使得每次MySQL服务器启动时这些参数都自动发挥作用。这个配置文件就是my.cnf。
MySQL服务器提供了my.cnf文件的几个示例,它们可以在/usr/local/mysql/share/mysql/目录下找到,名字分别为my -small.cnf、my-medium.cnf、my-large.cnf以及my-huge.cnf。文件名字中关于规模的说明描述了该配置文件适 用的系统类型。例如,如果运行MySQL服务器的系统内存不多,而且MySQL只是偶尔使用,那么使用my-small.cnf配置文件最为理想,这个配 置文件告诉mysqld daemon使用最少的系统资源。反之,如果MySQL服务器用于支持一个大规模的在线商场,系统拥有2G的内存,那么使用mysql-huge.cnf 最为合适。
要使用上述示例配置文件,我们应该先复制一个最适合要求的配置文件,并把它命名为my.cnf。这个复制得到的配置文件可以按照如下三种方式使用:
全局:把这个my.cnf文件复制到服务器的/etc目录,此时文件中所定义的参数将全局有效,即对该服务器上运行的所有MySQL数据库服务器都有效。
局部:把这个my.cnf文件复制到[MYSQL-INSTALL-DIR]/var/将使该文件只对指定的服务器有效,其中[MYSQL-INSTALL-DIR]表示安装MySQL的目录。
用户:最后,我们还可以把该文件的作用范围局限到指定的用户,这只需把my.cnf文件复制到用户的根目录即可。
那么,如何设置my.cnf文件中的参数呢?或者进一步说,哪些参数是我们可以设置的呢?所有这些参数都对MySQL服务器有着全局性的影响,但同时每 一个参数都和MySQL的特定部分关系较为密切。例如,max_connections参数属于mysqld一类。那么,如何才能得知这一点呢?这只需执行如下命令:
% >/usr/local/mysql/libexec/mysqld --help
该命令将 显示出和mysqld有关的各种选项和参数。要寻找这些参数非常方便,因为这些参数都在“Possible variables for option --set-variable (-O) are”这行内容的后面。找到这些参数之后,我们就可以在my.cnf文件中按照如下方式设置所有这些参数:
set-variable = max_connections=100
这行代码的效果是:同时连接MySQL服务器的最大连接数量限制为100。不要忘了在my.cnf文件[mysqld]小节加上一个set-variable指令,具体请参见配置文件中的示例。
数据库的常规优化MySQL 本身的配置文件 my.cnf(或 my.ini)中的相关参数,对整个数据库系统来说尤为重要。针对不同的服务器内存容量,MySQL 程序包中提供了 my-small.cnf、my-medium.cnf、my-large.cnf、my-huge.cnf 四个分别适用于服务器内存不低于 64M、256M、512M、1G 情况下的参数设置,您可以根据自身机器的实际情况,数据库应用所占比重,在上述四个文件中提供的参数基础上对配置文件进行修改。Unix 类系统用户,建议将配置文件命名为 my.cnf 放置于 /etc 中;Windows 系统用户直接在 Winmysqladmin.exe 中对 my.ini 进行修改即可。 除了以上默认的配置文件提供的参数以外,通常情况您还需要在 [mysqld] 后修改或增加以下的参数以适应大部分 web 应用程序的需要:
* 最大连接数为 600,以满足一般应用对连接数的需要:增加 max_connections = 600。根据我们的经验,500~1000 是较为合适的数值,没必要将其设置为超过 1000,那只会造成对资源的浪费。
* 不使用 innodb 和 bdb:增加两行内容,分别是 skip-innodb 和 skip-bdb。Discuz! 和大部分 web 应用程序不需要使用此两项功能,因此将其关闭以节约内存和磁盘空间,提高效率。
* 连接超时时间 5,避免空闲进程过多的内存占用:增加 wait_timeout = 5。通过减少超时时间,使得使用 pconnect(长期连接)的用户在利用其不需反复验证用户名和密码的同时,避免打开过多的空闲进程,减少内存消耗。
* 禁止端口连接:增加 skip-networking。如果使用 Unix 类操作系统,数据库和 httpd 在同一台服务器,且不需要远程读取数据库,可增设此项参数,关闭默认的 3306 端口,有效提禁止外部网络未经授权的访问,避免端口被用以进行 DDoS 攻击。Windows 系统不需要(不能)增加这个参数。
其他参数的配置在此不详述,如果您对服务器及 MySQL 数据库有相当的了解,可以通过数据库的日常运行情况,有针对性的进行修改。
数据表优化(Optimize Table)当数据库中删除了大量的数据后,可能会发现数据文件尺寸并没有减小。这是因为删除操作后在数据文件中留下碎片所致。Discuz! 在系统数设置界面提供了数据表优化的功能,可以去除删除操作后留下的数据文件碎片,减小文件尺寸,加快未来的读写操作。您只要在做完批量删除,或定期(如每一两个月)进行一次数据表优化操作即可。
Tags -
mysql ,
discuz ,
性能 ,
优化 ,
tip ,
技巧 ,
数据库