今天看啥  ›  专栏  ›  热爱编程的小张同学

Mysql索引,存储引擎以及事务底层原理

热爱编程的小张同学  · CSDN  ·  · 2020-01-01 00:00

文章预览

索引

mysql的索引的优点:

​ 1 可以保证数据库表中的每一行数据的唯一

​ 2 可以加快查询的速度

​ 3 可加快表与表之间的连接

​ 4 可以减少查询和排序的时间

B+树索引的好处:

hash索引是无序的不能进行范围

查找树的回旋查找的查找效率和高度有关通过单向链表解决了回旋查找的问题

为什么要用B+树当索引而不是B树平衡二叉树:

B+树的特点:

(1) 关键字都出现在叶子结点的链表中,而且关键字恰好有序;

(2) 非叶子结点相当于索引,叶子结点相当于存储数据的数据层;

B+树[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Srum13PV-1618727025503)(C:\Users\Zhang\AppData\Roaming\Typora\typora-user-images\image-20210417184340410.png)]

B树 一个索引可以存储两个值 可以有效的降低树的高度提高查找速率

B树就是二叉搜索树。具有的特点如下:

(1)所有非叶子结点最多拥有两个儿子;

(2)所有结点存储一个关键字;

(3)非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树。

在这里插入图片描述

B+树 和hash 索引区别

  • hash索引更适合的是等值查询,B+树更适合范围查询
  • Hash索引没办法利用索引完成排序,Hash索引不支持最左匹配原则
  • 在有大量重复键值情况下,哈希索引存在哈希碰撞所以效率也是极低的

​ 建立索引的原则:选择唯一性索引,最左前缀原则. 为常作为查询的数据建立索引,限制索引的数目,删除不再使用或使用很少的索引.

索引失效的情况:

1 范围条件查询导致索引失效

2 .like 以通配符开头(%abc)导致索引失效 (解决方法:使用覆盖索引)

3 用or 来连接索引会失效

聚集索引非聚集索引

聚集索引 数据行的物理顺序与列值的逻辑顺序相同 innoDB 是聚集索引

(数据存储和索引放到了一起 ,表数据存储顺序和索引有关)

非聚集索引 逻辑顺序与磁盘上行的物理存储顺序不同 myisam 是非聚集

(数据和索引分开存储)

区别:

聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个

聚集索引存储记录是 物理上连续存在 ,而非聚集索引是 逻辑上的连续,物理存储并不连续

聚集索引查询数据速度快, 非聚集索引插入数据时速度快

聚集索引:物理存储按照索引排序;索引的键值逻辑顺序决定了表数据行的物理存储顺序。

如何通过索引定位到真实的数据的

在这里插入图片描述
左边是一个MYI的索引文件 右边是MYD 数据文件

以主键ID为索引的前提下:

树的每个节点都是主键ID 最后一层是叶子节点存放的是数据的地址值指向的是MYD数据文件

MYD文件有相应的地址值,通过这个地址值就能查到所有的数据

在这里插入图片描述

以主键ID为索引的前提下:

左边IDB文件是索引文件, B+树的每个节点只会存储一个主键ID,叶子节点存储全部数据

右边 IDB文件为辅助索引文件

比如把username 建立成一个辅助索引,辅助索引的每个节点存储的是相应的username,而叶子节点存的是主键ID

INNODB 索引走覆盖索引他的效率会快一些

比如只需要根据名字返回一个ID,innodb只需要走一遍辅助索引就可以了,

事务:事务是逻辑上的一组操作,要么都执行,要么都不执行

事务的四大特性:

A原子性 :不可分割

C一致性 :从一个正确的状态到另一个正确的状态

I 隔离性 :事务之间不被干扰

D持久性 :数据的改变是持久的

并发事务带来的问题和隔离级别:

脏读 :读到了未提交的数据

不可重复读 :一个事务两次相同的查询返回了不同的数据

幻读 :读到了不存在的数据

事务的隔离级别 :读未提交,读已提交,可重复读,可串行化;

事务的原理

原子性 : rollback 是原子性的具体体现,是根据undolog来实现的,undolog会记录进行的sql语句的执行信息,
回滚的时候会做相反的工作比如 undolog记录了一个插入语句,rollback 的时候就要进行delete.

持久性 : redolog 当向磁盘中写入数据的时候,会先把数据写入到BUFFER缓冲区,然后定期的将数据刷新到磁盘.
如果还没刷新到磁盘,mysql宕机,数据就会丢失.所以加入了redolog 当数据库的数据要进行新增或者修改的时候
要把相关的操作写入到redolog 即使宕机还能恢复数据.
(为什么redolog 写入磁盘比 Buffer 写入磁盘快, redolog 是 顺序IO,是在日志中进行追加操作,而buffer是随机IO)

隔离性 : 写写操作:加锁 innodb_locks可以查看锁信息

索引失效由行级锁变为表级锁

行级锁是操作同一行的时候,事务A提交之后事务B才能进行操作

表级锁是操作同一个表

间隙锁:在范围查询的时候加的锁,比如a 字段有 1,3,5 ,事务A在操作1~5的数据 事务B要插入2和4 要等 A提交之后才能插入

写读操作:MVCC

一致性 : 就是事务再执行的前和后数据库的状态都是正常的,表现为没有违反数据完整性
原子性、持久性和隔离性,都是为了保证数据库状态的一致性。

………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览