discuz mysql 优化_MySQL针对Discuz论坛程序的基本优化教程
过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕,产生大量的锁等待,这时候如果把数据表引擎改成InnoDB的话,我相信会好很多。这次就写个扫盲贴吧。
1. 启用innodb引擎,并配置相关参数
?1#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:
?1mysql> 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大致如下:
?1234SELECT t.*FROM cdb_posts p, cdb_threads tWHEREt.fidIN ('37','45','4','6','17','41','28','32','31','1','42')AND p.tid=t.tidAND p.authorLIKE 'JoansWin'GROUP BY t.tidORDER BY lastpostDESC LIMIT 0, 80;
用 EXPLAIN 分析的结果如下:
?mysql>EXPLAINSELECT t.*FROM cdb_posts p, cdb_threads tWHEREt.fidIN ('37','45','4','6','17','41','28','32','31','1','42')AND p.tid=t.tidAND p.authorLIKE 'JoansWin'GROUP BY t.tidORDER BY lastpostDESC 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.fid 和 p.tid,而 p.author 则没有索引可用,总共需要扫描
66160*10 = 661600 次索引,够夸张吧 :(
再分析 cdb_threads 和 cdb_posts 的索引情况:
?1mysql>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 | |+-----------+------------+----------+--------------+-------------+-----------+---
以及
?1mysql>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 | | +-------------+------------+-----------+--------------+-------------+------
看到索引 fid 和 enablehot 基数太小,看来该索引完全没必要,不过,对于fid基数较大的情况,则可能需要保留>该索引.
所做修改如下:
?1234ALTER TABLE `cdb_threads`DROP INDEX `enablehot`,DROP INDEX `fid`,ADD INDEX (`fid`, `lastpost`);ALTER TABLE `cdb_posts`DROP INDEX `fid`,ADD INDEX (`author`(10));OPTIMIZETABLE `cdb_posts`;OPTIMIZETABLE `cdb_threads`;
在这里, p.author 字段我设定的部分索引长度是 10, 是我经过分析后得出来的结果,不同的系统,这里的长度也不同,最好自己先取一下平均值,然后再适当调整.
现在,再来执行一次上面的慢查询,发现时间已经从 6s 变成 0.19s,提高了 30 倍.
discuz mysql 优化_MySQL针对Discuz论坛程序的基本优化教程相关推荐
- Discuz!论坛程序安装+模板配置教程
Discuz!论坛程序安装+模板配置教程 Linux系统安装方法: 第一步:检查是否安装apache mysql php ps -ef |grep httpd ps -ef |grep mysql p ...
- discuz mysql配置文件_MySQL优化配置文件my.ini(discuz论坛)
在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同 ...
- mysql 导入导出 优化_mysql数据导入导出与数据表优化
一.数据导入 mysqlimport -uroot oa d:/aa.txt --fields-terminated-by=, --fields-optionally-enclosed-by= --l ...
- discuz mysql data_终于找到Discuz! Database Error终极解决办法了!
本帖最后由 FU81 于 2014-8-27 02:32 编辑 Discuz! Database Error (2003) notconnect PHP Debug No. File ...
- mysql禁止自动优化_MySQL必须调整的10项配置优化
即使是经验老道的人也会犯错,会引起很多麻烦.所以在盲目的运用这些推荐之前,请记住下面的内容: 一次只改变一个设置!这是测试改变是否有益的唯一方法. 大多数配置能在运行时使用SET GLOBAL改变.这 ...
- mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略
存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...
- mysql+索引优化+查询优化+存储优化_mysql利用覆盖索引避免回表优化查询
前言 说到覆盖索引之前,先要了解它的数据结构:B+树. 先建个表演示(为了简单,id按顺序建): id name 1 aa 3 kl 5 op 8 aa 10 kk 11 kl 14 jk 16 ml ...
- mysql order by rand 优化_mysql order by与by rand() 的优化经验
介绍下MySQL中的order by语句. 几种order by的情况 从最简单的case开始看起. 用这个表来说明:(10w行数据) 1. 最简单的order ―― order by索引字段 从e ...
- node php v2ex,一个仿V2EX的开源二次元论坛程序:Vmoex安装教程
说明:V2ex的开源二次元向的社区程序,使用的php框架symfony3.4版本,支持markdown,主要为动漫.二次元.番剧的(还有萌萌哒的(●´ω`●)φ)爱好者打造.由于作者的安装教程对新手有 ...
最新文章
- 读取list java_java 分批次读取java.util.List 数据
- vue导入非es6 js文件_Vue项目兼容IE11
- 多选Select排序
- Codeforces Round #192 (Div. 2)
- android服务下载,android服务之bindService和unService中下载任务中的应用
- Android无法优化应用,Android应用优化总结
- 叠置分析(涉及结果属性和输入图层属性的关系)
- java log info乱码_跟光磊学Java开发-Java开发常用API的使用
- bat 一键清理系统垃圾的修改
- VC调用3dmax自动化对象
- 词法分析之LED文件生成程序【调试中......】
- Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率设置固定的学习率,分层设置学习率
- 跨时钟域问题(二)(单bit信号跨时钟域 1. 电平同步器 2. 边沿同步器 3. 脉冲检测器)
- 微信小程序+微信管理后台+微信用户前台
- 虚拟主机能建立mysql数据库吗_虚拟主机如何创建数据库
- VR实时语音,带着最好的武器去战斗
- 头歌平台(EduCoder)—— Matplotlib接口和常用图形
- 基于Hmm模型和Viterbi算法的中文分词和词性标注
- w ndoWs10开机时间长,Windows10开机速度变慢,用这5个小妙招,让电脑开机提速
- java | (二十七) JSP(1)指令,隐式对象,动作,标签,EL表达式
热门文章
- php饶disfunction,Insomni’hack CTF-l33t-hoster复现分析
- NBA 的训练黑科技,CBA 也可以试试
- python分箱_特征工程 - 分箱
- gradle 编译忽略警告
- 什么是缓存?Mybaits一级缓存和二级缓存分别是什么,区别是什么?缓存和缓冲区的区别是什么?
- Zynq Qspi控制器应用笔记
- 倚天屠龙记君临天下JavaScript
- css中overflow、overflow-x、overflow-y使用
- xmodem java_[转]JAVA实现CRC-CCITT(XMODEM)算法
- 2021年电工(技师)报名考试及电工(技师)复审考试