2024年12月20日2024年12月24日教程大全InnoDB,MYSQL,wordpress,WordPress优化
教程总目录:WordPress速度优化菜鸟实用版
本文是以宝塔Linux面板为例写的,网站环境是Nginx+MySQL+PHP。这里介绍下我安装好这些环境后会做的一些设置。
nginx我们不需要对其做什么优化了,即便您网站每天10万IP访问,nginx也不会成为您的性能瓶颈。初始安装完MySQL后我们需要对他的参数做一部分调整。
提示:如果根据下面我的设置,您的MySQL运行出现了问题。就恢复成宝塔面板的默认设置。
本文目录
- 1. 1.关闭二进制日志
- 2. 2.调整MySQL参数
- 2.1. 索引缓存大小key_buffer_size
- 2.2. 查询缓存query_cache_size
- 2.3. 临时表缓存tmp_table_size
- 2.4. InnoDB索引缓存池 innodb_buffer_pool_size
- 2.5. InnoDB日志缓存innodb_log_buffer_size
- 2.6. 线程排序缓存sort_buffer_size
- 2.7. 读入缓存read_buffer_size
- 2.8. 随机读缓存read_rnd_buffer_size
- 2.9. 关联表缓存join_buffer_size
- 2.10. 线程堆栈大小thread_stack
- 2.11. 二进制日志缓存binlog_cache_size
- 2.12. 线程缓存大小thread_cache_size
- 2.13. 打开表的缓存table_open_cache
- 2.14. 其它设置项
- 3. 实际效果
1.关闭二进制日志
MySQL默认的二进制日志会记录我们数据库每一次的修改操作,使用时间久一些会产生非常庞大的日志文件。
这个二进制日志文件可以用来恢复丢失的数据库文件。如果您不是专业的DBA或者运维人员,基本使用不到它。我更建议您做一个数据库的定时或实时的异地备份。
2.调整MySQL参数
宝塔面板默认有一些性能参数设置,需要我们手动选择。具体参数多少合适需要根据您自身的业务来决定,一般可以参考宝塔面板MySQL当前状态页面来决定。
我们在修改参数时,需要先确认现在MySQL的状态后再确定要着重提高哪些参数!
假设服务器是4核4G的数据库专用配置(配置不代表实际性能水平)。
先将宝塔默认优化方案点到4-8GB。
索引缓存大小key_buffer_size
key_buffer_size用于缓存MyISAM表的索引块,这个决定了索引的速度。在大容量和高并发场景下可以显著提高数据库性能。
如果您的总内存不足,则key_buffer_size的参数也不建议过大,否则系统可能调用磁盘创建的虚拟内存,导致性能降低。需要综合其它MySQL参数设置,一般是不高于50%的总内存。
show global status like 'key_read%';
查看Key_read_requests和Key_reads的值。Key_read_requests是总索引读请求,Key_reads是未缓存的从磁盘读取的索引读请求。
key_reads / key_read_requests 的值应该在 ≈0.1% 以下最好。
如果您内存比较大,则可以适当增大key_buffer_size的值,具体的设置请参照上面索引请求比例来决定。
key_buffer_size只对MyISAM表起作用!
在本系列优化教程是推荐数据库使用 InnoDB 引擎的,所以对于key_buffer_size推荐设置为16-32MB的值,用于给磁盘临时表索引使用。
查询缓存query_cache_size
query_cache_size用于缓存查询的结果,当查询命中缓存时,会立即返回结果,跳过解析优化和执行的阶段。
查询缓存会自动跟踪查询中涉及的表,如果表发生变化,那么所有跟该表相关的缓存会自动失效。
query_cache_size的值不宜设置过大,如果该值设置的比较大,并且里面缓存了很多查询结果。当缓存失效时会长时间的持有这个全局锁,可能会导致系统僵死。
query_cache_size开启后会导致额外的资源消耗:
1.所有查询都会先检查是否命中缓存。
2.查询结果前会先进行写缓存操作,然后在返回本次查询结果。
query_cache_size的值必须是1024的整数倍,单位为字节。在宝塔面板中该值默认是MB单位,所以我们可以任意设置整数的值。
因为我们数据库要使用 InnoDB 一些事务特性会限制查询缓存的使用,可能会严重降低查询缓存的命中率。所以个人推荐将query_cache_size设为0不开启。
临时表缓存tmp_table_size
临时表的大小实际上由由 tmp_table_size 和 max_heap_table_size 的值中最小的一个来决定。
show global status like 'Created_tmp_tables';
此命令查看已创建内存中临时表的数量。
show global status like 'Created_tmp_disk_tables';
此命令可以查看磁盘上创建临时表的数量。如果在磁盘上创建临时表数量一直在增加可以适当增大tmp_table_size的值。
在宝塔面板中当我们修改tmp_table_size时,默认max_heap_table_size会同步修改一样的值。此参数可以根据您的实际内存使用宝塔面板的默认值。
InnoDB索引缓存池 innodb_buffer_pool_size
这个是MySQL的InnoDB存储引擎的缓存,这个缓存在物理内存80%内都是合理的情况。
所以我们可以尽可能的增大这一项的参数!
InnoDB日志缓存innodb_log_buffer_size
此项设置定义了InnoDB写入磁盘上的日志缓存大小,此值设置大一些可以降低对磁盘IO的使用。如果此值过小,会触发数据库检查点明显降低数据库性能。
这一项我们可以设置64MB。
线程排序缓存sort_buffer_size
此项设置过大后如果数据库出现高并发请求,可能会耗尽服务器资源。
这里使用宝塔4G内存默认值1024KB。
读入缓存read_buffer_size
这一项跟上面一样不需要修改,使用宝塔4G内存默认值1024KB。
随机读缓存read_rnd_buffer_size
这一项和上面的读入缓存设置一样的参数1024KB。
关联表缓存join_buffer_size
join_buffer_size用于类型为普通的索引扫,范围扫和全表扫的连接缓存。这一项可以设置为512KB,如果您的内存比较大,可以适当提高到8MB或16MB。
此值过大在高并发场景同样会消耗很多服务器资源。
线程堆栈大小thread_stack
设置为4K的倍数。这一项不宜过大或过小。
如果内存不足可以适当降低,如果线程崩溃或是有复杂的查询请求可以适当增加。我们使用宝塔4G内存的默认值256KB。
每个线程堆栈大小 x 线程数量 就是总的内存消耗,如果过大可能会导致内存不足。
二进制日志缓存binlog_cache_size
设置为4K的倍数。此项不宜过大或过小,太大会造成内存占用过多,太小了会导致使用磁盘作为缓存影响速度。使用命令查看状态判断设置大小
show global status like '%Binlog_cache%_use%';
在输出结果中
Binlog_cache_disk_use 表示使用了磁盘的binlog缓存次数
Binlog_cache_use 表示使用了binlog缓存的次数
如果Binlog_cache_disk_use值比较大就上调binlog_cache_size参数,如果是0或者其他比较小的值,就可以下调binlog_cache_size参数节约内存。
这个值如果要准确设置,可以通过解析二进制日志事务大小,能保证99.9事务容纳。默认我们可以设置为128KB。
线程缓存大小thread_cache_size
用来缓存空闲的线程,如果需要建立新的连接时,会优先调起缓存中的空闲线程。提高线程响应速度。这个值一般是跟threads_connected(当前线程数)一样的大小。
使用命令查看状态判断是否需要增加或减小
show global status like 'Threads_%';
我们可以看到这四个状态值
Threads_cached : 当前线程池中缓存有多少个空闲线程
Threads_connected : 当前的线程数
Threads_created : 已创建的线程数
Threads_running : 当前激活的线程数 ( Threads_connected 中的线程有些可能处于休眠状态 )
如果空闲线程降低,当前线程数不降低,已创建线程数升高的话,我们就增加thread_cache_size线程缓存的值。
打开表的缓存table_open_cache
当MySQL打开一个表时会读入一些数据到table_open_cache里,如果MySQL在table_open_cache找不到数据就会到磁盘去读取数据。
但,这个参数不宜过大或过小。小了会显著降低性能,大了不会提高甚至会略微降低性能。
官方给的建议是
threads * N = table_open_cache
threads是连接数,N是每次链接查询表的数量。N我们只能根据实际环境来预估。
一般是在MySQL高峰期查看open_tables(当前打开表数量) 和 opened_tables(已打开表数量) 判断调整table_open_cache(表缓存)参数。
show global status like 'Open%tables';
如果open_tables(打开表数量)等于table_open_cache(打开表的缓存),并且opened_tables(已打开表数量)不断增加。如果不是业务突发增加,或是SQL执行速度慢,导致释放速度慢的话。就需要增大table_open_cache参数了。
同时table_open_cache的调整和open_file_limit是联动的,调整一个也需要调另一个。
open_files_limit= Table_open_cache*2
你也可以通过max_connections*5=open_files_limit这个值来确定Table_open_cache的值。
所以说这里table_open_cache我建议你用宝塔4G内存默认的384,或是适当调大。
其它设置项
下面的设置需要在配置文件进行修改。
innodb_data_file_path:默认10M改成256M, ibdata1:256M:autoextend
innodb_flush_log_at_trx_commit:此项默认为1,每次事务指令会把日志写入磁盘。设为2会写入系统缓存,然后每秒刷新到磁盘。
安全上讲可以设为2,如果追求速度可以将值设为0!
实际效果
MySQL参考手册:https://dev.mysql.com/doc/