Perl read INI file

本文介绍了一种使用Perl语言解析INI配置文件的方法。通过提供的示例代码,展示了如何读取和解析INI文件,并将其内容组织成易于操作的数据结构。

工作中需要处理INI 配置文件,看了下同事写的脚本,处理的比较简单,只解析了需要的那部分,没有对其他部分做出处理,自己重新写了一个,可以把整个文件一次处理完毕,很简单,代码如下:

 

use warnings;
use Data::Dumper;

my $f = 'd:/project/SDI/params.config';
my (%dict,$this);

open FILE,"$f";
while(<FILE>){
    chomp;
    #解释行和空白行跳过不做处理
    if(/^/s*#/ or /^/s*$/){
        next;
    }
    #将[ ]作为头做处理,如有重复将做合并处理
    elsif(/^/s*/[(/w+)/]/s*$/){
        if(exists $dict{$1}){
            $this = $dict{$1};
        }
        else{
            $dict{$1} = {};
            $this = $dict{$1};
        }        
    }
    #定义处理,如有重复将做覆盖处理
    elsif(/^/s*([^ ]+)/s*=/s*([^ ]+)/s*$/){
        ($param,$value) = ($1,$2); #split '=',$_;
        $this->{$param}=$value;
    }
    #不符合INI文件定义则报错
    else{
        print "Line format error: $_";
    }
}

print Dumper %dict;

 

测试文件如下:

#this is testing

[checkFileNums_123]
File_Dir=/home/users/dhu/tmp/xtff
Log_Path=./logs/checkFileNums

[checkFileDate]
File_Dir=/home/users/dhu/tmp/xtff
Log_Path=./logs/checkFileDate

 

上述文件运行结果如下:

$VAR1 = 'checkDoneList';
$VAR2 = {
          'File_Dir' => '/home/users/dhu/tmp/xtff',
          'Log_Path' => './logs/checkDoneList'
        };
$VAR3 = 'checkFileDate';
$VAR4 = {
          'File_Dir' => '/home/users/dhu/tmp/xtff',
          'Log_Path' => './logs/checkFileDate'
        };

<think>我们正在处理用户关于MySQL 5.7性能优化的问题,特别是my.ini配置参数的调整。根据用户的问题,我们需要提供一些关键的配置参数建议,以改善查询性能。 首先,我们需要考虑MySQL性能调优的几个关键方面: 1. 内存配置(特别是InnoDB缓冲池) 2. 日志设置 3. 连接和线程相关配置 4. 查询缓存(注意:在MySQL 5.7中,查询缓存仍然存在,但在8.0中被移除,所以这里可以配置) 5. 其他性能相关参数 根据引用[3]的内容,我们知道`innodb_buffer_pool_size`和`innodb_buffer_pool_instances`是两个重要的参数,特别是当缓冲池大小设置为1GB或更多时,需要合理配置实例数量,使得每个缓冲池实例至少1GB。 另外,我们还需要参考其他常见的优化参数。 下面,我们将给出一个配置示例,并解释每个参数的作用。 注意:在修改my.ini文件之前,请备份原文件。修改配置后,需要重启MySQL服务使更改生效。 ### MySQL 5.7 my.ini 性能优化配置示例 ```ini [mysqld] # 通用配置 port=3306 basedir="C:/Program Files/MySQL/MySQL Server 5.7/" datadir="C:/ProgramData/MySQL/MySQL Server 5.7/Data" # 字符集 character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci # InnoDB 存储引擎配置 # 设置InnoDB缓冲池大小,通常设置为系统内存的70%-80%,但要根据实际可用内存调整 # 例如,如果系统有8GB内存,可以设置为5-6GB innodb_buffer_pool_size=6G # 设置InnoDB缓冲池实例的数量,每个实例至少1GB # 因此,如果缓冲池大小为6G,可以设置为6 innodb_buffer_pool_instances=6 # 设置InnoDB日志文件大小(每个日志文件),通常设置为缓冲池大小的25%左右,但不超过2GB # 这里设置为2*512M=1GB(因为有两个日志文件) innodb_log_file_size=512M # InnoDB日志缓冲大小,通常设置为8-16MB innodb_log_buffer_size=16M # 设置InnoDB刷新日志的方式,推荐使用O_DIRECT以避免双重缓冲 innodb_flush_method=O_DIRECT # 设置InnoDB支持并发线程的数量 innodb_thread_concurrency=0 # 0表示不限制,让InnoDB自动调整 # 连接配置 # 最大连接数,根据应用需求设置,避免设置过高导致资源耗尽 max_connections=200 # 线程缓存大小,用于缓存空闲线程以便快速响应连接 thread_cache_size=10 # 查询缓存配置(注意:如果查询重复率低,可以考虑关闭) # 查询缓存大小,设置为0表示禁用查询缓存(在MySQL 5.7中,如果确定不需要,可以禁用,因为查询缓存可能会成为瓶颈) query_cache_type=0 query_cache_size=0 # 其他配置 # 临时表大小,如果内存中临时表超过该值,则转换为磁盘临时表 tmp_table_size=64M max_heap_table_size=64M # 排序缓冲大小,每个连接独享,不宜设置过大 sort_buffer_size=2M join_buffer_size=2M read_buffer_size=2M read_rnd_buffer_size=2M # 表打开缓存 table_open_cache=2000 # 表定义缓存 table_definition_cache=1400 # 慢查询日志,用于记录执行时间超过指定阈值的查询 slow_query_log=1 slow_query_log_file="slow.log" long_query_time=2 # 单位秒,超过2秒的查询被记录 # 二进制日志(用于复制和恢复),但会带来性能开销,如果不需要可以关闭 # 如果开启,设置日志过期时间 # expire_logs_days=7 # log-bin=mysql-bin # 其他性能相关 # 避免外部锁 skip-external-locking # 最大允许的数据包大小,根据应用需求调整 max_allowed_packet=256M # 事务隔离级别,默认为REPEATABLE-READ,如果应用需要可以改为READ-COMMITTED # transaction_isolation=READ-COMMITTED ``` ### 参数说明 1. **innodb_buffer_pool_size**:这是InnoDB最重要的配置,用于缓存数据和索引。设置得尽可能大(但不要超过可用物理内存,同时为操作系统和其他应用留出内存)。 2. **innodb_buffer_pool_instances**:将缓冲池划分为多个实例,可以减少争用,提高并发性能。每个实例至少1GB。 3. **innodb_log_file_size**:重做日志文件的大小。较大的日志文件可以减少磁盘I/O,但会增加恢复时间。通常设置为缓冲池大小的25%左右。 4. **innodb_flush_method**:设置O_DIRECT可以避免双重缓冲,让InnoDB直接访问磁盘,而不经过操作系统的缓存。 5. **max_connections**:最大连接数。设置过高可能导致内存不足,需要根据实际应用调整。 6. **查询缓存**:在MySQL 5.7中,如果查询重复率不高,或者写操作频繁,查询缓存可能会成为瓶颈,因此建议关闭(设置query_cache_type=0和query_cache_size=0)。 7. **临时表设置**:tmp_table_size和max_heap_table_size用于控制内存临时表的大小。如果临时表超过这个大小,将转为磁盘临时表(使用磁盘I/O,较慢)。 8. **每个连接的缓冲**:如sort_buffer_size、join_buffer_size等,这些是每个连接独享的,不宜设置过大,否则在连接数多时容易耗尽内存。 9. **慢查询日志**:开启慢查询日志可以帮助识别需要优化的查询。 ### 注意事项 - 以上配置需要根据实际硬件(特别是内存大小)和应用负载进行调整。 - 修改配置后,应监控数据库性能,如使用`SHOW GLOBAL STATUS`和`SHOW ENGINE INNODB STATUS`等命令。 - 可以使用如`mysqltuner.pl`(引用[1]提到的Perl脚本)等工具来辅助调优。 ### 性能监控与调优工具 - **MySQLTuner**:一个Perl脚本,用于分析MySQL配置并提供优化建议[^1]。 - **EXPLAIN命令**:分析查询执行计划,优化查询语句[^2]。 - **Performance Schema**:MySQL 5.7内置的性能监控工具。 ### 相关问题 1. 如何监控MySQL的性能以验证配置优化后的效果? 2. 除了配置参数优化,还有哪些方法可以提升MySQL查询性能? 3. 在MySQL 5.7中,如何分析和优化慢查询?</think>### MySQL 5.7 性能优化配置指南 以下是针对 **my.ini** 的关键配置参数优化建议,旨在提升查询性能。这些参数基于 MySQL 5.7 的官方最佳实践和性能调优原则[^1][^3]: ```ini [mysqld] # 核心内存配置(根据服务器内存调整) innodb_buffer_pool_size = 系统内存的 70%-80% # 例如 8GB 内存设为 6G innodb_buffer_pool_instances = 8 # 每个实例 ≥1GB[^3] innodb_log_file_size = 2G # 重做日志大小(建议缓冲池的 25%) # 查询缓存(低重复率场景建议关闭) query_cache_type = 0 query_cache_size = 0 # 连接优化 max_connections = 500 # 根据并发需求调整 thread_cache_size = 100 # 减少线程创建开销 innodb_thread_concurrency = 0 # 0=自动调整 # I/O 优化 innodb_flush_method = O_DIRECT # 避免双重缓冲 innodb_io_capacity = 2000 # SSD 建议值 innodb_flush_neighbors = 0 # SSD 关闭相邻页刷新 # 临时表与排序 tmp_table_size = 256M max_heap_table_size = 256M sort_buffer_size = 4M # 每个连接独享,不宜过大 join_buffer_size = 4M # 日志与监控 slow_query_log = 1 long_query_time = 1 # 记录 >1s 的查询 performance_schema = ON ``` #### 关键参数详解: 1. **InnoDB 缓冲池** - `innodb_buffer_pool_size`:缓存数据和索引的核心参数,减少磁盘 I/O - `innodb_buffer_pool_instances`:减少多核 CPU 的竞争[^3],每个实例 ≥1GB 2. **查询缓存禁用** 在写频繁或数据变化快的场景中,查询缓存可能成为瓶颈(命中率低时建议关闭) 3. **I/O 优化** - `innodb_flush_method=O_DIRECT`:绕过 OS 缓存直接写磁盘 - `innodb_io_capacity`:根据存储设备性能调整(SSD 建议 2000+) 4. **连接管理** - `thread_cache_size`:重用线程减少创建开销 - 避免 `max_connections` 过高导致内存耗尽 #### 验证配置效果: ```sql -- 监控缓冲池命中率 SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_read%'; -- 理想值:命中率 > 99% ``` > **重要提示**: > - 修改前备份 `my.ini` 文件 > - 每次修改单个参数并观察效果 > - 使用 `mysqltuner.pl` 进行配置分析[^1] > - SSD 存储可显著提升 I/O 性能[^2] --- ### 相关问题 1. 如何监控 MySQL 的实时性能指标以验证优化效果? 2. 除了配置参数,还有哪些 SQL 语句级别的优化技巧? 3. 在 SSD 和 HDD 存储环境下,MySQL 优化策略有何不同? 4. 如何诊断和解决 MySQL 的慢查询问题? [^1]: MySQL 配置优化工具,Perl 脚本辅助分析配置 [^2]: MySQL 查询分析与性能调优方法 [^3]: InnoDB 缓冲池配置规范,实例分配原则
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值