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

一、数据库引擎

什么是存储引擎?
百度:MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

一句话:通过不同的存储技术和索引技巧来将数据存储在文件或者内存中,提升对数据操作的速度或者提供额外的功能。

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

InnoDB存储引擎
建表执行时,会生成三个文件:.frm、.ibd
.frm:建表语句,表结构
.ibd:表的数据+索引文件
1.支持事务
2.支持外键
3.行级锁
4.支持崩溃后的安全恢复
5.主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;
6.查询速度慢于Innodb
因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问主键索引;

MyISAM存储引擎
建表执行时,会生成三个文件:.frm、.MYD、.MYI
.frm:建表语句,表结构
.MYD:表里面的数据文件
.MYI:表里面的索引文件
1.不支持事务,但操作是原子性的
2.不支持外键
3.表级锁
4.不支持崩溃后的安全恢复
5.采用非聚集索引,索引文件的数据域存储指向数据文件的指针。
6.查询速度更快
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+树一个节点可以存储多条数据,那么也就减少树的深度,也就减少了查询次数。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值