本文共 6399 字,大约阅读时间需要 21 分钟。
缓冲池内存大小(innodb_buffer_pool_size
)决定了InnoDB能够缓存多少数据页。默认值为128M,但可以根据实际内存情况进行调整。建议将缓冲池大小设置为物理内存的60%-80%。以下是操作步骤:
mysql> SHOW VARIABLES LIKE '%innodb_buffer_pool_size%';+-------------------------+-----------+| Variable_name | Value |+-------------------------+-----------+| innodb_buffer_pool_size | 134217728 |+-------------------------+-----------+
mysql> SET GLOBAL innodb_buffer_pool_size = 268435456; -- 256MQuery OK, 0 rows affected (0.10 sec)
mysql> SHOW STATUS LIKE 'InnoDB_buffer_pool_resize_status';+----------------------------------+ ----------------------------------------------------------------------| Variable_name | Value |+----------------------------------+ ----------------------------------------------------------------------| Innodb_buffer_pool_resize_status | Size did not change (old size = new size = 268435456. Nothing to do. |+----------------------------------+ ----------------------------------------------------------------------
在内存较大(GB级别)时,可以将一个Buffer Pool分割为多个实例,以降低读写冲突,提高并发性。innodb_buffer_pool_instances
参数控制实例数量,默认为1,最大可调整至64。
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_instances';+-------------------------------+-------+| Variable_name | Value |+-------------------------------+-------+| innodb_buffer_pool_instances | 1 |+-------------------------------+-------+
缓冲池块大小(innodb_buffer_pool_chunk_size
)决定了内存分配的最小单位。默认值为128M,可以根据需求调整。
mysql> SHOW VARIABLES LIKE 'innodb_buffer_pool_chunk_size';+-------------------------------+-----------+| Variable_name | Value |+-------------------------------+-----------+| innodb_buffer_pool_chunk_size | 134217728 |+-------------------------------+-----------+
通过分析缓存命中率评估当前配置是否合适。命中率计算公式:[ \text{命中率} = \frac{\text{innodb_buffer_pool_read_requests}}{\text{innodb_buffer_pool_read_requests + innodb_buffer_pool_reads}} \times 100 ]
mysql> SHOW STATUS LIKE 'innodb_buffer_pool_read%';+---------------------------------------+-------+| Variable_name | Value |+---------------------------------------+-------+| Innodb_buffer_pool_read_ahead_rnd | 0 || Innodb_buffer_pool_read_ahead | 0 || Innodb_buffer_pool_read_ahead_evicted | 0 || Innodb_buffer_pool_read_requests | 12701 || Innodb_buffer_pool_reads | 455 |+---------------------------------------+-------+
mysql> SELECT 12701 / (455 + 12701) * 100;+-----------------------------+ | 12701 / (455 + 12701) * 100 |+-----------------------------+ | 96.5415 |+-----------------------------+
mysql> SHOW VARIABLES LIKE '%innodb_page_size%';+------------------+-------+| Variable_name | Value |+------------------+-------+| innodb_page_size | 16384 |+------------------+-------+
mysql> SHOW GLOBAL STATUS LIKE '%innodb_buffer_pool_pages%';+----------------------------------+-------+| Variable_name | Value |+----------------------------------+-------+| Innodb_buffer_pool_pages_data | 515 || Innodb_buffer_pool_pages_dirty | 0 || Innodb_buffer_pool_pages_flushed | 334 || Innodb_buffer_pool_pages_free | 15868 || Innodb_buffer_pool_pages_misc | 0 || Innodb_buffer_pool_pages_total | 16383 |+----------------------------------+-------+
日志缓冲区大小(innodb_log_buffer_size
)默认为16M,适用于大部分情况。更大的缓冲区可以减少磁盘IO次数。
mysql> SHOW VARIABLES LIKE 'innodb_log_buffer_size';+------------------------+----------+| Variable_name | Value |+------------------------+----------+| innodb_log_buffer_size | 16777216 |+------------------------+----------+
mysql> SHOW VARIABLES LIKE 'innodb_log_files_in_group';+---------------------------+-------+| Variable_name | Value |+---------------------------+-------+| innodb_log_files_in_group | 2 |+---------------------------+-------+
mysql> SHOW VARIABLES LIKE 'innodb_log_file_size';+----------------------+----------+| Variable_name | Value |+----------------------+----------+| innodb_log_file_size | 50331648 |+----------------------+----------+
mysql> SHOW STATUS LIKE '%Qcache%';+-------------------------+---------+| Variable_name | Value |+-------------------------+---------+| Qcache_free_blocks | 1 || Qcache_free_memory | 1031832 || Qcache_hits | 0 || Qcache_inserts | 0 || Qcache_lowmem_prunes | 0 || Qcache_not_cached | 1 || Qcache_queries_in_cache | 0 || Qcache_total_blocks | 1 |+-------------------------+---------+
# my.ini中添加query_cache_size=128Mquery_cache_type=1
mysql> SHOW GLOBAL STATUS LIKE '%innodb_max_dirty_pages%';+---------------------+-------+| Variable_name | Value |+---------------------+-------+| Innodb_max_dirty_pages | 16384 |+---------------------+-------+
innodb_max_dirty_pages_pct
:默认75,可根据需求调整。innodb_io_capacity
:默认200,可根据磁盘性能调整。mysql> SHOW VARIABLES LIKE 'innodb_old_blocks_pct';+-----------------------+-------+| Variable_name | Value |+-----------------------+-------+| innodb_old_blocks_pct | 37 |+-----------------------+-------+
mysql> SHOW VARIABLES LIKE 'innodb_old_blocks_time';+------------------------+-------+| Variable_name | Value |+------------------------+-------+| innodb_old_blocks_time | 1000 |+------------------------+-------+
innodb_old_blocks_pct
值。innodb_old_blocks_time
值。查看Change Buffer状态:
-- 查看Change Buffer状态Ibuf: size 1, free list len 0, seg size 2, 0 mergesmerged operations:insert 0, delete mark 0, delete 0discarded operations:insert 0, delete mark 0, delete 0
查看Change Buffer最大大小:
mysql> SHOW VARIABLES LIKE 'innodb_change_buffer_max_size';+-------------------------------+-------+| Variable_name | Value |+-------------------------------+-------+| innodb_change_buffer_max_size | 25 |+-------------------------------+-------+
通过以上参数优化,可以显著提升InnoDB的性能表现。建议根据实际业务需求,逐步调整各项参数,并通过性能测试工具(如sysbench)进行基准测试,确保优化效果。
转载地址:http://bydfk.baihongyu.com/