数据优化
读写分离,在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条件。
在站点运营过程中,常遇到高楼贴的性能问题,比如 limit 187460, 20 。为了解决高楼贴可能出现的问题,Discuz! X2.5 做了如下调整:
1、增加position字段记录楼层,修改主键为:PRIMARY KEY (tid, `position`)联合主键,其中position 为auto_increment。
2、pid字段保留,仍然是auto_increment(单独的一个表),保持唯一,其值在一个单独的表中记录, 保留此字段的主要目的是可以让原程序的基本不用做修改。
使用方法:
SELECT * FROM pre_forum_post WHERE tid=424 AND position>=$start AND position<$end ORDER BY position;
点击数
在一个站点中,主题浏览量、文章查看数等数据实时更新时,需要频繁的写表操作,从而导致锁表问题。为了解决这一问题,Discuz! X2.5 做了如下调整:
1、增加forum_threadaddviews表,记录每一个TID的增量点击数。
2、查看帖子时,如果增量点击数到100,则使用进程锁将数据更新到thread表并更新增量点击数为0。
3、回贴时将增量点击数和回复数一起更新到thread表,并更新增量点击数为0。
4、执行计划任务:每天3点,5分钟一次,一次取500条数据更新到thread表, 并删除此500条数据,以减少forum_threadaddviews表的大小。