在整个 Discuz! X2.5 产品中,为了提供效率, 需要对 SQL 做相应的优化。有时候不能忽略一些细小的优化,当出现过多未优化的细节时,也能带来致命的负载问题。

延迟更新机制

例如:首页的在线人数等,在实际产品中,有些数据不一定需要实时更新的,因为对于这类型的数据来说,实时更新的价值不高,对于这种情况我们可以考虑在产品研发过程中引入廷迟更新机制,这样可以从一定程度上降低 SQL 的负载。

索引

索引的合理使用, 能给你带来高效的 SQL 查询,但不是索引越多越好,索引的引入需在查看整个模块的设计,使之最大程度上使用索引。

读写分离

读写分离, 在 X2 的版本中,我们引入了多 SQL 服务器的支持,在主从服务器中,你可以配置写服务器跟读服务器,这样对于负载高的站点中可以
使用这个功能达到读写分离,降低由于写过程序中造成的 MySQL 表锁定后的 SQL 排队等候时间过长。当你的服务器支持读写分离要求时,你可以在
config_global.php 中配置。例如:

/**
 * 数据库主服务器设置, 支持多组服务器设置, 当设置多组服务器时, 则会根据分布式策略使用某个服务器
 * @example
 * $_config['db']['1']['dbhost'] = 'localhost'; // 服务器地址
 * $_config['db']['1']['dbuser'] = 'root'; // 用户
 * $_config['db']['1']['dbpw'] = 'root';// 密码
 * $_config['db']['1']['dbcharset'] = 'gbk';// 字符集
 * $_config['db']['1']['pconnect'] = '0';// 是否持续连接
 * $_config['db']['1']['dbname'] = 'x1';// 数据库
 * $_config['db']['1']['tablepre'] = 'pre_';// 表名前缀
 *
 * $_config['db']['2']['dbhost'] = 'localhost';
 * ...
 *
 */
$_config['db'][1]['dbhost']  		= 'localhost';
$_config['db'][1]['dbuser']  		= 'root';
$_config['db'][1]['dbpw'] 	 	= 'root';
$_config['db'][1]['dbcharset'] 		= 'gbk';
$_config['db'][1]['pconnect'] 		= 0;
$_config['db'][1]['dbname']  		= 'ultrax';
$_config['db'][1]['tablepre'] 		= 'pre_';

/**
 * 数据库从服务器设置 ( slave, 只读 ), 支持多组服务器设置, 当设置多组服务器时, 系统每次随机使用
 * @example
 * $_config['db']['slave']['1']['dbhost'] = 'localhost';
 * $_config['db']['slave']['1']['dbuser'] = 'root';
 * $_config['db']['slave']['1']['dbpw'] = 'root';
 * $_config['db']['slave']['1']['dbcharset'] = 'gbk';
 * $_config['db']['slave']['1']['pconnect'] = '0';
 * $_config['db']['slave']['1']['dbname'] = 'x2';
 * $_config['db']['slave']['1']['tablepre'] = 'pre_';
 *
 * $_config['db']['slave']['2']['dbhost'] = 'localhost';
 * ...
 *
 */
$_config['db']['slave'] = array();
				

SQL 查询与循环

禁止在循环中进行相应的 SQL 查询,当遇到这种情况时,可以尽可能的将其转换成循环外的查询。

NOT IN

在 SQL 查询中禁用 NOT IN 条件,NOT IN 的效率比 IN 低很多,当使用 IN 时,也要尽可能的保证 IN 的数量。

SQL 分拆

化繁为简,在优化过程中,尽可能的化繁为简,把复杂的 SQL 分拆成几个简单的 SQL 更有种于对整体 SQL 的优化处理。