核心内核:my.ini(Linux下常叫my.cnf)是MySQL的主配置文件,类比MySQL服务的启动配置清单。MySQL服务启动时会读取这个文件里的各项参数,决定内存分配、连接数量、IO行为、字符集、日志、超时等全部运行规则;修改参数后大多需要重启或动态生效,参数配置直接影响数据库性能、稳定性与安全性。Windows系统默认命名my.ini,Linux一般my.cnf,二者语法、配置项完全一致。
一、本源基础术语
- my.ini / my.cnf
MySQL的静态配置文件,文本格式。数据库服务启动阶段加载,用来定义实例运行参数。Windows平台默认文件名my.ini,Linux为my.cnf,内容语法无差别。 - 配置段(section)
用[ ]包裹的分组,用来区分不同程序模块。每一段下面写对应的配置参数。常见:[mysqld](数据库服务主进程,最重要)、[client]客户端全局配置、[mysqld_safe]安全启动守护进程、[mysql]mysql命令行客户端。
重点:业务数据库核心配置全部写在 [mysqld] 段。
- 配置项(key=value)
配置文件最小单元,格式参数名=值。key是参数名称,value是参数值,等号两边空格可选。例:port=3306。 - 注释
以#或者;开头的行,MySQL读取时直接忽略,用来写说明、临时禁用某条配置。 - 配置加载优先级
MySQL会按固定顺序在多个路径寻找my.ini,找到多个配置文件会叠加生效,后面文件参数覆盖前面冲突参数。同参数,命令行启动参数 > my.ini配置 > 编译内置默认值。 - 动态参数 / 静态参数
- 动态参数:运行中可以通过
set global在线修改,不用重启MySQL; - 静态参数:修改my.ini之后必须重启MySQL实例才能生效,在线set修改无效。
- 全局参数 / 会话参数
全局:作用整个MySQL实例,所有新连接都生效;会话:仅当前数据库连接会话有效,断开连接就失效。很多参数同时存在全局与会话版本。 - 默认值
当my.ini没有写该参数,MySQL会使用编译内置的默认值。很多新手误区:不写参数不等于关闭功能,而是启用默认配置。
二、基础连接与网络相关术语([mysqld])
- port
MySQL监听端口,默认3306。客户端通过IP+端口建立TCP连接。一台机器多实例MySQL,必须分配不同port。 - bind-address
绑定监听IP。指定MySQL监听在哪块网卡。bind-address=0.0.0.0监听本机所有网卡,允许外部IP访问;127.0.0.1仅本机客户端可连,外网无法连接。安全加固常用。 - socket
Unix套接字文件(Linux),本地客户端不走TCP,直接文件通信,性能更高。Windows无socket。 - max_connections
实例最大并发连接数。MySQL能同时维持的客户端连接上限。超过这个数值,新连接直接拒绝,报“Too many connections”。 - wait_timeout
连接空闲超时时间。连接建立后,长时间没有任何SQL操作,达到时间MySQL自动关闭这个空闲连接。PHP-FPM长连接、数据库连接池受这个参数影响。 - interactive_timeout
交互式客户端空闲超时,mysql命令行登录属于交互式;业务程序是非交互式,遵循wait_timeout。 - skip-name-resolve
跳过域名反向解析。关闭DNS解析,加快连接建立,同时规避DNS解析卡顿导致数据库响应变慢。生产环境强烈开启。
三、内存缓冲核心术语(性能最关键)
- innodb_buffer_pool_size
InnoDB最重要参数,缓冲池。把表数据、索引页缓存到内存。类似数据库的高速内存缓存。生产环境推荐服务器物理内存50%~70%。如果太小,大量读请求走磁盘IO,查询极慢。仅InnoDB引擎生效。 - key_buffer_size
MyISAM引擎的索引缓存。现在生产大多用InnoDB,该参数不需要调很大。 - sort_buffer_size
单会话排序缓冲区。每条连接执行order by排序时,单独分配一块内存。是会话级内存,不是全局!不能盲目调很大,连接多的时候内存会爆炸。 - join_buffer_size
单会话join连接缓冲区。没有索引的关联查询,会使用这块内存做连接计算,同样会话级别。 - read_buffer_size
顺序扫描表的读缓冲区,会话级。全表扫描的时候使用。 - read_rnd_buffer_size
随机读取缓冲区,排序之后读取行数据使用。会话级。 - tmp_table_size / max_heap_table_size
内存临时表上限。group by、子查询会生成内存临时表;超过大小,临时表落地磁盘,性能暴跌。两个参数建议保持相同值。
四、InnoDB引擎核心术语
- default-storage-engine
数据库默认存储引擎,推荐InnoDB。InnoDB支持事务、行锁、崩溃安全;MyISAM不支持事务、表锁,崩溃容易损坏数据。 - innodb_file_per_table
独立表空间。开启后,每张InnoDB表单独生成.ibd文件存储数据和索引;关闭则全部数据放在共享ibdata1文件。现代MySQL默认开启。 - innodb_log_file_size
redo log(重做日志)单个文件大小。redo log是InnoDB崩溃恢复核心。日志文件越大,刷盘IO越少,性能更好;但故障恢复时间变长。 - innodb_log_buffer_size
redo log内存缓冲区,事务日志先写内存缓冲区,再刷到磁盘日志文件。 - innodb_flush_log_at_trx_commit
redo log刷盘策略,数据安全和性能的核心权衡参数
- 1:每次事务提交,日志刷盘,最高安全,崩溃不丢数据,性能偏低;
- 2:事务提交写入操作系统缓存,每秒刷盘;
- 0:每秒刷盘,性能最高,崩溃可能丢失最多1秒事务。
- innodb_flush_method
InnoDB数据文件刷盘IO方式,控制操作系统缓存行为,Linux常用O_DIRECT,绕过操作系统page cache,避免buffer_pool和系统缓存重复占用内存。 - innodb_autoinc_lock_mode
自增主键锁模式,控制insert自增锁并发策略。 - transaction_isolation
事务隔离级别。READ-COMMITTED / REPEATABLE-READ(MySQL默认)等,控制幻读、不可重复读。
五、字符集、文件、日志术语
- character-set-server
数据库服务默认字符集,生产统一utf8mb4,支持emoji表情,原生utf8不支持4字节字符。 - datadir
MySQL数据目录,存放所有数据库、表文件。迁移数据库、备份、磁盘扩容重点关注这个目录。 - log_error
错误日志文件路径,记录启动崩溃、运行异常、报错信息,排查故障第一优先查看日志。 - slow_query_log
慢查询总开关,开启后记录执行超过指定时间的SQL语句。 - long_query_time
慢查询阈值,单位秒。SQL执行耗时超过这个值,就写入慢查询日志,用来定位慢SQL优化。 - slow_query_log_file
慢查询日志文件路径。 - general_log
通用查询日志,记录所有收到的SQL语句,开销极大,生产仅临时调试开启,平时关闭。 - binlog(二进制日志)
binlog日志,记录所有修改数据的SQL,用于主从复制、数据恢复。- log_bin:binlog日志开关;
- binlog_format:日志格式(STATEMENT、ROW、MIXED,生产推荐ROW);
- expire_logs_days:binlog自动过期清理天数,防止磁盘打满。
六、IO、表、超时与安全术语
- table_open_cache
表文件句柄缓存。缓存打开的表对象,减少反复打开关闭表文件的系统开销。 - max_allowed_packet
单个数据包最大上限。控制单次SQL、批量插入、大文本字段传输包大小。导入大SQL、存储大blob字段,过小会报packet for query is too large。 - sql_mode
SQL语法校验模式,严格控制数据校验规则。例如NO_ENGINE_SUBSTITUTION、STRICT_TRANS_TABLES。旧版本默认宽松模式,会自动截断脏数据;严格模式拒绝非法数据写入,业务开发推荐配置规范sql_mode。 - tmpdir
临时文件目录,存放磁盘临时表、排序临时文件。尽量放在高速磁盘。 - secure_file_priv
控制load data infile导入导出文件的安全目录,限制MySQL读写服务器本地文件,防止文件读取漏洞。
七、常见误区术语
- 误区:修改my.ini保存立刻生效
纠正:静态参数必须重启MySQL;只有global动态参数支持set global在线修改,而且新参数只对新建立连接生效,已存在的连接继续使用旧参数。 - 误区:参数越大性能一定越好
纠正:内存类参数是全局资源约束,sort_buffer_size、join_buffer_size是每个连接单独分配,盲目放大,并发连接上来会瞬间耗尽服务器内存,直接OOM崩溃。 - 误区:my.ini写的参数一定会生效
纠正:检查配置加载顺序,多配置文件覆盖、参数拼写错误、写错配置段(写到[client]而不是[mysqld]),都会导致参数不生效。验证命令show variables like 'xxx';。 - 误区:my.ini全部参数都必须手动写出来
纠正:只需要写需要修改的参数,不需要全部配置项都罗列,不写自动使用MySQL内置默认值。
类比串联(服务器配置类比)
- my.ini = MySQL实例的启动配置清单,相当于Nginx的nginx.conf
- [mysqld]段 = MySQL主服务核心配置区域
- innodb_buffer_pool_size = 数据库高速内存缓存
- max_connections = 接待访客最大数量上限
- binlog = 数据变更操作流水日志,用于备份和主从同步
- slow_query_log = 慢操作审计日志,找出耗时SQL
- innodb_flush_log_at_trx_commit = 数据落盘安全策略,权衡安全与速度
庖丁解牛一句话总结
my.ini是MySQL实例的静态配置文件,分段管理各类参数;核心调优抓手是InnoDB缓冲池、redo log、连接上限、binlog、慢查询;区分静态/动态参数、全局/会话内存参数,内存参数不可盲目放大;修改配置后需要验证是否真正生效,配置本质是在硬件资源、查询性能、数据安全之间做取舍。