mysql 案例 ~ insert插入慢的场景

本文探讨了在数据库中遇到的Insert慢日志问题,分析了多种可能的原因,包括事务提交延迟、锁等待、外键约束、大字段处理等,并通过实际案例详细介绍了排查和解决方法,最终通过读写分离实现了优化。

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

一简介: insert出现慢日志中,应该怎么检测呢

二 理解:事务提交延迟,一般出现在写日志延迟的情况下,会有几种可能
    场景:
    1 RR模式下,insert等待gap lock锁导致的
    2 insert等待MDL锁导致
    3 表存在外键约束,耗时在外键检测上
    4 表没有主键

    5 表中含有blob/text和大varchar这种大字段
    6 半同步复制的延迟导致插入延迟等待
    7 DB服务器IO压力较大,导致排队,iowait很高 
          1 并发insert的线程较多
          2 并发select的线程较多
    8 磁盘空间不足导致插入延迟等待

    9  优化task慢sql,因为慢sql同样会抢占你的IO/CPU资源
三 案例:
   1 描述:线上慢日志定期会出现insert慢日志,大概1s左右,非常奇怪
   2 排查思路:
       1 慢日志除了insert语句,并没有大表扫描的慢查询->排查慢查询的干扰
       2 观察binlog生成量,非常少,尝试调整sync_binlog参数,并没效果->排查binlog刷新的干扰
       3 尝试调整innodb_flush_commit参数,并没有效果->排查redo刷新的干扰

       4 查看innodb_buffer_pool的命中率,查看脏页刷新频率效果
       5 观察慢日志insert发生时间,大多发生在整点和半点,查看对应的qps图,发现对应的select并发非常高,找到了原因
   3 解决方案: 进行读写分离拆分,进一步进行观察

转载于:https://www.cnblogs.com/danhuangpai/p/10113549.html

### MySQL INSERT 语句的语法与示例 #### 基本语法 `INSERT INTO` 是用来向数据库表中插入新数据的核心 SQL 语句。其基本形式如下: ```sql INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...); ``` 此语法表示将指定列的数据插入到目标表中[^1]。 #### 单行插入示例 以下是单行插入的一个简单例子,假设有一个名为 `students` 的表,包含三列:`id`, `name`, 和 `age`。 ```sql INSERT INTO students (id, name, age) VALUES (1, 'Alice', 20); ``` 这条语句会在 `students` 表中新增一条记录,其中 `id=1`, `name='Alice'`, `age=20`。 #### 多行插入示例 如果需要一次性插入多条记录,可以使用以下语法: ```sql INSERT INTO students (id, name, age) VALUES (2, 'Bob', 22), (3, 'Charlie', 21); ``` 上述代码将在一次操作中向 `students` 表中插入两条记录。 #### 使用 SELECT 子查询插入数据 除了直接提供值外,还可以通过子查询的方式从另一个表中获取数据并插入当前表中。例如: ```sql INSERT INTO target_table (col1, col2, col3) SELECT source_col1, source_col2, source_col3 FROM source_table WHERE condition; ``` 这种情况下,满足条件的所有行都会被复制到目标表中。 #### 运行时错误处理 需要注意的是,在实际应用中可能会遇到一些运行时错误。比如字段数量不匹配或者数据类型不符等问题可能导致 “Insert into 语句的语法错误”的提示[^2]。因此建议仔细核对每项参数及其对应关系后再提交命令。 #### 结合存储过程实现动态插入 当业务逻辑较为复杂时,可以通过创建存储过程简化多次调用的过程。下面展示了一个接受两个输入参数并将它们存入员工信息表的例子: ```sql CREATE PROCEDURE insert_employee(IN emp_name VARCHAR(50), IN emp_salary DECIMAL(10,2)) BEGIN INSERT INTO employees (name, salary) VALUES (emp_name, emp_salary); END; ``` 每次只需呼叫这个预设好的函数即可完成相应功能而无需重复书写相同部分[^3]。 #### 高级特性 - 触发器中的 BEGIN...END 构造 对于更高级的需求来说,利用触发器可以在某些事件发生前/后自动执行一段脚本。这里给出一个调整账户余额范围至合理区间的案例演示: ```sql DELIMITER // CREATE TRIGGER upd_check BEFORE UPDATE ON account FOR EACH ROW BEGIN IF NEW.amount < 0 THEN SET NEW.amount = 0; ELSEIF NEW.amount > 100 THEN SET NEW.amount = 100; END IF; END// DELIMITER ; ``` 以上片段展示了如何设置自定义规则以保障数据质量的同时也体现了灵活运用控制结构的能力[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值