首页 > 数据库 >mysql学习

mysql学习

时间:2023-02-16 15:48:04浏览次数:47  
标签:事务 记录 学习 索引 mysql 共享 数据 id

一、事务

就是一堆操作,看成一个操作。然后解决可能存在的问题。

(1)ACID原则

  1. A(Automic) 原子性

事务里面的操作是一个整体。操作就像原子一样,不可分割

  1. C(Consistency) 一致性

事务里面的操作集的结果要么全成功,要么全失败。没有中间状态。

  1. I(Isolation) 隔离性

事务之间的数据操作,存在相互的影响,mysql设计了四种策略来实现。

  1. D(Durability) 持久性

事务一旦提交,就是永久性的,其他的操作和设备故障不影响操作结果。

(2)实现事务需要三个工具, 日志文件、锁机制、MVCC。

日志文件

事务要想解决处理前和处理后一致性,就需要有标识记录修改前和修改后的状态,mysql针对修改前和修改后提供了两个日志文件 -- undo log和redo log。
redo log是用来恢复数据的 用于保障已提交事务的持久化特性。
undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。

MVCC

是通过在每行记录的后面保存两个隐藏的列来实现的。实现某种版本机制
只在读已提交与可重读中工作,分离数据的修改

  • trx_id:表示最近修改的事务的id ,每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。新增一个事务时,trx_id会递增,因此 trx_id 能够表示事务开始的先后顺序。
  • roll_pointer:指向该行上一个版本的地址,每次对某条聚簇索引记录进行改动时,都会把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息。

锁机制

请看二

(3)事务隔离性

  1. 读未提交

可以读取未提交的数据,也被称之为脏读问题

  1. 读已提交

可以读到其他事务提交的数据,不可重复读问题
事务中重复查询都会重新生成readView,因为想看见其他事务提交的数据,数据版本需要更新,所以重新查询

  1. 可重复读

mysql8默认的隔离级别,幻读问题
事务中重复查询都会复用第一次查询的readView,事务的版本已经确定,保证前后一直,直接复用以前的版本

  1. 串行化

读的时候共享锁
写的时候直接排它锁

二、锁

在并发事务执行中,如果某个事务想要写操作某条数据,如果这条数据有锁,必须等待这个锁的释放,然后才能执行。
mysql锁的基本单位是next-key lock(由记录锁和间隙锁组成),前开后闭为记录锁,前开后开为间隙锁

(1)行锁

操作分类
  1. 共享锁
  2. 排它锁

当insert、update、delete走索引的时候,对记录行进行行锁
select可以手动添加排它锁与共享锁 for update(排他锁 行级使用) lock in share mode(共享锁、表级使用)
排它锁和共享锁区别(亲测)
共享锁可以重复添加共享锁,排他锁添加后则不能添加任何锁
并不像大多数博客记录的那样,排他锁添加后,其他事务不能对该数据读写,任然是可以读的!

(2)表锁(共享锁)

实质为共享锁,多个事务同时进行的时候,没有获得锁的事务只能读,不能写数据

(3)多事务操作结果

transaction

事务只有执行到某条锁表语句的时候,才会锁记录或表,开启事务不会锁
创建事务的时候,默认提交当前事务,并释放表锁

insert

插入数据会行锁

update、delete

不走索引修改数据,会锁表,走索引会行锁

select

通过添加特殊字段,让数据加锁

三、索引

(1)索引类别类型

主键索引:是一 种特殊的唯一索引它还多了一个限制条件,要求键值不能为空。主键索引用primay key 创建。
普通(Normal):也叫非唯一索引,是最普通的索引,没有任的限制。
联合索引:多个字段创建的索引,使用时遵循最左前缀原则。
唯一 (Unique):索引列中的值必须是唯一的,但是允许为空值。
空间索引:MySQL5.7之后支持空间索引,在空间索引这方面遵循OpenGIS几何数据模型规则。

(2)索引结构类型

  • 哈希索引: 适合等值查询,检索效率高,一次到位。
  • B+树索引:所有数据存储在叶子节点,复杂度为O(logn),适合范围查询。
  • FullText全文索引,针对数据比较大,like查询的那种

标签:事务,记录,学习,索引,mysql,共享,数据,id
From: https://www.cnblogs.com/theStone/p/17126990.html

相关文章

  • 机器学习实战
    1.1机械学习的标志监督学习和无监督学习、在线学习和批量学习、基于实例学习和基于模型学习1.2什么是机器学习一个计算机程序利用经验E来学习任务T,性能是P,如果针对任务T......
  • 【MYSQL异常处理】记录一次MYSQL数据库断电无法启动异常,错误提示为 ERROR! The server
    某xx项目,系统一直用着好好的,虽然无客户真实数据,但包含许多现场定制配置数据,结果客户突然把服务器给断电关机了,服务器环境大致如下1服务器环境描述:2centos7三台3其中......
  • mysql 占用CPU资源过大原因分析
    输入showprocesslist;命令注意state字段,Sendingdate;Waitingfortables;或各种lock(锁)大概率因为这些sql造成Checkingtable正在检查数据表(这是自动的)。Closing......
  • 新方案:从错误中学习,点云分割中的自我规范化层次语义表示
    前言LiDAR语义分割通过直接作用于传感器提供的原始内容来完成细粒度的场景理解而受到关注。最近的解决方案展示了如何使用不同的学习技术来提高模型的性能,而无需更改任......
  • python的学习之路Day5
    2023.2.16Day5今日内容概要逻辑运算符成员运算符身份运算符流程控制(重点)if判断while循环今日内容详细逻辑运算符and与 ##可以用and连接多个条......
  • 如何从MySQL中的当前日期时间减去30天?
    要从当前日期时间中减去30天,首先我们需要获取有关当前日期时间的信息,然后使用now()MySQL中的方法。在now()给出当前日期时间。用于此的方法是MySQL的DATE_SUB()。这是从当......
  • mysql重置自增id
    1、删除表中数据并且重置id这种方法好处是运行速度超快‘truncatetable表名; 2、删除表中数据并且重置id这种方法好处是可以从任何值开始,缺点是如果数据量大的话d......
  • docker离线安装mysql镜像
    docker离线安装mysql镜像1、拷贝mysql离线包安装包地址:链接:https://pan.baidu.com/s/13JfkqlkIMglo3tHImOUm_w密码:622t1.1、将mysql-57.gz安装文件拷贝......
  • Jetpack Compose学习(10)——使用Compose物料清单BOM,更好管理依赖版本
    原文地址:JetpackCompose学习(10)——使用Compose物料清单BOM,更好管理依赖版本-Stars-One的杂货小窝本期讲解下关于Android推出的BOM来简化我们添加compose依赖过于繁杂......
  • 机器学习-随机森林
    目录前言原理数学知识随机森林的优缺点优点缺点应用代码前言随机森林(RandomForest)是一种基于决策树的集成学习方法,它通过构建多个决策树来提高预测准确性和稳定性。在本......