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

Mysql入门MySQL针对Discuz论坛程序的基本优化教程,第1张

概述介绍《Mysql入门MySQL针对Discuz论坛程序的基本优化教程》开发教程,希望对您有用。

《MysqL入门MysqL针对discuz论坛程序的基本优化教程》要点:
本文介绍了MysqL入门MysqL针对discuz论坛程序的基本优化教程,希望对您有用。如果有疑问,可以联系我们。

MysqL学习过了这么久,discuz论坛的问题还是困扰着很多网友,其实从各论坛里看到的问题总结出来,很关键的一点都是因为没有将数据表引擎转成InnoDB导致的,discuz在并发稍微高一点的环境下就表现的非常糟糕,产生大量的锁等待,这时候如果把数据表引擎改成InnoDB的话,我相信会好很多.这次就写个扫盲贴吧.

MysqL学习1. 启用innodb引擎,并配置相关参数

MysqL学习#skip-innodb
MysqL学习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

MysqL学习修改表引擎为innodb:

MysqL学习MysqL> alter table cdb_access engine = innodb;

MysqL学习其他表类似上面,把表名换一下即可...
将表存储引擎改成innodb后,不仅可以避免大量的锁等待,还可以提升查询的效率,因为innodb会把data和index都放在buffer pool中,效率更高.

MysqL学习2.缓存优化
在 my.cnf 中添加/修改以下选项:

MysqL学习 #取消文件系统的外部锁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

MysqL学习以上参数根据各自服务器的配置差异进行调整,仅作为参考.

MysqL学习3.索引优化
上面提到了,已经开启了慢查询,那么接下来就要对慢查询进行逐个优化了.

MysqL学习搜索的查询sql大致如下:

MysqL学习 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;

MysqL学习用 EXPLAIN 分析的结果如下:

MysqL学习 MysqL>EXPLAIN SELECT t.* FROM cdb_posts p,80; 
MysqL学习+-----------+------------+----------+--------------+-------------+-----------+-------------+| 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| +----+-------------+-------+-------+---------------+------+---------+-------------+-------+---------

MysqL学习只用到了 t.fID 和 p.tID,而 p.author 则没有索引可用,总共需要扫描
66160*10 = 661600 次索引,够夸张吧 :(
再分析 cdb_threads 和 cdb_posts 的索引情况:

MysqL学习 MysqL>show index from cdb_posts; 
MysqL学习+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+--+| 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学习以及

MysqL学习 MysqL>show index from cdb_threads; 
MysqL学习+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+-----+| 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  |   | +-------------+------------+-----------+--------------+-------------+------

MysqL学习看到索引 fID 和 enablehot 基数太小,看来该索引完全没必要,不过,对于fID基数较大的情况,则可能需要保留>该索引.
所做修改如下:

MysqL学习 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`;

MysqL学习@R_419_7004@,p.author 字段我设定的部分索引长度是 10,是我经过分析后得出来的结果,不同的系统,这里的长度也不同,最好自己先取一下平均值,然后再适当调整.
现在,再来执行一次上面的慢查询,发现时间已经从 6s 变成 0.19s,提高了 30 倍.

总结

以上是内存溢出为你收集整理的Mysql入门MySQL针对Discuz论坛程序的基本优化教程全部内容,希望文章能够帮你解决Mysql入门MySQL针对Discuz论坛程序的基本优化教程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存