過了這么久,discuz論壇的問題還是困擾著很多網友,其實從各論壇里看到的問題總結出來,很關鍵的一點都是因為沒有將數據表引擎轉成InnoDB導致的,discuz在并發稍微高一點的環境下就表現的非常糟糕,產生大量的鎖等待,這時候如果把數據表引擎改成InnoDB的話,我相信會好很多。這次就寫個掃盲貼吧。
1. 啟用innodb引擎,并配置相關參數
| #skip-innodb |
| innodb_additional_mem_pool_size = 16M #一般16M也夠了,可以適當調整下innodb_buffer_pool_size = 6G #如果是專用db的話,一般是內存總量的80%innodb_data_file_path = ibdata1:1024M:autoextendinnodb_file_io_threads = 4innodb_thread_concurrency = 20innodb_flush_log_at_trx_commit = 1innodb_log_buffer_size = 16Minnodb_log_file_size = 256Minnodb_log_files_in_group = 3innodb_max_dirty_pages_pct = 50innodb_lock_wait_timeout = 120innodb_file_per_table |
修改表引擎為innodb:
| mysql> alter table cdb_access engine = innodb; |
其他表類似上面,把表名換一下即可...
將表存儲引擎改成innodb后,不僅可以避免大量的鎖等待,還可以提升查詢的效率,因為innodb會把data和index都放在buffer pool中,效率更高。
2.緩存優化
在 my.cnf 中添加/修改以下選項:
| #取消文件系統的外部鎖skip-locking#不進行域名反解析,注意由此帶來的權限/授權問題skip-name-resolve#索引緩存,根據內存大小而定,如果是獨立的db服務器,可以設置高達80%的內存總量key_buffer = 512M#連接排隊列表總數back_log = 200max_allowed_packet = 2M#打開表緩存總數,可以避免頻繁的打開數據表產生的開銷table_cache = 512#每個線程排序所需的緩沖sort_buffer_size = 4M#每個線程讀取索引所需的緩沖read_buffer_size = 4M#MyISAM表發生變化時重新排序所需的緩沖myisam_sort_buffer_size = 64M#緩存可重用的線程數thread_cache = 128#查詢結果緩存query_cache_size = 128M#設置超時時間,能避免長連接set-variable = wait_timeout=60#最大并發線程數,cpu數量*2thread_concurrency = 4#記錄慢查詢,然后對慢查詢一一優化log-slow-queries = slow.loglong_query_time = 1#關閉不需要的表類型,如果你需要,就不要加上這個skip-bdb |
以上參數根據各自服務器的配置差異進行調整,僅作為參考.
3.索引優化
上面提到了,已經開啟了慢查詢,那么接下來就要對慢查詢進行逐個優化了.
搜索的查詢SQL大致如下:
| SELECT t.* FROM cdb_posts p, cdb_threads t WHEREt.fid IN ('37', '45', '4', '6', '17', '41', '28', '32', '31', '1', '42')AND p.tid=t.tid AND p.author LIKE 'JoansWin'GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80; |
用 EXPLAIN 分析的結果如下: