最近發現有一台阿裡雲RDS數據庫服務器負載持續很高,CPU總是占滿,當前連接數超過幾十的時候網站就被卡得不能動了。除了升級RDS配置以外,可以仔細檢查慢查詢日志,發現這種查詢特别多:
SELECT node.title AS node_title, node.nid AS nid, node.sticky AS node_sticky, node.created AS node_created FROM node node WHERE (( (node.status = 1 OR (node.uid = 0 AND 0 <> 0 AND 0 = 1) OR 0 = 1) AND (node.nid IN (SELECT tn.nid AS nid FROM taxonomy_index tn WHERE ( (tn.tid = '168') ))) )) ORDER BY node_sticky DESC, node_created DESC LIMIT 11 OFFSET 2600
這顯然是一個Drupal網站的分類頁面,翻頁到後面産生的MySQL查詢語句。執行的時間在2-4秒左右。
但其實分類頁面的排序不重要,而且頁面狀态、當前用戶也基本上是統一的、無需判斷的,所以簡化以上查詢語句成這樣:
SELECT node.title AS node_title, node.nid AS nid, node.language AS node_language FROM node node WHERE (( (node.nid IN (SELECT tn.nid AS nid FROM taxonomy_index tn WHERE ( (tn.tid = '168') ))) )) LIMIT 11 OFFSET 2600
執行的時間大約幾十-幾百ms,下降了1、2個數量級,所以這樣的優化是很有效果的。
查到我以前就寫過幾篇類似博客《Drupal中啟用Views來替代原生的分類頁面》、《替換Views翻頁功能來降低Drupal網站數據庫負載》、《用Devel模塊排查Drupal速度慢等性能問題》。
于是設置一個站的Views如下:
其中紅框是改動了一些的地方,将這樣設置的Views導出、複制到自定義模塊的.views_default.inc文件中,并使用drush cc all批量清理系列站的緩存,就可以把這個Views應用到各個網站中。
评论