在整個 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 的最佳化處理。