当前位置: 首页 > news >正文

【mysql】有索引和没有索引字段更新时锁的不同

结论

    对于有索引的的字段作为更新条件,如果更加语句用上了索引,那么只会在对于的更新字段的索引和对于记录的主键索引上加上x锁

    如果更新字段没有索引,由于需要全部扫描,那么就会给所有主键索引加上x,导致其他事务的更新操作被阻塞

准备

有表 t_person_info,create_time没有加索引,有记录: 4429

执行无索引字段更新

执行下面的事务,不提交


begin;
update  t_person_info set type='2' where create_time>SYSDATE()-2 and create_time<=SYSDATE()-1;

rollback;

查看锁信息(mysql8版本)

 

执行有索引记录更新

   给create_time创建索引。

ALTER TABLE `datacatlog`.`t_person_info` 
ADD INDEX `idx_create_time`(`create_time`) USING BTREE;

sql: 

select  * from t_person_info where create_time<STR_TO_DATE('05/10/2024 14:30:00', '%d/%m/%Y %H:%i:%s')
   and create_time>STR_TO_DATE('05/10/2022 14:30:00', '%d/%m/%Y %H:%i:%s')

 执行计划:


EXPLAIN select  * from t_person_info where create_time<STR_TO_DATE('05/10/2024 14:30:00', '%d/%m/%Y %H:%i:%s')
   and create_time>STR_TO_DATE('05/10/2022 14:30:00', '%d/%m/%Y %H:%i:%s')

  

然后再更新:


begin;
update  t_person_info set type='2' where create_time>SYSDATE()-2 and create_time<=SYSDATE()-1;

rollback;

 查看锁信息(mysql8版本)

可以看到上面查询的符合条件的记录都被加上x锁了。

然后执行其他更新操作:

 

执行无主键和无唯一键的表更新 

    t_test表有test1 test2 test3三个字段,但是没有任何索引,也没有主键

  

 

 开始一个执行更新事务

BEGIN;

update t_test set test1='r2rr' where test2='233';


ROLLBACK

 

相关文章:

  • 郑州微信网站建设国外直播平台tiktok
  • 做塑胶网站需要什么材料竞价系统
  • WordPress实现seo教程网站
  • 北京市地铁建设管理公司网站越秀seo搜索引擎优化
  • 保定网站开发公司seo公司官网
  • 怎么做整蛊网站百度app官方正式版
  • 使用Spring AI调用AI模型
  • YOLOv8改进SPFF-LSKA大核可分离核注意力机制
  • docker oracle11
  • windows2012部署redis5并安装为服务
  • svn 通过127.0.01能访问 但通过公网IP不能访问,这是什么原因?
  • Nacos简介、安装与使用(保姆级教程!!!)
  • ProfibusDP主站转ModbusTCP网关如何进行数据互换
  • 学习日记-250305
  • 大数据环境(单机版) Flume传输数据到Kafka
  • C++ JSON库的使用示例
  • MambaMorph:基于 Mamba 的医学 MR-CT 可变形配准框架
  • scBaseCamp:一个AI代理的可持续扩充的单细胞数据存储库
  • Huggingface transformers库使用教程(翻译)--------(2)使用piplines进行推理
  • IDC权威认证!永洪科技入选 IDC「GBI图谱」,点亮生成式 BI 价值灯塔
  • 【Linux】使用问题汇总
  • MySQL-多表查询
  • 模拟数据文件少写“+”加在本地如何恢复?
  • Java 实现 Oracle 的 MONTHS_BETWEEN 函数
  • 在PyCharm开发环境中,如何建立hello.py文件?
  • 小菜鸟系统学习Python-迭代实现斐波那契和汉诺塔问题