首页 > 数据库 >MySQL 索引、事务与存储引擎

MySQL 索引、事务与存储引擎

时间:2023-07-16 21:34:14浏览次数:45  
标签:存储 数据库 事务 索引 脏读 提交 MySQL 数据

目录

一、索引

1. 概念

是一个排序的列表,存储着索引值和这个值所对应的物理地址

无须对整个表进行扫描,通过物理地址就可以找到所需数据

是表中一列或者若干列值排序的方法

需要额外的磁盘空间

2. 作用

数据库利用各种快速定位技术,能够大大加快查询速率

当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度

可以降低数据库的IO成本,并且还可以降低数据库的排序成本

通过创建唯一性索引保证数据表数据的唯一性

可以加快表与表之间的连接

在使用分组和排序时,可大大减少分组和排序时间

3. 副作用

索引需要占用额外的磁盘空间

对于 MylSAM 引擎而言,索引文件和数据文件是分离的,索引文件用于保存数据记录的地址。而InnoDB 引擎的表数据文件本身就是索引文件。当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度。

在插入和修改数据时要花费更多的时间,因为索引也要随之变动

4. 创建索引的原则依据

表的主键、外键必须有索引

记录数超过300行的表应该有索引

经常与其他表进行连接的表,在连接字段上应该建立索引唯一性太差的字段不适合建立索引

更新太频繁地字段不适合创建索引

经常出现在where子句中的字段,特别是大表的字段,应该建立索引

索引应该建在选择性高的字段上

索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

5. 优化

哪些字段场景时候适合创建索引 哪些不适合

① 小字段

② 唯一性强的字段

③ 更新不频繁,但他的查询效率很高字段

④ 表记录超过300+行

⑤ 主键、外键、唯一键

6.分类

普通索引:针对所有字段,没有特殊的需求/规则

唯一索引:针对唯一性的字段,仅允许出现一次空值

组合索引:(多列/多字段组合形式的索引)从左往右

全文索引:(varchar char text)以文本中的文字进行搜素

主键索引:针对唯一性字段、且不可为空,同时一张表只允许包含一个主键索引

二、事务

1. 事务的概念

2. 事务的特点

ACID,是指在可靠数据库管理系统(DBNS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这是可靠数据库所应具备的几个特性。

(1)原子性

事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生

事务是一个完整的操作,事务中的个元素是不可分割的,必须作为一个整体

(2)一致性

一致性:指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。当事务完成时,数据必须处于一致状态。

在事务开始前,数据库中存储的数据处于一致状态。在正在进行的事务中数据可能处于不一致的状态。当事务成功完成时,数据必须再次回到已知的一致状态。

案例:
对银行转帐事务,不管事务成功还是失败,应该保证中事务结束后表A和B的存款总额跟事务执行前一致。

(3)隔离性

隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。

对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。

修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据。

(4)持久性

持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

指不管系统是否发生故障,事务处理的结果都是永久的。

一旦事务被提交,事务的效果会被永久地保留在数据库中。

3. 扩展事务之间的相互影响分为几种

脏读(读取未提交数据):脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
案列1
比如事务B执行过程中修改了数据x,在未提交前,事务A读取了x,而事务B却回滚了,这样事务A就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据。

4. Mysql 及事物隔离级别

(1)read uncommitted : 读取尚未提交的数据 :不解决脏读

允许脏读,其他事务只要修改了未提交数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据

总结:读未提交的数据,安全性最差,但性能最好(不使用!!)

(2)read committed:读取已经提交的数据 :可以解决脏读

只能读取到已经提交的数据。oracle等多数数据库默认都是该级别(不重复读)。读已提交的数据

总结:安全性较差,性能较好 oracle 数据库默认的类型

(3)repeatable read:重复读取:可以解决脏读 和 不可重复读 ---mysql默认的

可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响

总结:可以重复读安全性能较高,性能较差MysQL数据库默认类型

(4)serializable:串行化:可以解决 脏读 不可重复读 和 虚读---相当于锁表

完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

属于串行化安全性高性能最差(不使用)

查询全局事务隔离级别:

show global variables like '%isolation%';
SELECT @@global.tx_isolation;

查询会话事务隔离级别:

show session variables like '%isolation%';
SELECT @@session.tx_isolation; 
SELECT @@tx_isolation;

设置全局事务隔离级别:

set global transaction isolation level read committed;

设置会话事务隔离级别:

set session transaction isolation level read committed

5. 事务控制语句

BEGIN 或 START TRANSACTION:显式地开启一个事务。

COMMIT 或 COMMIT WORK:提交事务,并使已对数据库进行的所有修改变为永久性的。

ROLLBACK 或 ROLLBACK WORK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

SAVEPOINT S1:使用 SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个 SAVEPOINT;“S1”代表回滚点名称。

ROLLBACK TO [SAVEPOINT] S1:把事务回滚到标记点。

6. 使用 set 设置控制事务

SET AUTOCOMMIT=0; #禁止自动提交

SET AUTOCOMMIT=1; #开启自动提交,Mysql默认为1

SHOW VARIABLES LIKE 'AUTOCOMMIT'; #查看Mysql中的AUTOCOMMIT值

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入

rollback|commit;当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。

如果开起了自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit。

当然无论开启与否,begin; commit|rollback; 都是独立的事务。

三、存储引擎

标签:存储,数据库,事务,索引,脏读,提交,MySQL,数据
From: https://www.cnblogs.com/m-zhuang/p/17558607.html

相关文章

  • Mysql group replication(MGR)
    一、MGR 1、MGR的作用和特点  1)MGR的作用  对Mysql数据库进行故障冗余 保证数据库数据实时性和一致性 2)特点 高一致性:保证数据实时同步 高容错性:部署MGR不能低于三个节点,节点数量必须是单数 可扩展性强:不停止复制组热添加和移除Mysql节点 灵活性强:动态扩展......
  • MySQL 中使用变量实现排名名次
    title:MySQL中使用变量实现排名名次date:2023-7-1619:45:26tags:-SQL高级查询一.数据准备:CREATETABLEsql_rank( idINT(11)UNSIGNEDNOTNULLAUTO_INCREMENT, user_idINT(11)UNSIGNEDNOTNULL, scoreTINYINT(3)UNSIGNEDNOTNULL, add_tim......
  • Mysql进阶篇(二)之索引
    一.索引概述1.介绍索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。2.演示表结构及其数据如下:假如我们要执......
  • Mysql进阶篇(二)之索引
    一.索引概述1.介绍索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。2.演示表结构及其数据如下:假如我们要执行的SQL语......
  • r2dbc mysql
    R2DBCMySQL:异步响应式数据库访问的新时代在传统的JDBC(JavaDatabaseConnectivity)中,数据库访问通常是同步的,这意味着当你执行一个查询或更新时,你必须等待数据库返回结果,然后再进行下一步操作。然而,随着异步编程的兴起,开发者对于更高效的数据库访问方式有了更高的期望。在这篇文章......
  • 安装mysql在线版本
    1. 安装MySQL服务器和客户端:sudoaptinstallmysql-servermysql-client 2.启动sudosystemctlstartmysql 3.修改密码sudomysql_secure_installation输入MySQLroot用户的密码:如果你已经设置了root用户密码,请输入密码并按下Enter键。如果是首次安装,直接......
  • Docker中运行mysql并且数据目录存在本地
    Docker中运行mysql并且数据目录存在本地  Docker中运行mysql并且数据目录存在本地按https://github.com/NeuCharFramework/NCF/wiki/来弄win11,dockerv24.0.2,镜像加速配置: {"debug":false,"experimental":false,"features":{"buildkit":tr......
  • redis 存储不重复列表
    实现Redis存储不重复列表简介在本文中,我将向你展示如何使用Redis来存储不重复列表。首先,我们需要明确什么是Redis和不重复列表。Redis是一个开源的高性能内存数据库,它提供了多种数据结构和功能,以支持各种应用场景。不重复列表是一个数据结构,其中每个元素只出现一次。在Redis中,我......
  • redis set存储对象
    如何实现RedisSet存储对象概述在Redis中,Set是一种无序且不重复的数据结构,它可以存储多个元素,且操作效率非常高。如果我们想要将对象存储到Redis的Set中,我们需要进行一些额外的处理。本文将详细介绍如何使用Redis来实现Set存储对象的功能。准备工作在开始之前,确保你已经安装了R......
  • shell查询mysql数据库返回结果
    Shell查询MySQL数据库返回结果作为一名经验丰富的开发者,我将教会你如何通过Shell查询MySQL数据库并返回结果。下面是整个过程的流程图:步骤描述步骤1连接到MySQL数据库步骤2编写SQL查询语句步骤3执行SQL查询语句步骤4处理查询结果步骤5关闭数据库连接......