Mysql存储引擎、索引以及锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Stream_who/article/details/86320275

一、存储引擎基本概念

1. 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式
2. 存储引擎是基于表的,而不是基于库的。所以存储引擎也可被称为表类型
3. Oracle,SqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构。所以MySQL存在多种存储引擎,可以根据需要使用相应引擎,或者编写存储引擎
4. InnoDB的选择场景
1)更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求

2)事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎

3)自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复

4)外键约束。MySQL支持外键的存储引擎只有InnoDB

5)支持自动增加列AUTO_INCREMENT属性


二、InnoDB

1. 从MySQL5.5.8,InnoDB成为MySQL默认的存储引擎。MySQL从3.23.34a开始支持InnoDB
2. 特性
1)InnoDB支持事务,主要面向OLTP(联机事务处理过程)数据库应用

2)支持行锁,支持外键,并支持类似于Oracle的行锁定读,即默认读取操作不会产生锁

3)InnoDB存储引擎中支持自动增长列AUTO_INCREMENT。自动增长列的值不能为空,且值必须唯一,且必须为主键。在执行插入操作时,若不指定自动增长列的值,或自动增长列的值为0或NULL,则插入的值为自动增长后的值

4)InnoDB存储引擎中,创建的表的结构存储于.frm文件中。数据和索引存储在innodb_data_home和innodb_data_path表空间中

5)对于表的数据存储,InnoDB存储引擎采用了聚集的方式,每张表的存储都是按主键顺序进行存放。若没有显示地在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

6)InnoDB通过多版本并发控制(MVCC)来获得高并发性,并实现了SQL标准的4种隔离机制,默认为REPEATABLE级别。同时使用一种被称为next-key locking的策略来避免幻读。InnoDB还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能

三、索引

1. 基本概念
1)索引的原理是因为使用了B+树结构,InnoDB的聚簇索引是索引(主键)和数据在一起。

2)索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引

3)索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间
2. 索引的优点与缺点
1)优点

	(1)所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引

	(2)大大加快数据的查询速度

2)缺点

	(1)创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

	(2)索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

	(3)当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度	
3. 索引分类
1)单列索引(一个索引只包含单个列,但一个表中可以有多个单列索引)

	(1)普通索引	MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点

	(2)唯一索引   索引列中的值必须是唯一的,但是允许为空值

	(3)主键索引   不允许有空值

2)组合索引

	(1)在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合

3)全文索引

	(1)在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行

	(2)全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引

4)空间索引

	(1)空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON

	(2)在创建空间索引时,使用SPATIAL关键字
4. 聚簇索引与非聚簇索引
1)聚簇索引的顺序就是数据的物理存储顺序,所以一个表最多只能有一个聚簇索引

2)除了聚簇索引,其他都是非聚簇索引,需要先查自己某个字段的索引顺序,再查聚簇索引(数据顺序)	

四、InnoDB的锁

1. 悲观锁和乐观锁
1)悲观锁

	(1)每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁

	(2)传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁

	(3)它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态

	(4)悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)

2)乐观锁

	(1)不会加锁, 但是更新的时候会进行判断, 判断跟原始的数据一不一样,返回受影响行数, 如果不一样,他会返回受影响的行数为0, 如果一样,会返回受影响的具体数量, 我们可以通过返回值,来采取对应的措施,比如回滚还是从新执行一遍		

	(2)每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制

	(3)乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁

2. 按粒度大小分类

1)表级锁(开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低)

	意向锁是InnoDB自动加的,不需用户干预

	(1)意向共享锁(IS)

	(2)意向排它锁(IX)

2)行级锁(开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高)	

	(1)共享锁(S锁)

		a. 也叫读锁,用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源

		b. 多个事务可封锁同一个共享页

		c. 任何事务都不能修改该页

		d. 通常是该页被读取完毕,S锁立即被释放

	(2)排它锁(X锁)

		a. 也叫写锁,表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了

		b. 仅允许一个事务封锁此页

		c. 其他任何事务必须等到X锁被释放才能对该页进行访问

		d. X锁一直到事务结束才能被释放

3)页级锁(开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般)	

4)间隙锁(Next-key锁)		

	(1)当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁

	(2)对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁(Next-Key锁

	(3)它的作用是防止幻读

在这里插入图片描述

3. 显式加锁(事务可以通过以下语句显式给记录集加共享锁或排他锁)
1)共享锁(S):  SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

2)排他锁(X): SELECT * FROM table_name WHERE ... FOR UPDATE
4. 死锁

参考网址

一篇文章带你读懂 MySQL 和 InnoDB

MySQL存储引擎

MySql-InnoDB-缓存管理

MySQL InnoDB 索引原理

MySQL的InnoDB索引原理详解

MySQL中的实例、数据库的关系

MySQL索引背后的数据结构及算法原理

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

MySQL的并发控制与加锁分析

Mysql锁

MySQL索引及其实现原理

注:文章是经过参考其他的文章然后自己整理出来的,有可能是小部分参考,也有可能是大部分参考,但绝对不是直接转载,觉得侵权了我会删,我只是把这个用于自己的笔记,顺便整理下知识的同时,能帮到一部分人。
ps : 有错误的还望各位大佬指正,小弟不胜感激

猜你喜欢

转载自blog.csdn.net/Stream_who/article/details/86320275