首页
学习
活动
专区
圈层
工具
发布

mysql update执行效率

基础概念

MySQL的UPDATE语句用于修改表中的数据。它是SQL中最基本的操作之一,允许用户更新表中的特定行或所有行的数据。

相关优势

  1. 灵活性UPDATE语句可以根据复杂的条件来更新数据,这使得它在处理大量数据时非常灵活。
  2. 原子性UPDATE操作是原子的,这意味着要么整个更新成功,要么整个更新失败,不会出现部分更新的情况。
  3. 效率:对于小规模的数据更新,UPDATE语句通常执行得非常快。

类型

  1. 简单更新:基于单个条件更新一行或多行数据。
  2. 简单更新:基于单个条件更新一行或多行数据。
  3. 多表更新:使用JOIN操作同时更新多个表中的数据。
  4. 多表更新:使用JOIN操作同时更新多个表中的数据。
  5. 批量更新:使用CASE语句或子查询来批量更新数据。
  6. 批量更新:使用CASE语句或子查询来批量更新数据。

应用场景

  • 库存管理:当商品售出时,更新库存数量。
  • 用户信息更新:用户更改个人信息,如地址、电话号码等。
  • 数据同步:在数据同步场景中,可能需要更新多个表中的数据以保持一致性。

遇到的问题及解决方法

问题:MySQL UPDATE执行效率低下

原因

  1. 没有使用索引:如果没有在WHERE子句中使用的列上创建索引,MySQL将执行全表扫描,这会导致效率低下。
  2. 更新大量数据:当需要更新的数据量很大时,可能会导致长时间的锁定和性能下降。
  3. 锁冲突:在高并发环境下,多个事务可能同时尝试更新同一行数据,导致锁冲突。
  4. 复杂的子查询:如果UPDATE语句中包含复杂的子查询,可能会导致性能下降。

解决方法

  1. 创建索引:确保在WHERE子句中使用的列上创建索引。
  2. 创建索引:确保在WHERE子句中使用的列上创建索引。
  3. 分批更新:将大量数据的更新分成多个小批次进行,以减少锁定时间和性能影响。
  4. 分批更新:将大量数据的更新分成多个小批次进行,以减少锁定时间和性能影响。
  5. 优化子查询:尽量避免在UPDATE语句中使用复杂的子查询,可以考虑使用临时表或连接操作来优化性能。
  6. 优化子查询:尽量避免在UPDATE语句中使用复杂的子查询,可以考虑使用临时表或连接操作来优化性能。
  7. 使用乐观锁或悲观锁:根据具体业务场景选择合适的锁策略,以减少锁冲突。

参考链接

通过以上方法,可以有效提高MySQL UPDATE语句的执行效率。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

MySQL Update执行流程解读

一、update跟踪执行配置 使用内部程序堆栈跟踪工具path_viewer,跟踪mysql update 一行数据的执行过程,配置执行脚本:call_update.sh DROP DATABASE...(THD*) --SQL引擎层,调用存储引擎接口执行 Sql_cmd_update::update_single_table(THD*) optimize_cond --执行优化器优化路径...(THD*, bool) innoDB关键更新执行过程 ha_innobase::update_row: row_get_prebuilt_update_vector calc_row_difference...row_update_for_mysql row_upd_step row_upd --执行更新 btr_pcur_t::restore_position rec_get_offsets_func...三、执行总结 update执行流程 1.执行语句连接数据库 2.分析器通过词法、语法分析知道这是一条更新语句 3.优化器确定执行路径 4.执行器具体执行,找到这一行,更新数据,然后通过Inodb存储具体更新操作

3.1K20

MySQL Update语句是怎么执行的?

MySQL Update语句是怎么执行的?...其实,update语句的执行过程和select语句差不多,但是在update语句执行的过程中,MySQL新增加了两个重要的日志模块,他们分别是redo log(重做日志)和binlog(二进制日志、也可以称之为归档日志...当我们执行一个update的SQL时,MySQL会干如下几件事情: a、执行器查找指定记录,如果记录所在的数据页在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。...b、执行器拿到Innodb存储引擎接口给的数据,执行update操作,得到新的数据,然后调用Innodb存储引擎的接口写入数据。...然后告知执行器执行完成了,随时可以提交事务。 d、执行器生成update操作的binlog,并把binlog写入磁盘。

5.9K40
  • 从 MySQL 执行 update 报错 ERROR 1292 说起

    执行 update 报错 ERROR 1292 ,欢迎点击上方蓝字“JiekeXu DBA之路”关注我的公众号,标星或置顶,更多干货第一时间到达!...事情是这样的,上周五下班前通过自动化工具执行开发人员事先写好的 SQL 时,自动化工具执行失败了,于是手动去生产环境执行,就发生了错误 “ERROR 1292 (22007): Truncated incorrect...mysql> update t_busi_cont set busi_contract_file='ba42cfdb-a1d0-4e5a-c' and busi_contract_file_ct=1...mysql> update t_busi_cont set busi_contract_file='ba42cfdb-a1d0-4e5a-c' where id='7823dcaade9145cdb8702d537...上面图中“update t set id=‘6’ and c=‘6’ where d=1;”和“update t set id=‘6’ and c=‘1’ where d=1;” 都执行成功了,但是更新成功的值却不一样

    1.5K20

    update执行流程(MySQL redo log和binlog详解)

    test set score = 3 where id = 2; update语句也需要经过连接器、分析器、优化器、执行器,但是update语句相比select语句还是有很大不同的,更新流程设计两个重要的日志模块...真正的将日志写入到redo log文件(ib_logfile+数字)是在执行commit语句的时候执行。...UPDATE语句的执行流程 update test set score = 3 where id = 2; 整个update语句中牵涉到写redo log和binlog,并且redo log在前,binlog...-- score原始值为1 update test set score = 3 where id = 2; 假设我们的update语句在写完redo log,binlog还没写时系统发生了crash。...-- score原始值为1 update test set score = 3 where id = 2; 假设我们的update语句在写完binlog,redo log还没写时系统发生了crash。

    2.5K10

    【面试题精讲】mysql-update语句执行流程

    在执行 update 语句时,MySQL 会根据条件筛选出需要更新的记录,然后逐行修改记录中的数据。 2. 为什么需要 update 语句? update 语句的存在,体现了数据库的动态性。...update 语句的执行流程大致如下: 解析 SQL 语句:对给定的 update 语句进行解析,提取表名、操作字段(列名)、更新值、条件等信息; 锁定表:为了保证数据的一致性,在 update...6. update 语句的缺点 数据一致性风险:在多用户并发操作的情况下,update 语句可能导致数据不一致,需要时刻注意事务及锁机制; 执行速度受影响:当更新的记录数量较大时,update...语句的执行速度可能会受到影响。...在多条件查询中,注意使用 合适的索引,以提高 update 语句的执行速度。

    74110

    【面试题精讲】mysql-update语句执行流程

    在执行 update 语句时,MySQL 会根据条件筛选出需要更新的记录,然后逐行修改记录中的数据。 2. 为什么需要 update 语句? update 语句的存在,体现了数据库的动态性。...update 语句的执行流程大致如下: 解析 SQL 语句:对给定的 update 语句进行解析,提取表名、操作字段(列名)、更新值、条件等信息; 锁定表:为了保证数据的一致性,在 update...6. update 语句的缺点 数据一致性风险:在多用户并发操作的情况下,update 语句可能导致数据不一致,需要时刻注意事务及锁机制; 执行速度受影响:当更新的记录数量较大时,update...语句的执行速度可能会受到影响。...在多条件查询中,注意使用 合适的索引,以提高 update 语句的执行速度。

    1.1K20

    MySQL数据库执行Update卡死问题解决

    执行数据库更新update操作的时候数据库卡死了 问题分析 一般都是数据库事务未提交,导致update或者delete卡死。...那么应该是数据库在执行数据操作失败 or 事务未提交 之后,将需要执行的sql语句锁死了。...update操作 update car set color ='银色' where id = 1; update car set color ='红色' where id = 1; 查询正在执行的事务:...SELECT * FROM information_schema.INNODB_TRX; 根据图中事务的线程ID(trx_mysql_thread_id)可以看出对应的mysql 线程:一个1084...(update正在等待锁)另一个是1089(update 正在执行 没有提交事务) 可以使用mysql命令杀掉线程:kill 线程id kill 1089; 期间如果并未杀掉持有锁的线程:则第二个update

    2.9K20

    一文看懂MySQL执行update更新语句的流程

    如果掌柜没有粉板,每次记账都翻账本,效率是不是低死啦? MySQL也有这个问题,若每次更新操作都写进磁盘,然后磁盘也要找到对应记录,然后再更新,整个过程IO成本、搜索成本都很高。 何解?...binlog MySQL Server层,它主要做的是MySQL功能层面的事情 引擎层,负责存储相关的具体事宜 粉板redo log是InnoDB引擎特有的日志,而Server层也有自己的日志,称为...看执行器和InnoDB引擎在执行这个简单的update语句时的内部流程。 执行器先找引擎取id=2这行。id是主键,引擎直接用b+树搜索。...假设当前ID=2的行,字段c的值是0,再假设执行update语句过程中,在写完第一个日志后,第二个日志还没有写完期间发生crash?...建议设成1,保证MySQL异常重启之后binlog不丢失 参考 MySQL 实战 45 讲

    4.3K11

    MySQL insert or update sql

    MySQL 一条 sql 实现数据保存变更 insert or update ,如果没有执行insert,有就update 需要 有主键 PRIMARY 或 唯一索引 UNIQUE MySQL...中的INSERT … ON DUPLICATE KEY UPDATE语句,该语句是基于唯一索引或主键使用 ON DUPLICATE KEY UPDATE后面可以放多个字段,用英文逗号分割。...使用ON DUPLICATE KEY UPDATE,最终如果插入了一个新行,则受影响的行数是1,如果修改了已存在的一行数据,则受影响的行数是2,如果值不变,则受影响行数是0。...`num_true`=4, `grade`=20, `time_sub`=NOW(), `time_do`=200; 上面语句亲测可用,但有一个警告 共 2 行受到影响, 1 个警告 执行耗时...插入……对于具有多个唯一密钥的表的重复密钥更新是不安全的 相关博客:https://blog.csdn.net/rick_zyl/article/details/79024612 mysql 有就更新

    4.1K20

    MySQL的SELECT …for update

    要使用悲观锁,我们必须关闭mysql数据库的自动提交属性。 set autocommit=0;   //设置完autocommit后,我们就可以执行我们的正常业务了。...拿上面的实例来说,当我执行select status from t_goods where id=1 for update;后。...我在另外的事务中如果再次执行select status from t_goods where id=1 for update;则第二个事务会一直等待第一个事务的提交,此时第二个查询处于阻塞的状态,但是如果我是在第二个事务中执行...补充:MySQL select…for update的Row Lock与Table Lock   上面我们提到,使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL...InnoDB默认Row-Level Lock,所以只有「明确」地指定主键,MySQL 才会执行Row lock (只锁住被选取的数据) ,否则MySQL 将会执行Table Lock (将整个数据表单给锁住

    5.2K30

    mysql存储过程的学习(mysql提高执行效率之进阶过程)

    1:存储过程: 答:存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理;存储过程存储在数据库内,可以由应用程序调用执行,而且允许用户声明变量以及进行流程控制,存储类型可以接受参数...,可以接受输入类型的参数,也可以接受输出类型的参数,并且可以存在多个返回值,因为存储过程的效率要比单一的sql语句执行效率高很多; 注意:存储过程执行效率之所高,在于普通的sql语句,每次都会对语法分析...,编译,执行,而存储过程只是在第一次执行语法分析,编译,执行,以后都是对结果进行调用。  ...2:存储过程的优点: 答: (1)增强sql语句的功能与灵活性[可以完成复杂的判断和较复杂的运算]; (2)实现较快的执行速度[如果某一个操作包含大量的sql语句,都会执行分析,编译,执行,由于存储过程是预编译的...,所以当第一次调用存储过程的时候,执行语法分析,编译,执行,将结果存储到内存中,以后直接调用结果即可]; (3)减少了网络流量[提交到服务器的数据较少,相当于减少网络流量]; 3:创建存储过程的语法如下所示

    3.2K61

    开发者实践:MySQL 大表 DELETE、UPDATE 如何分批执行更稳

    很多开发者第一次做 MySQL 大表 DELETE、UPDATE 时,先想到的是把 SQL 写对;真正上线后才会发现,更关键的是怎么控制扫描规模、事务时长和锁等待。...先说明一下,这里说的“大表变更”具体指什么MySQL 大表变更大致可以分成两种:表结构类变更,比如 ALTER TABLE大批量数据改动,比如 UPDATE、DELETE这篇文章主要讨论的是第二种,也就是大批量数据变更...如果这里说的大表变更指的是大批量 DELETE、UPDATE,常见思路通常是分批执行,而不是把一条 DML 一次性跑完。...NineData 主要解决的是:当 MySQL 大批量 DELETE、UPDATE 的扫描行数超过阈值时,如何先识别风险,再分批执行,以便控制事务时长、锁影响和执行节奏。...写在最后MySQL 大表变更怎么避免锁表,这个问题放到生产环境里,通常不会只剩下“SQL 怎么写”这一层。

    22610

    MySQL 案例:Update 死锁详解

    死锁的两个语句如下: UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 = 6247476)...AND (id2 = 74354) UPDATE tbl_deadlock SET col1 = 1, col2 = 1, update_time = 1603685523 WHERE (id1 =...MySQL 的锁机制天然具备这个条件。 请求与保持条件:资源请求被阻塞时,已持有的资源不会被释放。 MySQL 不触发死锁回滚,且未进入 lockwait_timeout 的时候,具备这个条件。...由于 MySQL 的锁机制的原因,只需要判断出两个 SQL 语句的锁存在循环等待,那么死锁的条件就会成立了。...因此本案例中,虽然死锁信息中记录的索引名称不一样,但是锁争用的条件是成立的,即:trx1 通过二级索引向主键上执行了加锁操作,而 trx2 在其他的二级索引上拿到了锁,但是主键锁拿不到,因此进入了等待状态

    16.4K175

    proc 编程执行 insert、delete、update语句

    主题中提到的三种语句都是没有返回值的,所以我们实现起来也最简单,下面代码中包含了 insert、update 和 delete 三种语法的使用。...值得注意的是在 insert 和 update 的时候使用宿主变量时的语法,在宿主变量前一定要加冒号,这是初学者最容易犯的错误。...} printf("update success......\\n"); // 对上面执行的操作执行一次提交 EXEC SQL commit; // 删除 dept 表中 deptno 为 50 的数据 EXEC SQL delete from dept where...表中的原有如下数据: 执行我们的程序(注意,在程序执行前,你要操作的数据必须都是真正提交到数据库中的,如果操作了未commit的数据,那么程序就会卡住不动): 执行后再次查看数据库:

    91720
    领券