站点图标 it168资讯网

WordPress深度加速-OpenLiteSpeed环境下的WordPress数据库优化设置详细教程

WordPress深度加速-OpenLiteSpeed环境下的WordPress数据库优化设置详细教程
WordPress深度加速-OpenLiteSpeed环境下的WordPress数据库优化设置详细教程插图

对于WordPress来说,需要优化的地方非常多,从前端到后端有非常多的优化手段,比如安装WordPress的优化缓存加速插件,但是有时候数据量一大,最终都是感觉很卡,该做的优化步骤都做了,那如何解决呢?这个时候,我们就可以进行WordPress的深度优化加速了,也就是WordPress数据库优化设置。前端优化加速插件的应用等这里IT168资讯就不多说,毕竟网上教程很多,IT168资讯专门介绍一下WordPress的数据库如何优化加速。这里分享优化设置的详细教程。

服务器环境:

OpenLiteSpeed 1.6.18
PHP 7.4
MariaDB 10.5
WordPress 5.6
CyberPanel 2.0.3

一、WordPress数据库的优化方向

因为WordPress的数据库一般是MySQL或者MariaDB(MariaDB是MySQL的一个分支,完全兼容MySQL),而我们要优化数据库的最终目的是让WordPress的页面访问速度更快,而WordPress的架构导致每打开一个页面,均要进行数据库的查询,查询次数越多,则页面访问速度越慢。这里我们的WordPress数据库的优化方向则为减少数据库的查询次数,从而达到WordPress的优化加速作用。

减少数据库的查询次数的方法主要有几个:

1、直接修改WordPress主题模板,尽量减少数据库及PHP调用次数
2、开启数据库查询缓存
3、设置数据库索引缓存

接下来IT168资讯就针对这三个方向进行相应的优化。

二、开启数据库查询次数及时间显示

在这之前,IT168资讯先分享一下如何开启数据库查询次数及时间显示。

将如下代码放到自己的WordPress主题模板内的footer.php 里既可。

本页加载数据库查询次,加载用时:秒

一般都加在最底部的

前即可。根据自己实际位置需要进行调整。这样保存后就可以直接显示每个页面的数据库查询次数及相应的加载时间显示了。

注意:如果开启了缓存插件,比如IT168资讯开启了LiteSpeed Cache插件,则只会在第一次加载时显示查询次数,然后就页面就直接被缓存了,再次加载也不会变化,因此如果要调试的话,可以先暂时关闭缓存插件。

三、修改WordPress主题模板

一般我们安装了各类的WordPress主题模板,在模板中会大量的调用相应的数据库字段及PHP调用。我们首先要减少因为主题和其他一些不必要的数据库查询。

打开WordPress 根目录下的 wp-config.php 文件,在后面加入如下的代码,然后保存,刷新自己的缓存。

define('COOKIE_DOMAIN', 'www.banzhuti.com');
//设置地址而不是服务器检查,这将减少服务器查询
define('WP_HOME', 'https://www.banzhuti.com');
define('WP_SITEURL', 'https://www.banzhuti.com');
//优化文章修改历史:Post-Revisioning
define('AUTOSAVE_INTERVAL', 120);// 修改 WordPress 编辑器自动保存时间间隔为 120 秒保存一次
define('WP_POST_REVISIONS', 5);//仅保留保留 5 个最近修改,也可以减小此数字,但不能太低了
define('EMPTY_TRASH_DAYS', 7 );//7 天后自动清空回收站,这个自己根据情况设定
define( 'CORE_UPGRADE_SKIP_NEW_BUNDLED', true );//更新时跳过 wp-content 目录,增加更新效率

以上IT168资讯都做了注释了,如需使用则可以将相应的域名改为自己的域名,相应的主题改为自己的对应主题名称即可。比如第一条,由于很多原因你需要给站点指定 cookies 域。比较常见的就是阻止子域名上请求静态内容的 cookies 不必要的传输。这种情况下,你就可以使用此定义告知 WordPress 只向非静态域发送 cookies,这将会大大提高网站的性能。

四、设置数据库查询缓存及索引

一旦数据库比较大的话,开启数据库查询缓存,可以大幅降低CPU的使用,从而实现网站访问响应更快的效果。目前MySQL及MariaDB的数据库都支持查询缓存。

1、什么是MySQL查询缓存

MySQL查询缓存是MySQL中比较独特的一个缓存区域,用来缓存特定Query的整个结果集信息,且共享给所有客户端。为了提高完全相同的Query语句的响应速度,MySQL Server会对查询语句进行Hash计算后,把得到的hash值与Query查询的结果集对应存放在Query Cache中。当MySQL Server打开Query Cache之后,MySQL Server会对接收到的每一个SELECT 语句通过特定的Hash算法计算该Query的Hash值,然后通过该hashi值到Query Cache中去匹配。

目前MySQL Query Cache只会cache select语句,其他类似show ,use的语句不会被cache MySQL 的每个Query Cache都是以SQL文本作为key来存储的,在应用Query Cache之前,SQL文本不会做任何处理。也就是说,两个SQL语句,只要相差哪怕一个字符(例如大小写不一样,多一个空格,多注释),那么这两个SQL将使用不同的Cache地址。如: 下面三条SQL将会被存储在三个不同的缓存里,虽然他们的结果都是一样的。select * FROM people where name='surfchen'; select * FROM people where /*hey~*/ name='surfchen'; SELECT * FROM people where name='surfchen';

2、MySQL缓存机制

ySQL缓存机制简单的说就是缓存sql文本及查询结果,如果运行相同的SQL,服务器直接从缓存中取到结果,而不需要再去解析和执行SQL。如果表更改了,那么使用这个表的所有缓存查询将不再有效,查询缓存中值相关条目被清空。这里的更改指的是表中任何数据或是结构发生改变,包括INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE等,也包括那些映射到改变了的表使用MERGE表的查询。显然,这对于频繁更新的表,查询缓存是不适合的,而对于一些不常改变数据且有大量相同SQL查询的表,查询缓存会节约很大的性能。

查询必须是完全相同(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。

需要注意的是MySQL Query Cache 是对大小写敏感的,因为Query Cache 在内存中是以 HASH 结构来进行映射,HASH 算法基础就是组成 SQL 语句的字符,所以 任何SQL语句的改变重新cache.

2.1 缓存规则

2.2 缓存失效

2.3 手动清理缓存手动清理缓存可以使用下面三个SQL

2.4 缓存机制中的内存管理

MySQL Query Cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 用来存储类型、大小、数据等信息;一个result set的cache通过链表把这些block串起来。block最短长度为query_cache_min_res_unit。

当服务器启动的时候,会初始化缓存需要的内存,是一个完整的空闲块。当查询结果需要缓存的时候,先从空闲块中申请一个数据块为参数query_cache_min_res_unit配置的空间,即使缓存数据很小,申请数据块也是这个,因为查询开始返回结果的时候就分配空间,此时无法预知结果多大。

分配内存块需要先锁住空间块,所以操作很慢,MySQL会尽量避免这个操作,选择尽可能小的内存块,如果不够,继续申请,如果存储完时有空余则释放多余的。

但是如果并发的操作,余下的需要回收的空间很小,小于query_cache_min_res_unit,不能再次被使用,就会产生碎片。如图:

3、查询缓存(Query Cache)

  1. SQL语句
  2. 查询缓存
  3. 解析器
  4. 解析树
  5. 预处理
  6. 查找最好的查询路径
  7. 查询优化SQL语句
  8. 执行计划
  9. API调用存储引擎
  10. 调用数据,返回结果缓存SELECT操作或预处理查询的结果集和SQL语句,当有新的SELECT语句或预处理查询语句请求,先去查询缓存,判断是否存在可用的记录集,判断标准:与缓存的SQL语句,是否完全一样,区分大小写。不需要对SQL语句做任何解析和执行,当然语法解析必须通过在先,直接从Query Cache中获得查询结果,提高查询性能查询缓存的判断规则,不够智能,也即提高了查询缓存的使用门槛,降低其效率;查询缓存的使用,会增加检查和清理Query Cache中记录集的开销

哪些查询可能不会被缓存:

查询缓存相关的服务器变量:

优化查询缓存:

查询缓存相关的状态变量:

4、MySQL Query Cache对性能的影响

如上图所示: 在MySQL Server中打开Query Cache对数据库的读和写都会带来额外的消耗:

MySQL Query Cache碎片优化

如上图所示, 没有什么办法能够完全避免碎片,但是选择合适的query_cache_min_res_unit可以帮你减少由碎片导致的内存空间浪费。这个值太小,则浪费的空间更少,但是会导致频繁的内存块申请操作;如果设置得太大,那么碎片会很多。调整合适的值其实是在平衡内存浪费和CPU消耗。可以通过内存实际消耗(query_cache_size - Qcache_free_memory)除以Qcache_queries_in_cahce计算单个查询的平均缓存大小。可以通过Qcahce_free_blocks来观察碎片。

通过FLUSH_QUERY_CAHCE完成碎片整理,这个命令将所有的查询缓存重新排序,并将所有的空闲空间都聚焦到查询缓存的一块区域上。

5、数据库索引

索引是特殊数据结构:定义在查找时作为查找条件的字段,索引实现在存储引擎。

1、索引类型:

2、高性能索引策略:

3、索引的优化建议

6、开启数据库查询缓存及索引

说了这么多,那么如何开启数据库查询缓存呢。其实很简单,一般MySQL数据库,找到my.cnf文件。

一般登陆服务器后,输入如下代码:

vi /etc/my.cnf

打开后,找到如下的代码,进行编辑:

query_cache_size = 20M
query_cache_type = ON

query_cache_size = 20M的意思表示查询缓存的大小设置,query_cache_type = ON的意思表示开启查询缓存

注意:键盘点击 I 后就可以编辑,编辑后先按 esc 退出键,然后输入 :wq 回车即可保存。

如果是MariaDB数据库,那问题来了,my.cnf文件里面什么都没有,如下图

其实里面代码有包含my.cnf.d文件夹下的相应cnf文件配置,但是就算进入了my.cnf.d文件夹,分别打开里面的文件,都没有相应的配置可以进行更改。这个时候怎么办?

不用担心,因为MariaDB数据库如果没有进行设置,则自动取默认配置。这个我们不用管,其实我们可以直接在my.cnf文件里增加代码即可。

[mysqld]
skip-external-locking
query_cache_size = 20M
query_cache_type = ON
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
max_connections = 256

以上的代码解释如下:

[mysqld]
skip-external-locking
#避免 MySQL 的外部锁定,减少出错几率增强稳定性。

key_buffer_size = 16M
#指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。16M适用于 512MB内存,对于内存在4GB左右的服务器该参数可设置为256M,依此类推即可。注意:该参数值设置的过大反而会是服务器整体效率降低!

max_allowed_packet = 1M
#MySQL 根据此配置会限制 server 接受的数据包大小。

table_open_cache = 64
#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。注意,不能盲目地把table_open_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
64 适用于 512MB 内存,1GB 内存则可以设置成 128,依此类推即可。

sort_buffer_size = 512K
#查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占,如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 512K = 50MB。
512K 适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。

net_buffer_length = 8K
#初始化server 接受的数据包大小,当需要的时候再由 max_allowed_packet 控制增长的大小。注意:该参数值设置的范围只能为1 – 1024K。

read_buffer_size = 256K
#读查询操作所能使用的缓冲区大小。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
256K 适用于 512MB 内存,1GB 内存则可以设置成 512K,依此类推即可。

read_rnd_buffer_size = 512K
#查询操作多表所能使用的缓冲区大小。设置较大的值可以有效提升 ORDER BY 的性能。和 sort_buffer_size 一样,该参数对应的分配内存也是每连接独享。
512K适用于 512MB 内存,1GB 内存则可以设置成 1M,依此类推即可。

myisam_sort_buffer_size = 8M
#MyISAM 排序所能使用的缓冲区大小。
8M 适用于 512MB 内存,1GB 内存则可以设置成 16M,依此类推即可。

max_connections = 256
#指定MySQL允许的最大连接进程数。如果在访问时经常出现 Too Many Connections 的错误提示,则需要增大该参数值。
注意:该参数默认值为 151,最大可以设置为 100000
这里建议设置成内存的一半,比如 512MB 内存就设置成 256,依此类推。

以上设置完后,记得重启数据库让其生效。重启数据库命令如下:

systemctl restart mysqld.service

7、查询缓存是否启用生效

以上设置好后,如何知道是否生效呢?这里以MariaDB数据库为例,我们需要登陆数据库进行操作。IT168资讯的是CyberPanel面板,因此首先要了解相应的数据库登陆密码。

输入如下命令获取数据库密码:

cat /etc/cyberpanel/mysqlPassword

其中红色框里面的就是对应的数据库登陆密码。

然后输入命令进行登陆

mysql -u root -p

然后要求输入密码,这个时候将对应的密码输入,回车即可登陆相应的数据库。

输入命令查询

show variables like '%query_cache%';

其中query_cache_type:NO代表已经开启查询缓存

再输入命令查询缓存的命中率

show status like 'qcache%';  

其实以上的各种设置,仅供参考,各位可以根据自己的实际情况进行增减和修改。

五、利用数据库工具检测进行优化

以上IT168资讯也只列了一部分可以优化的数据库内容,但是如何设置相应的值,很多小伙伴也不是很明白。这个时候我们可以借助一个免费的数据库检测优化工具来帮助我们。

这个工具就是mysqltuner,它支持MySQL和MariaDB数据库。

先下载数据库测试工具

wget http://mysqltuner.pl/ -O mysqltuner.pl

下载完成后,输入如下指令进行检测:

perl mysqltuner.pl

然后又要再分别输入数据库的用户名和密码,用户名填:root ,密码继续用上面的方法获取,然后输入。

接下来会生成一大堆的检测报告,这个时候我们可以看到最下面的性能优化建议。如类似这样的:

*** Add RAM before increasing MySQL buffer variables ***
    performance_schema = ON enable PFS
    innodb_log_file_size should be (=64M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.

其中的意思performance_schema = ON建议开启,innodb_log_file_size的大小值建议至少需要64M。我们只需将对应的建议在my.cnf中添加和修改即可。

比如将innodb_log_file_size=64M加入my.cnf文件里。如果之前有则直接修改。

六、数据库优化总结

其实通过以上的数据库优化后,站点的速度能有一定的提升。但是每个网站的流量、架构、主题、插件各方面都不一样,需要在后面的过程中不断的优化和调整,才能直接满足WordPress的实际站点的使用。因此建议不断调优。

其实还有一个很大的争议点,就是数据库查询缓存的启用和禁用。本篇文章虽然介绍了开启数据库查询缓存的方法及优化设置,但是网上的结论分为开启和禁用两各派系。到底开启后对性能的提升有多大,是利大于弊还是弊大于利,各位小伙伴自己可以尝试。

这里IT168资讯给个开启还是关闭数据库查询缓存的建议:如果是BBS论坛,或者商城等互动频繁,写入数据更新快的站点,禁用查询缓存最佳。如果是WordPress站点,更新不频繁,比如2-3天更新一次甚至更长,那么建议开启查询缓存。如果是每天都更新,一次更新几十上百篇的WordPress站点,建议禁用。

最终实际体验,还是自己去测试吧。

原文链接:IT168资讯 » WordPress深度加速-OpenLiteSpeed环境下的WordPress数据库优化设置详细教程

退出移动版