日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL优化 之 Discuz论坛优化

發(fā)布時間:2025/1/21 数据库 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL优化 之 Discuz论坛优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一. 前言
近日由于需要,對discuz論壇(簡稱dz)進(jìn)行優(yōu)化,當(dāng)然了,只是涉及到數(shù)據(jù)庫的優(yōu)化.
先說一下服務(wù)器及dz的數(shù)據(jù)量,2 * Intel(R) Xeon(TM) CPU 2.40GHz, 4GB mem, SCISC硬盤.
MySQL 版本為 4.0.23. 數(shù)據(jù)表情況:
cdb_p_w_uploads 2萬
cdb_members 10萬
cdb_posts 68萬
cdb_threads 7萬
二. 緩存優(yōu)化
在 my.cnf 中添加/修改以下選項(xiàng):

#取消文件系統(tǒng)的外部鎖 skip-locking #不進(jìn)行域名反解析,注意由此帶來的權(quán)限/授權(quán)問題 skip-name-resolve #索引緩存,根據(jù)內(nèi)存大小而定,如果是獨(dú)立的db服務(wù)器,可以設(shè)置高達(dá)80%的內(nèi)存總量 key_buffer = 512M #連接排隊列表總數(shù) back_log = 200 max_allowed_packet = 2M #打開表緩存總數(shù),可以避免頻繁的打開數(shù)據(jù)表產(chǎn)生的開銷 table_cache = 512 #每個線程排序所需的緩沖 sort_buffer_size = 4M #每個線程讀取索引所需的緩沖 read_buffer_size = 4M #MyISAM表發(fā)生變化時重新排序所需的緩沖 myisam_sort_buffer_size = 64M #緩存可重用的線程數(shù) thread_cache = 128 #查詢結(jié)果緩存 query_cache_size = 128M #設(shè)置超時時間,能避免長連接 set-variable = wait_timeout=60 #最大并發(fā)線程數(shù),cpu數(shù)量*2 thread_concurrency = 4 #記錄慢查詢,然后對慢查詢一一優(yōu)化 log-slow-queries = slow.log long_query_time = 1 #關(guān)閉不需要的表類型,如果你需要,就不要加上這個 skip-bdb

以上參數(shù)根據(jù)各自服務(wù)器的配置差異進(jìn)行調(diào)整,僅作為參考.

?

更正一點(diǎn),在4.1以上版本里面,skip-locking 已經(jīng)改名為 skip-external-locking,而且缺省是關(guān)閉的。

三. 索引優(yōu)化
上面提到了,已經(jīng)開啟了慢查詢,那么接下來就要對慢查詢進(jìn)行逐個優(yōu)化了.
1. 搜索優(yōu)化
搜索的查詢SQL大致如下:

SELECT t.* FROM cdb_posts p, cdb_threads t WHERE t.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 分析的結(jié)果如下:

mysql>EXPLAIN SELECT t.* FROM cdb_posts p, cdb_threads t WHERE t.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; +-----------+------------+----------+--------------+-------------+-----------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra +-----------+------------+----------+--------------+-------------+-----------+-------------+ | 1 | SIMPLE | t | range | PRIMARY,fid | fid | 2 | NULL | 66160 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | p | ref | tid | tid | 3 | Forum.t.tid | 10 | Using where | +----+-------------+-------+-------+---------------+------+---------+-------------+-------+ ---------

只用到了 t.fidp.tid,而 p.author 則沒有索引可用,總共需要掃描
66160*10 = 661600 次索引,夠夸張吧 :(
再分析 cdb_threadscdb_posts 的索引情況:

mysql>show index from cdb_posts; +-----------+------------+----------+--------------+-------------+-----------+---------- ---+----------+--------+------+--+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+---- ---------+-----------+-------------+----------+--------+------+--+ | cdb_posts | 0 | PRIMARY | 1 | pid | A | 680114 | NULL | NULL | | BTREE | | | cdb_posts | 1 | fid | 1 | fid | A | 10 | NULL | NULL | | BTREE | | | cdb_posts | 1 | tid | 1 | tid | A | 68011 | NULL | NULL | | BTREE | | | cdb_posts | 1 | tid | 2 | dateline | A | 680114 | NULL | NULL | | BTREE | | | cdb_posts | 1 | dateline | 1 | dateline | A | 680114 | NULL | NULL | | BTREE | | +-----------+------------+----------+--------------+-------------+-----------+---

以及

mysql>show index from cdb_threads; +-----------+------------+----------+--------------+-------------+-----------+-------------+ ----------+--------+------+-----+ | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | +-----------+------------+----------+--------------+----- --------+-----------+-------------+----------+--------+------+-----+ | cdb_threads | 0 | PRIMARY | 1 | tid | A | 68480 | NULL | NULL | | BTREE | | | cdb_threads | 1 | lastpost | 1 | topped | A | 4 | NULL | NULL | | BTREE | | | cdb_threads | 1 | lastpost | 2 | lastpost | A | 68480 | NULL | NULL | | BTREE | | | cdb_threads | 1 | lastpost | 3 | fid | A | 68480 | NULL | NULL | | BTREE | | | cdb_threads | 1 | replies | 1 | replies | A | 233 | NULL | NULL | | BTREE | | | cdb_threads | 1 | dateline | 1 | dateline | A | 68480 | NULL | NULL | | BTREE | | | cdb_threads | 1 | fid | 1 | fid | A | 10 | NULL | NULL | | BTREE | | | cdb_threads | 1 | enablehot | 1 | enablehot | A | 2 | NULL | NULL | | BTREE | | +-------------+------------+-----------+--------------+-------------+------

看到索引 fidenablehot 基數(shù)太小,看來該索引完全沒必要,不過,對于fid基數(shù)較大的情況,則可能需要保留>該索引.
所做修改如下:

ALTER TABLE `cdb_threads` DROP INDEX `enablehot`, DROP INDEX `fid`, ADD INDEX (`fid`, `lastpost`); ALTER TABLE `cdb_posts` DROP INDEX `fid`, ADD INDEX (`author`(10)); OPTIMIZE TABLE `cdb_posts`; OPTIMIZE TABLE `cdb_threads`;

在這里, p.author 字段我設(shè)定的部分索引長度是 10, 是我經(jīng)過分析后得出來的結(jié)果,不同的系統(tǒng),這里的長度也不同,最好自己先取一下平均值,然后再適當(dāng)調(diào)整.
現(xiàn)在,再來執(zhí)行一次上面的慢查詢,發(fā)現(xiàn)時間已經(jīng)從 6s 變成 0.19s,提高了 30 倍.
這次先到這里,下次繼續(xù) ^_^

?

MySQL優(yōu)化 之 Discuz論壇優(yōu)化 -- 續(xù)

很早以前寫過一個文章,是關(guān)于discuz論壇的優(yōu)化:MySQL優(yōu)化 之 Discuz論壇優(yōu)化。寫的時候是2006年,沒想到過了這么久,discuz論壇的問題還是困擾著很多網(wǎng)友,其實(shí)從各論壇里看到的問題總結(jié)出來,很關(guān)鍵的一點(diǎn)都是因?yàn)闆]有將數(shù)據(jù)表引擎轉(zhuǎn)成InnoDB導(dǎo)致的,discuz在并發(fā)稍微高一點(diǎn)的環(huán)境下就表現(xiàn)的非常糟糕,產(chǎn)生大量的鎖等待,這時候如果把數(shù)據(jù)表引擎改成InnoDB的話,我相信會好很多。這次就寫個掃盲貼吧。

1. 啟用innodb引擎,并配置相關(guān)參數(shù)

#skip-innodb innodb_additional_mem_pool_size = 16M #一般16M也夠了,可以適當(dāng)調(diào)整下 innodb_buffer_pool_size = 6G #如果是專用db的話,一般是內(nèi)存總量的80% innodb_data_file_path = ibdata1:1024M:autoextend innodb_file_io_threads = 4 innodb_thread_concurrency = 20 innodb_flush_log_at_trx_commit = 1 innodb_log_buffer_size = 16M innodb_log_file_size = 256M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 50 innodb_lock_wait_timeout = 120 innodb_file_per_table

2. 修改表引擎為innodb

mysql> alter table cdb_access engine = innodb;

其他表類似上面,把表名換一下即可...
將表存儲引擎改成innodb后,不僅可以避免大量的鎖等待,還可以提升查詢的效率,因?yàn)閕nnodb會把data和index都放在buffer pool中,效率更高。

1、看機(jī)器配置,指三大件:cpu、內(nèi)存、硬盤
2、看mysql配置參數(shù)
3、查系mysql行狀態(tài),可以用mysqlreport工具來查看
4、查看mysql的慢查詢
依次解決了以上問題之后,再來查找程序方面的問題

URL: http://imysql.cn/?q=node/181

http://imysql.cn/2009/06/21/convert_discuz_database_table_engine_to_innodb.html
?

?

轉(zhuǎn)載于:https://blog.51cto.com/yk1688/548639

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的MySQL优化 之 Discuz论坛优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。