数据优化

时间:2022-05-03
本文章向大家介绍数据优化,主要内容包括SQL查询与循环、NOT IN、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

数据优化

读写分离,在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条件。

在站点运营过程中,常遇到高楼贴的性能问题,比如 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表的大小。