Bootstrap

MySQL 索引·事务

本节内容

索引

事务

索引

1.  索引的定义

索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现

针对查询操作引入的优化手段,加快查询速度,避免针对表进行遍历

2. 索引的使用

1)对于插入、删除数据频率高的表,不适用索引

2)对于某列修改频率高的,该列不适用索引

3)通过某列或某几列的条件查询频率高的,可以对这些列创建索引

查看:show index from 表名;

创建:create index 索引名 on 表名(列名);

删除:drop index 索引名 on 表名(列名); 

 注意事项:

1)一张表可以有多个索引

2)主键,unique指定时都会自动创建索引

3)只有手动创建的索引可以删除

4)一个索引是针对一个列指定的,只有针对这一列进行查询时,查询速度才能被索引优化

5)创建索引时,需要对现有数据大规模的的重新整理,可能会使服务器崩溃 

3. 索引的实现

索引保存的数据结构主要为B+树,及hash的方式

与B+树相似的有B树,一下进行介绍:

B树:     N叉搜索树

1)每个节点上有M个key,划分出M+1个区间

2)进行查询时,可以从根节点出发。

判定当前要查找的数据在节点的哪个区间中,决定下一步往哪里走

3)进行添加/删除元素可能会涉及节点的拆分和节点的合并

B+树:    N叉搜索树

1)一个节点上有N个key,划分成N个空间

2)每个节点上N个key中的最后一个,相当于当前子树的最大值      (以最大为例)

3)父结点上的每个key都会以最大值的身份在子节点的对应区间中存在(key可能会重复出现)

叶子结点的这一层,包含了整棵树的数据全集

4)B+树会使用链表的结构把叶子节点串起来

可以方便的完成数据集合的遍历,以及从数据集合中取出一个“子集”

5)由于叶子节点是全集,会把行数据存在叶子节点上;非叶子节点只是存储一个用来排序的key(例如id)

数据库里是按照行组织数据的;创建索引时,是针对这一列进行创建的

硬盘上还是要存储非叶子节点,当进行查询时,把这些非叶子节点加载到内存中。整体查询的比较过程可以在内存中进行,减少IO访问次数 

B+树的优点:

1)N叉搜索树,树的高度有限,降低IO次数

2)擅长查询

3)所有查询最终要落到叶子节点上,查询和查询之间的时间开销是稳定的

对于树形结构来说,每次回溯都是一次硬盘开销

B树:节点的位置不同,回溯的次数不同,时间开销不稳定

B树:叶子节点属于是链式结构,没有额外的开销,找到下一个元素最多需要1次硬盘开销

MySQL实现索引不只有B+树

MySQL内部有一个模块——存储引擎,提供了很多版本优化

innodb 常用的是 B+树

事务

1. 事务的定义

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败

在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务

把多个SQL打包成一个整体,可以保证这些SQL要么全部执行成功,要么全部执行失败

2. 事务的实现

1)开启事务:

start transaction;

2)执行多条SQL语句

3)提交/回滚  (事务结束)

commit;

事务回滚将撤销所有已执行的操作,恢复到事务开始之前的状态(已日志的方式记录事务中的关键数据)

roll back;    主动触发回滚(搭配逻辑语句使用)

SQL也支持条件,循环,变量函数...

单独成行的SQL都是自成体系的

3. 事务的特征

1)原子性

通过回滚的方式,保证这些操作都能正确执行或恢复如初

2)一致性

事务执行的结果必须使数据库从一个一致性状态转换到另一个一致性状态

3)持久性

事务做出的修改,可以在硬盘上持久保存。重启服务器,数据依然存在,事务执行的修改依然有效

4)隔离性     ——两个事务之间的影响

数据库并发执行多个事务的时候,确保数据正确

4. 事务的异常及处理

1)脏读

事务A正在写数据的过程中,事务B读取了同一个数据(脏数据),接下来事务A又修改了数据,导致事务B之前读到的数据是一个无效/过时的数据

——> 针对写操作加锁

2)不可重复读

并发事务中,如果事务A在内部多次读取同一数据时,出现不同情况

事务A在两次读之间,事务B修改了数据并提交了数据(不提交,看不到数据改变)

——>给度操作加锁

3)幻读

事务执行过程中,两次的读取操作,数据内容虽然没改变,但是结果数据集变了

——>引入串行发    //保持绝对的串行执行事务,此时完全没有并发了

并发性依次降低,隔离性依次增加,效率依次降低,数据准确性依次增加

隔离级别:可以直接在MySQL配置文件中,修改数据哭的隔离级别

1)read uncommitted——读未提交

2)read committed——读已提交

只能读写完后提交的版本

3)repeatable read——可重复读    (默认级别)

写的时候不能读,读的时候不能写

4)serializable——串行化

严格按照串行的方式,一个一个地执行事务

并发性依次降低,隔离性依次增加,效率依次降低,数据准确性依次增加

;