mysql数据库引擎,各类索引详解

一、数据库引擎

数据库引擎有三类:InnoDB,MyISAM,MEMORY。其中InnoDB,MyISAM最常用,区别如下:

InnoDB存储引擎
1.支持事务
2.支持外键
3.行级锁
4.支持崩溃后的安全恢复
5.主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;
因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问主键索引;

MyISAM存储引擎
1.不支持事务,但操作是原子性的
2.不支持外键
3.表级锁
4.不支持崩溃后的安全恢复
5.采用非聚集索引,索引文件的数据域存储指向数据文件的指针。

MEMORY
所有的数据都在内存中,数据的处理速度快,但是安全性不高。

二、索引类型

1.从逻辑角度

1).普通索引:普通索引是最基本的索引,它没有任何限制,允许在定义索引的列中插入重复值和空值
2).唯一索引:索引列的值必须唯一,允许有空值,如果是组合索引,列值的组合必须唯一
3).主键索引:主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的时候指定主键,主键默认就是主键索引
4).组合索引:多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用
例如:建立索引(a,b,c),那么只有搜索a,ab,abc时才会用到索引
5).全文索引:索引类型为FULLTEXT,允许有重复值和空值,可以在char、varchar、text类型的列上创建,Mysql中MyISAM和InnoDB存储引擎都支持。主要用来查找文本中的关键字,而不是直接与索引中的值比较,它更像是一个搜索引擎,全文索引需要配合match against操作使用,而不是一般的where语句加like
6).空间索引:空间索引是对空间数据类型的字段建立的索引,Mysql中的空间索引类型有4种,GEOMETRY、POINT、LINESTRING、POLYGON,创建空间索引的列,必须将其声明为not null,Mysql中只有MyISAM存储引擎支持创建空间索引

2.从物理角度

聚集索引:数据行的物理顺序与列值的顺序相同,聚集索引中索引的叶节点就是数据节点
非聚集索引:数据行的物理顺序与列值的顺序不同,非聚集索引的叶节点仍然是索引节点,只不过有一个指针指向相应的数据块
详情介绍请查看另一篇博客:https://blog.csdn.net/weixin_43896829/article/details/104676139

3.从数据结构角度

1).hash索引:
hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。那么这就有一个很大的限制,hash索引只能进行等值查询,不能进行范围查询
2).B+Tree索引:
B+树底层实现是多路平衡查找树.对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据.这样就可以进行范围查询。

另:InnoDB和MyISAM存储引擎默认使用的是B+Tree索引,Mermory默认使用的是hash索引

4.索引的缺点,索引不适用的场景

第一, 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二, 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三, 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。比如当我们一个表创建好了索引,但我们又插入了一条数据,此时,该数据的索引需要插入索引表,还需要插入原数据库表,这样就更加耗时。
第四,索引的创建不适合大文本或者超长字段,例如image,text,因为这些数据取值很大,或者数据量少。
不适用:添加删除多,查找少。数据表中数据很少的时候。

三、为什么数据库采用B+树,不用B树,红黑树?

因为B+树的数据都在叶子节点,非叶子结点只存索引。
那么当select多条记录时,便可不用跨层访问,只需扫描叶子节点即可,而且我们知道B+树一个节点可以存储多条数据,那么也就减少树的深度,也就减少了查询次数。

你可能感兴趣的:(mysql数据库引擎,各类索引详解)