m-zhuang

导航

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; 都是独立的事务。

三、存储引擎

posted on 2023-07-16 21:19  m_zhuang  阅读(7)  评论(0编辑  收藏  举报