数据库索引事务

Posted AllenSquirrel

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库索引事务相关的知识,希望对你有一定的参考价值。

目录

索引:类似于目录功能

聚簇索引:

非聚簇索引:

数据库操作中的索引类型:

事务:一个或多个sql组合

事务特性:

事务操作流程:

mvcc:多版本并发控制


索引:类似于目录功能

原理:

给一张表创建一个索引,相当于创建一个索引表

索引不适用于所有字段,索引不是越多越好会影响插入和删除效率

应用场景:

  • 数据量大,经常用于查询依据的字段
  • 字段修改频率较低的字段
  • 索引过多会占据额外磁盘空间

索引如何提高查询效率?

索引采用特殊的数据结构提供效率(B+树)

B+树与B树区别:

  1. B树:多叉树;B+树:也是一个多叉树,多叉树可以降低树高度提高查询效率
  2. B树的索引与数据存储在一个节点中,而B+树索引与数据分离存储,每一个节点占据磁盘空间小,这样一次性可以从磁盘中读取更多索引信息,加快索引效率
  3. B+树数据顺序存储,在连续查询或范围查询时可以连续IO取出数据,效率较高

聚簇索引:

以主键作为主索引,数据节点在磁盘中顺序存储,其他的索引作为辅助索引,其中辅助索引保存的是主键索引的数据,最终还是依靠主键索引进行查询

非聚簇索引:

主键索引与普通索引区别不大,都是最终索引项中存放磁盘中的存放地址(指针),数据节点在磁盘中并非顺序存储

适用场景:

聚簇索引:索引与数据都是顺序存储,中间插入/删除需要调整索引的数据结构,效率较低,但由于数据顺序存储,在连续/范围查询时效率较高

非聚簇索引:中间插入数据,只需要将数据存储在磁盘新的位置,中间调整索引信息即可,效率高,但索引与数据存储顺序不一致,导致在连续/范围查询时类似于单个查询,效率较低

大多数情况都是使用自增主键作为聚簇索引,这样的话数据与索引总是在最后添加,而不涉及中间插入的调整1

数据库操作中的索引类型:

  • 主键索引:一个字段被设置为主键,默认会为主键字段创建索引
  • 唯一索引:一个字段被设置了唯一约束,默认会为该字段创建索引
  • 外键索引:一个字段被设置为外键,默认会为外键字段创建索引
  • 普通索引:并非默认创建的索引,自定义创建

创建索引:create index idx_name on tbname(fields_name);

删除索引:drop index idx_name on tbname;

查看索引:show index from tbname\\G;

事务:一个或多个sql组合

事务特性:

  • 原子性:一次完成
  • 一致性:事务前后,数据完整性要符合预设规则,依赖原子性
  • 隔离性:允许多个事务并发执行,不会因为交叉执行导致数据不一致
  • 持久性:事务提交之后,对数据的修改是永久的

事务操作流程:

begin(开启事务)  rollback(回滚)   commit(提交) 

若并发情况下无隔离性保护机制,则会导致:

  1. 脏写:事务A进行数据修改,在事务提交之前被其他事务覆盖
  2. 脏读:一个事务中读取到的数据是其他事务中未提交的数据(解决方法:读已提交)
  3. 不可重复读:一个事务在不同阶段从数据库中读到的数据不一致(修改同一条数据导致,可加锁解决)
  4. 幻读:一个事务在不同时间段读取到的数据条数不一致(插入/删除不同数据导致,不可避免)

mvcc:多版本并发控制

  1. 给每个事务分配一个事务id
  2. 在事务中对数据进行操作时,都临时拷贝一份数据进行操作
  3. 在本次事务对数据再次进行访问时所访问的均为临时拷贝(对临时拷贝进行操作,读操作时不阻塞写,写操作也不会阻塞读)
  4. 事务提交时将事务操作持久化

以上是关于数据库索引事务的主要内容,如果未能解决你的问题,请参考以下文章

理解MySQL数据库不可缺少的知识(索引,事务存储引擎)!

数据库索引事务

MySQL 数据库 进阶 面试官常问 索引+事务+JDBC

数据库概论之 MySQL 索引事务

mysql索引,事务

MySQL数据库之——索引事务存储引擎。(快速搜索你想要的内容)