MySQL 系统变量
在 MySQL 数据库中,变量可分为系统变量和用户自定义变量。系统变量以 @@ 开头,用户自定义变量以 @ 开头。
服务器维护着两种系统变量,即全局变量(GLOBAL VARIABLES)和会话变量(SESSION VARIABLES)。全局变量影响 MySQL 服务的整体运行方式,会话变量影响具体客户端连接的操作。
每一个客户端成功连接服务器后,都会产生与之对应的会话。会话期间,MySQL 服务实例会在服务器内存中生成与该会话对应的会话变量,这些会话变量的初始值是全局变量值的拷贝。
全局系统变量
这些变量影响整个 MySQL 服务器的行为,可以在 my.cnf 配置文件中设置。
innodb_buffer_pool_size:控制 InnoDB 存储引擎用于缓存数据和索引的内存大小。增大该值可以提升查询性能,但需要确保系统有足够的内存。
query_cache_type 和 query_cache_size:控制查询缓存的启用和缓存大小。设置合适的缓存大小可以减少查询的响应时间,但在高并发写入场景下可能不适用。
max_connections:设置 MySQL 允许的最大并发连接数。根据系统负载和应用需求,调整此值以防止连接超限和资源耗尽。
tmp_table_size 和 max_heap_table_size:控制内存临时表的大小限制,影响排序和临时表的操作效率。
innodb_log_file_size:控制 InnoDB 日志文件的大小,影响事务的持久性和性能。
会话(Session)级别系统变量
这些变量对当前 MySQL 会话有效,可以通过 SET 命令动态设置或者在连接时设置。
sql_mode:设置 SQL 执行模式,影响 SQL 语句的语法和行为,如严格模式、ONLY_FULL_GROUP_BY 等。
autocommit:控制是否自动提交每个 SQL 语句。默认情况下,MySQL 在每个语句执行后自动提交,可以通过设置 autocommit=0 来禁用自动提交,需要显式使用 COMMIT 或 ROLLBACK。
transaction_isolation:设置事务隔离级别,如 READ COMMITTED、REPEATABLE READ 等,影响事务的并发控制和数据一致性。
动态系统变量
MySQL 中还有一些在运行时可以动态修改的系统变量,可以通过 SET GLOBAL 或 SET SESSION 命令进行设置。
innodb_flush_log_at_trx_commit:控制每个事务日志刷新到磁盘的时机,影响事务的持久性和性能。
innodb_lock_wait_timeout:设置等待获取 InnoDB 行级锁的超时时间,避免长时间等待锁的情况。
max_allowed_packet:控制单个网络数据包或 SQL 语句的最大大小,适用于大数据插入或更新操作。
查看系统变量
查看 MySQL 中所有的全局变量信息
SHOW GLOBAL VARIABLES;
查看与当前会话相关的所有会话变量以及全局变量
SHOW SESSION VARIABLES;
@@global 仅仅用于标记全局变量;
@@session 仅仅用于标记会话变量;
@@ 首先标记会话变量,如果会话变量不存在,则标记全局变量。
设置系统变量
可以通过以下方法设置系统变量:
修改 MySQL 源代码,然后对 MySQL 源代码重新编译(该方法适用于 MySQL 高级用户,这里不做阐述)。
在 MySQL 配置文件(mysql.ini 或 mysql.cnf)中修改 MySQL 系统变量的值(需要重启 MySQL 服务才会生效)。
innodb_buffer_pool_size = 1G
在 MySQL 服务运行期间,使用 SET 命令重新设置系统变量的值
SET @@global.innodb_file_per_table=default; SET GLOBAL query_cache_size = 16 * 1024 * 1024;
这些系统变量可以根据具体的应用需求和数据库环境进行调整和优化,以提升 MySQL 数据库的性能、稳定性和安全性。