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