MySQL的系统变量设置:性能与禁用外键约束

本文介绍了MySQL配置参数调整方法,包括连接数、缓存大小、线程缓存等关键设置,以提升数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1)、back_log: 
        要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。 
        back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。 
        当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。 

(2)、interactive_timeout: 
        服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。 

(3)、key_buffer_size: 
        索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为402649088(400MB)。 

(4)、max_connections: 
        允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100,我把它改为1024 。 

(5)、record_buffer: 
        每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120 (16M) 

(6)、sort_buffer: 
        每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为 16777208 (16M)。 

(7)、table_cache: 
        为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。 

(8)、thread_cache_size: 
        可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。我把它设置为 80。 

(10)、wait_timeout: 

        服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为7200。 


MySQL还原数据库,禁用和启用外键约束的方法(FOREIGN_KEY_CHECKS)
有时还原数据库时,因为表有约束导致40014错误,可以通过关闭外键约束,还原成功时再启用
禁用
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0

启用
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS


### 如何在 MySQL 中使用约束 #### 创建带有约束的表结构 在关系中,父表中的主字段子表中的字段形成关联。创建具有约束的表格时需指定参照完整性规则。 ```sql CREATE TABLE class ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ); CREATE TABLE students ( student_id INT NOT NULL AUTO_INCREMENT, c_id INT, s_name VARCHAR(50), PRIMARY KEY (student_id), FOREIGN KEY (c_id) REFERENCES class(id) ON DELETE RESTRICT -- 或者可以是 CASCADE/SET NULL 等策略 ); ``` 上述 SQL 语句定义了一个班级(`class`)和学生(`students`)之间的父子关系,在此情况下`c_id`作为指向`class.id`[^1]。 #### 插入数据到有约束的表里 当向含有约束条件的目标表插入新纪录之前,必须先确认所涉及的部引用对象已经存在于源表之中;否则会抛出错误提示。 ```sql INSERT INTO class(name) VALUES ('Math'); -- 假设上面这条命令返回受影响行数为1,则表示新增了一条记录且其ID为1. INSERT INTO students(c_id,s_name) VALUES (1,'Alice'); -- 正确操作因为存在对应的班级编号. ``` #### 删除或更新受保护的数据项 尝试移除被其他实体依赖的关字将会触发异常报告,除非事先调整了级联行为或者清除了所有相关联的对象实例。 ```sql DELETE FROM class WHERE id=1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails... ``` 该错误表明无法直接删除正在使用的主值,因为它正由另一个表内的某些记录所引用着[^2]。 为了绕过这个限制,可以选择如下几种方法之一: - **更改选项**:修改原有的声明来允许特定类型的自动处理动作,比如`ON DELETE SET NULL`或是`ON UPDATE CASCADE`. - **手动清理**:先行定位并消除那些间接阻碍目标变更过程的因素——即先把有关连结切断再继续执行后续指令。 - **临时禁用检查机制**:通过设置全局变量的方式暂时关闭对部链接一致性的验证功能,不过这通常只适用于非常特殊的情形下,并不推荐常规采用这种方法。 #### 设置约束及其作用 不仅有助于保持不同表格间的关系一致性,而且还可以防止非法数据进入系统内部造成混乱局面的发生。具体来说,它能够做到以下几点: - 维护参照完整性:确保每一个都对应着有效的主; - 自动化维护工作:依据预配置好的规则实现同步更新或清除冗余信息的功能; - 提升查询效率:利用索引来速基于多张表联合查找的速度[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值