我有一个 2 核 Mysql 服务器,25 GB 内存,1 TB 硬盘驱动器在 Windows 服务器上运行。什么是正确的配置?

Mik*_*ter 0 mysql configuration

我在运行企业数据库服务器方面相对较新,作为一名开发人员,我习惯于在默认设置下运行我的数据库,更专注于代码。现在,我发现在企业级别的数据库配置不正确,至少有 2,000 个用户,每天生成超过 1000 张票。

我应该如何配置我的数据库服务器?我阅读了这篇文章https://medium.com/@richb_/tuning-mysql-3-simple-tweaks-6356768f9b90不知何故,我在获取 innodb_buffer_pool_instances 等的过程中迷失了方向。

以下是我目前的配置:

https://pastebin.com/1TaKpRaB -> my.cnf

https://pastebin.com/pWF6SV6W -> 显示变量;

https://pastebin.com/CnwiWmx6 -> 显示全局状态;

Ric*_*mes 5

innodb_buffer_pool_size = 14G; 在遇到问题之前不要打扰任何其他调整。

如果,按每天 1000 张票,您的意思是每天有几千次查询,那么,那是“微不足道的”。即使每分钟几千个查询也不是很多。

进一步分析...

观察:

  • 版本:5.6.32-log
  • 25 GB 内存
  • 正常运行时间 = 22:16:52; 一些 GLOBAL STATUS 值可能还没有意义。
  • 您正在 Windows 上运行。
  • 运行 64 位版本
  • 您似乎完全(或大部分)在运行 InnoDB。

更重要的问题:

1700 qps,不是每天查询!所以VARIABLESSTATUS都值得研究。

innodb_buffer_pool_size = 14G 因为目前比数据集大得多。)另外 innodb_buffer_pool_instances = 14

Com_rollback相当高(3.7/秒);您是否故意运行需要撤消的事情?他们能否更快地检查,从而避免可能代价高昂的回滚? Com_rollback并且Com_commit价值惊人地接近。听起来很腥。

下一次升级可能会吐槽你innodb_additional_mem_pool_size,这是未使用和弃用的。从 my.cnf 中删除它。

myisam_sort_buffer_size = 500M (当前的 3G 可能会导致您耗尽 RAM。)

tmp_table_sizemax_heap_table_size一起工作。前者危险地高;后者可能太小了。将两者都设置为 200M。

(通常我建议不要使用查询缓存。但是,您的应用程序似乎很好地利用了它。)

Created_tmp_disk_tables相当高。这和其他一些线索表明查询效率低下。见对寻找慢查询,并提出他们批判的细节。

由于您在Windows上运行,我认为thread_cache_size应该设置为0。

细节和其他观察:

( Key_blocks_used * 1024 / key_buffer_size ) = 1,192 * 1024 / 8M = 14.6%-- 使用的 key_buffer 的百分比。高水位。-- 降低 key_buffer_size 以避免不必要的内存使用。

( innodb_buffer_pool_size / _ram ) = 20480M / 25600M = 80.0% -- 用于 InnoDB buffer_pool 的 RAM 百分比

( innodb_buffer_pool_instances ) = 20 -- 对于大内存,可以考虑使用1-16个缓冲池实例,每个实例不能少于1GB

( Innodb_buffer_pool_pages_free * 16384 / innodb_buffer_pool_size ) = 1,107,476 * 16384 / 20480M = 84.5%-- 缓冲池空闲 -- buffer_pool_size 大于工作集;可以减少它

( Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total ) = 1,107,476 / 1310720 = 84.5% -- 当前未使用的 buffer_pool 的百分比 -- innodb_buffer_pool_size 是否大于必要?

( Innodb_buffer_pool_bytes_data / innodb_buffer_pool_size ) = 3,195,551,744 / 20480M = 14.9%-- 数据占用缓冲池的百分比 -- 很小的百分比可能表明 buffer_pool 不必要地大。

( Innodb_os_log_written / (Uptime / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 1,081,532,416 / (80212 / 3600) / 2 / 2048M = 0.0113 -- 比率 -- (见分钟)

( Uptime / 60 * innodb_log_file_size / Innodb_os_log_written ) = 80,212 / 60 * 2048M / 1081532416 = 2,654-- InnoDB 日志轮换之间的分钟数从 5.6.8 开始,可以动态更改;一定也要更改my.cnf。--(轮换间隔60分钟的建议有点武断。)调整innodb_log_file_size。(无法在 AWS 中更改。)

( Com_rollback ) = 295,694 / 80212 = 3.7 /sec-- InnoDB 中的回滚。-- 回滚频率过高可能表明应用逻辑效率低下。

( innodb_additional_mem_pool_size ) = 32M -- (在 5.6.3 中不推荐使用,在 5.7.4 中删除。) -- 不需要很高的值。

( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = OFF-- 是否记录所有死锁。-- 如果您受到死锁的困扰,请打开它。注意:如果您有很多死锁,这可能会向磁盘写入大量内容。

( join_buffer_size / _ram ) = 262,144 / 25600M = 0.00%-- 每个线程 0-N。可能会加速 JOIN(更好地修复查询/索引)(所有引擎)用于索引扫描、范围索引扫描、全表扫描、每个完整 JOIN 等。 -- 如果很大,请减小 join_buffer_size 以避免内存压力。建议小于 1% 的 RAM。如果较小,则增加到 0.01% 的 RAM 以改进某些查询。

( myisam_sort_buffer_size / _ram ) = 3072M / 25600M = 12.0%-- 用于ALTER, CREATE INDEX, OPTIMIZE, LOAD DATA; 需要时设置。也用于 MyISAM 的维修表。-- 减少 myisam_sort_buffer_size 以防止耗尽 RAM。

( query_prealloc_size / _ram ) = 8,192 / 25600M = 0.00%-- 用于解析。占 RAM 的百分比

( query_alloc_block_size / _ram ) = 8,192 / 25600M = 0.00%-- 用于解析。占 RAM 的百分比

( net_buffer_length / max_allowed_packet ) = 16,384 / 256M = 0.01%

( local_infile ) = local_infile = ON -- local_infile = ON 是一个潜在的安全问题

( Qcache_inserts - Qcache_queries_in_cache ) = (9257553 - 3004) / 80212 = 115 /sec -- 无效次数/秒。

( Created_tmp_disk_tables ) = 597,469 / 80212 = 7.4 /sec-- 创建磁盘“临时”表作为复杂 SELECT 的一部分的频率-- 增加 tmp_table_size 和 max_heap_table_size。检查何时使用 MEMORY 而不是 MyISAM 的临时表规则。也许小的架构或查询更改可以避免 MyISAM。更好的索引和查询的重新制定更有可能有所帮助。

( Created_tmp_disk_tables / Created_tmp_tables ) = 597,469 / 614226 = 97.3%-- 溢出到磁盘的临时表的百分比 -- 也许增加 tmp_table_size 和 max_heap_table_size;改善指标;避免斑点等。

( tmp_table_size ) = 853M-- 限制用于支持 SELECT的MEMORY临时表的大小-- 减小 tmp_table_size 以避免耗尽 RAM。也许不超过64M。

( Com_rollback / Com_commit ) = 295,694 / 298826 = 99.0%-- Rollback : Commit ratio -- 回滚代价高昂;改变应用逻辑

( Select_scan ) = 98,730 / 80212 = 1.2 /sec -- 全表扫描 -- 添加索引/优化查询(除非它们是小表)

( innodb_autoinc_lock_mode ) = 1-- Galera: 欲望 2 -- 2 = "交错"; 1 =“连续”是典型的;0 =“传统”。

( long_query_time ) = 10-- 定义“慢”查询的截止(秒)。-- 建议 2

( Threads_created / Connections ) = 322 / 1160 = 27.8% -- 进程创建速度 -- 增加 thread_cache_size (non-Windows)

异常大:

Com_show_keys = 0.063 /sec
Com_show_plugins = 0.27 /HR
Innodb_buffer_pool_pages_free = 1.11e+6
Qcache_hits = 1529 /sec
Select_range = 35 /sec
Select_range / Com_select = 23.2%
Sort_range = 36 /sec
myisam_sort_buffer_size = 3072MB
Run Code Online (Sandbox Code Playgroud)