国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

MySQL針對Discuz論壇程序的基本優化教程

2024-07-24 13:08:12
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了MySQL針對Discuz論壇程序的基本優化教程,包括在緩存和索引等方面的優化方法,需要的朋友可以參考下

過了這么久,discuz論壇的問題還是困擾著很多網友,其實從各論壇里看到的問題總結出來,很關鍵的一點都是因為沒有將數據表引擎轉成InnoDB導致的,discuz在并發稍微高一點的環境下就表現的非常糟糕,產生大量的鎖等待,這時候如果把數據表引擎改成InnoDB的話,我相信會好很多。這次就寫個掃盲貼吧。

1. 啟用innodb引擎,并配置相關參數

 

 
  1. #skip-innodb 

 

 
  1. innodb_additional_mem_pool_size = 16M #一般16M也夠了,可以適當調整下 
  2. innodb_buffer_pool_size = 6G #如果是專用db的話,一般是內存總量的80% 
  3. innodb_data_file_path = ibdata1:1024M:autoextend 
  4. innodb_file_io_threads = 4 
  5. innodb_thread_concurrency = 20 
  6. innodb_flush_log_at_trx_commit = 1 
  7. innodb_log_buffer_size = 16M 
  8. innodb_log_file_size = 256M 
  9. innodb_log_files_in_group = 3 
  10. innodb_max_dirty_pages_pct = 50 
  11. innodb_lock_wait_timeout = 120 
  12. innodb_file_per_table 

修改表引擎為innodb:

 

 
  1. mysql> alter table cdb_access engine = innodb; 

其他表類似上面,把表名換一下即可...

將表存儲引擎改成innodb后,不僅可以避免大量的鎖等待,還可以提升查詢的效率,因為innodb會把data和index都放在buffer pool中,效率更高。

2.緩存優化

在 my.cnf 中添加/修改以下選項:

 

 
  1. #取消文件系統的外部鎖 
  2. skip-locking 
  3. #不進行域名反解析,注意由此帶來的權限/授權問題 
  4. skip-name-resolve 
  5. #索引緩存,根據內存大小而定,如果是獨立的db服務器,可以設置高達80%的內存總量 
  6. key_buffer = 512M 
  7. #連接排隊列表總數 
  8. back_log = 200 
  9. max_allowed_packet = 2M 
  10. #打開表緩存總數,可以避免頻繁的打開數據表產生的開銷 
  11. table_cache = 512 
  12. #每個線程排序所需的緩沖 
  13. sort_buffer_size = 4M 
  14. #每個線程讀取索引所需的緩沖 
  15. read_buffer_size = 4M 
  16. #MyISAM表發生變化時重新排序所需的緩沖 
  17. myisam_sort_buffer_size = 64M 
  18. #緩存可重用的線程數 
  19. thread_cache = 128 
  20. #查詢結果緩存 
  21. query_cache_size = 128M 
  22. #設置超時時間,能避免長連接 
  23. set-variable = wait_timeout=60 
  24. #最大并發線程數,cpu數量*2 
  25. thread_concurrency = 4 
  26. #記錄慢查詢,然后對慢查詢一一優化 
  27. log-slow-queries = slow.log 
  28. long_query_time = 1 
  29. #關閉不需要的表類型,如果你需要,就不要加上這個 
  30. skip-bdb 

以上參數根據各自服務器的配置差異進行調整,僅作為參考.

3.索引優化

上面提到了,已經開啟了慢查詢,那么接下來就要對慢查詢進行逐個優化了.

搜索的查詢SQL大致如下:

 

 
  1. SELECT t.* FROM cdb_posts p, cdb_threads t WHERE 
  2. t.fid IN ('37''45''4''6''17''41''28''32''31''1''42'
  3. AND p.tid=t.tid AND p.author LIKE 'JoansWin' 
  4. GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80; 

用 EXPLAIN 分析的結果如下:

 

  1. mysql>EXPLAIN SELECT t.* FROM cdb_posts p, cdb_threads t WHERE 
  2. t.fid IN ('37''45''4''6''17''41''28''32''31''1''42'
  3. AND p.tid=t.tid AND p.author LIKE 'JoansWin' 
  4. GROUP BY t.tid ORDER BY lastpost DESC LIMIT 0, 80;  

 

 
  1. +-----------+------------+----------+--------------+-------------+-----------+-------------+ 
  2. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 
  3. +-----------+------------+----------+--------------+-------------+-----------+-------------+ 
  4. | 1 | SIMPLE | t | range | PRIMARY,fid | fid | 2 | NULL | 66160 | Using where;  
  5. Using temporary; Using filesort | 
  6. | 1 | SIMPLE | p | ref | tid | tid | 3 | Forum.t.tid | 10 | Using where 
  7. | +----+-------------+-------+-------+---------------+------+---------+-------------+-------+ 
  8. --------- 

只用到了 t.fid 和 p.tid,而 p.author 則沒有索引可用,總共需要掃描

66160*10 = 661600 次索引,夠夸張吧 :(

再分析 cdb_threads 和 cdb_posts 的索引情況:

 

 
  1. mysql>show index from cdb_posts;  

 

 
  1. +-----------+------------+----------+--------------+-------------+-----------+---------- 
  2. ---+----------+--------+------+--+ 
  3. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part |  
  4. Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+---- 
  5. ---------+-----------+-------------+----------+--------+------+--+ 
  6. | cdb_posts | 0 | PRIMARY | 1 | pid | A | 680114 | NULL | NULL | 
  7. | BTREE | | 
  8. | cdb_posts | 1 | fid | 1 | fid | A | 10 | NULL | NULL | 
  9. | BTREE | | 
  10. | cdb_posts | 1 | tid | 1 | tid | A | 68011 | NULL | NULL | 
  11. | BTREE | | 
  12. | cdb_posts | 1 | tid | 2 | dateline | A | 680114 | NULL | NULL | 
  13. | BTREE | | 
  14. | cdb_posts | 1 | dateline | 1 | dateline | A | 680114 | NULL | NULL | 
  15. | BTREE | |  
  16. +-----------+------------+----------+--------------+-------------+-----------+--- 

以及

 

 
  1. mysql>show index from cdb_threads;  

 

 
  1. +-----------+------------+----------+--------------+-------------+-----------+-------------+ 
  2. ----------+--------+------+-----+ 
  3. | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | 
  4. Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+----- 
  5. --------+-----------+-------------+----------+--------+------+-----+ 
  6. | cdb_threads | 0 | PRIMARY | 1 | tid | A | 68480 | NULL | NULL | 
  7. | BTREE | | 
  8. | cdb_threads | 1 | lastpost | 1 | topped | A | 4 | NULL | NULL | 
  9. | BTREE | | 
  10. | cdb_threads | 1 | lastpost | 2 | lastpost | A | 68480 | NULL | NULL | 
  11. | BTREE | | 
  12. | cdb_threads | 1 | lastpost | 3 | fid | A | 68480 | NULL | NULL | 
  13. | BTREE | | 
  14. | cdb_threads | 1 | replies | 1 | replies | A | 233 | NULL | NULL | 
  15. | BTREE | | 
  16. | cdb_threads | 1 | dateline | 1 | dateline | A | 68480 | NULL | NULL | 
  17. | BTREE | | 
  18. | cdb_threads | 1 | fid | 1 | fid | A | 10 | NULL | NULL | 
  19. | BTREE | | 
  20. | cdb_threads | 1 | enablehot | 1 | enablehot | A | 2 | NULL | NULL | 
  21. | BTREE | | +-------------+------------+-----------+--------------+-------------+------ 

看到索引 fid 和 enablehot 基數太小,看來該索引完全沒必要,不過,對于fid基數較大的情況,則可能需要保留>該索引.

所做修改如下:

 

 
  1. ALTER TABLE `cdb_threads` DROP INDEX `enablehot`, DROP INDEX `fid`, ADD INDEX (`fid`, `lastpost`); 
  2. ALTER TABLE `cdb_posts` DROP INDEX `fid`, ADD INDEX (`author`(10)); 
  3. OPTIMIZE TABLE `cdb_posts`; 
  4. OPTIMIZE TABLE `cdb_threads`; 

在這里, p.author 字段我設定的部分索引長度是 10, 是我經過分析后得出來的結果,不同的系統,這里的長度也不同,最好自己先取一下平均值,然后再適當調整.

現在,再來執行一次上面的慢查詢,發現時間已經從 6s 變成 0.19s,提高了 30 倍.


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 紫金县| 静安区| 监利县| 南和县| 通海县| 武威市| 宽甸| 芜湖市| 维西| 屯昌县| 连平县| 调兵山市| 敖汉旗| 赫章县| 汉中市| 胶南市| 金阳县| 正蓝旗| 延边| 垦利县| 资溪县| 五河县| 留坝县| 乐安县| 丹凤县| 随州市| 巴林右旗| 梨树县| 东源县| 中山市| 石柱| 哈密市| 永安市| 平邑县| 金溪县| 顺昌县| 仙居县| 临夏市| 甘洛县| 甘洛县| 科技|