数据库----索引和事务

目录

索引

作用

使用场景

索引的类型

B树和B+树

B树

B+树

 区别

基于B+树的索引

使用

查看索引

创建索引

删除索引

事务

事务的特性(ACID)

使用

事务可能产生的问题

解决:隔离级别 


索引

索引是一种特殊的文件,使用一定的数据结构,来保存索引字段对应的数据。可以对表中的一列或多列创建索引,并指定索引的类型。

首先我们要知道数据库保存数据的基本单位:page

作用

  • 数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
  • 索引所起的作用类似书籍目录,可用于快速定位、检索数据。
  • 索引对于提高数据库的性能有很大的帮助

使用场景

在创建索引时我们要考虑以下几点:

  • 数据量较大,且经常对这些列进行条件查询。
  • 该数据库表的插入操作,及对这些列的修改操作频率较低。
  • 索引会占用额外的磁盘空间。

满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

索引的类型

从索引存储结构划分:B+树索引、Hash索引、FULLTEXT全文索引、R Tree索引

从应用层次划分:普通索引、唯一索引、主键索引、复合索引

从索引键值类型划分:主键索引、辅助索引(二级索引)

从数据存储和索引键值逻辑关系划分:聚集索引(聚簇索引)、非聚集索引(非聚簇索引)

B树和B+树

B树

所有节点都保存有索引列及数据

数据库----索引和事务_第1张图片

B+树

叶子节点保存有索引列和数据,非叶子节点只有索引字段,叶子节点全部相连,B+树的每一个节点,都是一个page。 

 数据库----索引和事务_第2张图片

 区别

(1)数据的保存位置不同:B+树保存在叶子节点,B树保存在所有节点中

        体现出B+树的优势:节点不存储数据,这样一个节点就可以存储更多的key。可以使得树更            矮,IO的操作次数更少。

(2)叶子节点的指向:B+树相邻的叶子节点通过指针相连,B树没有

         体现出B+树的优势,所有叶子节点形成有序链表,便于范围查找

基于B+树的索引

1. 主键索引(聚簇索引)

2. 非聚簇索引

优化原则:

  1. 索引字段尽量不要有null的值,如果条件是字段is【not】null,!= 会走全表扫描。
  2. 频繁查询的字段建立索引:需要考虑最左匹配原则
  3. 频繁更新的字段,慎用索引(索引更新代价大),索引适用于读多写少的场景 

使用

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建对应列的索引。

查看索引

show index from 表名;

创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引

create index 索引名 on 表名(字段名);

删除索引

drop index 索引名 on 表名;

事务

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

事务的特性(ACID)

原子性:事务是最小是执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么全部不完成;

一致性:执行事务前后,数据保持一致,例如转账业务,无论事务是否成功,转账者和收款人的总额应该是不变的;

隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;

持久性:一个事务被提交以后。他对数据库中数据的改变是持久的,即使数据库发生故障也不会堆其有任何影响。(事务提交后,数据会持久化到硬盘)

使用

  1. 开启事务:start transaction;
  2. 执行多条SQL语句
  3. 回滚或提交:rollback/commit;

说明:rollback即是全部失败,commit即是全部成功。

事务可能产生的问题

丢失更新:事务1修改数据的操作,在事务2修改后就覆盖掉

数据库----索引和事务_第3张图片

脏读:第一个事务修改数据但没有提交,第二个事务就读取,在第一个事务回滚后,第二个事务读取的就是脏数据

数据库----索引和事务_第4张图片 

 不可重复读:一个事务两次读取数据,中间有另一个事务修改,第一个事务两次读取的数据就不同

数据库----索引和事务_第5张图片

 幻读:一个事务两次读取,中间有另一个事务执行了插入操作,造成第一个事务看到不同的结果

数据库----索引和事务_第6张图片 

解决:隔离级别 

数据库----索引和事务_第7张图片

注:隔离级别越高,代表越安全,性能越差 

你可能感兴趣的:(数据库,sql,database)