首页 > 数据库 > MySQL > 正文

MySQL针对Discuz论坛程序的基本优化教程

2024-07-24 12:45:24
字体:
来源:转载
供稿:网友

过了这么久,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 分析的结果如下:

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表