MySQL(一)---存储引擎及索引

纵饮孤独 提交于 2019-11-25 22:52:14

存储引擎

为了达到不同的效果,mysql设计了不同的数据库引擎,我们最常用的就是innodb和myisam两个存储引擎,innodb设计目标是对数据的处理,而myisam追
求的是性能,两者产生的差异也是基于这点。在创建表的时候,innodb被用作默认引擎,可以在创建表的时候指定存储引擎,请自行google建表语句。

1. myisam只支持表级锁 innodb支持行级锁
2. myisam不支持事务 innodb支持事务
3. myisam不支持外键 innodb支持外键
4. myisam支持全文索引,innodb不支持
5. myisam本身存储了表的总数据行,innodb没有存储,查总行数myisam更快,如果加了查询条件两者就没有区别了

在业务处理中,基本上选择的都是innodb引擎,就是崩溃后,能够对数据进行修复

索引

索引有多种,B树系列索引、hash索引、全文索引等。Mysql一般使用B+树作为其索引结构

  1. 聚簇索引---非聚簇索引

    (1)聚簇索引,聚簇:术语表示数据行和键值紧凑地存储在一起,也就是说,索引列数据与其他列的数据是存在一起的,所以聚簇、所以索引、所以聚簇索引,所以聚簇索引不单单是一个索引类型,还是一个数据存储。在mysql中,聚簇索引使用B+tree实现,并被用于innodb存储引擎中。

    在innodb存储引擎中,表的主键被默认为聚簇索引列,如果没有定义主键,innodb会选择一个唯一且非空的索引进行代替,如果再没有,那么innodb会隐式的创建一个主键列,用于聚簇索引列。

    因为索引列与其他列存在一起,所以无法将数据放在两个不同的地方,所以每张表只能有一个聚簇索引,可以直白的说,innodb引擎的表结构就是聚簇索引。请理清关系,聚簇索引是一种数据类型,innodb是引擎,innodb引擎与聚簇索引是“使用”的关系,是innodb存储引擎通过B+Tree树的数据结构实现并使用了聚簇索引,实现聚簇索引的方式可能有多种。

    B+Tree树数据结构:

    (2)非聚簇索引,除了聚簇索引外的都是非聚簇索引,没有开玩笑。在这两个引擎中,只有innodb的主键的索引使用的是聚簇索引,其他的所有索引都是非聚簇索引,即使myisam主键的索引也不是聚簇索引。

  2. 主键索引---辅助索引

    除了有聚簇索引、非聚簇索引之分外,mysql中还有一个概念:主键索引、辅助索引。人如其名,就是字面意思,主键索引就是主键索引,辅助索引,就是除了主键索引外建立的其他索引是辅助索引。

明白了以上两个概念,通过例子解释来看一下这两个引擎工作方式的设计吧,更形象一点:

示例数据:

格式:

通过上图,你也看到了innodb的主键索引(聚簇索引)、辅助索引,以及myisam的主键索引、辅助索引,innodb中的辅助索引,存的是索引列+主键,也就是说,innodb的表通过辅助索引查询时,会根据辅助索引获取到主键,然后再根据主键获取记录,也就是发生了两次索引查找。而myisam引擎的设计主键索引、辅助索引,存的格式一样:索引列+物理地址,与innodb截然不同,也就是说myisam引擎的索引是独立的索引树,只发生了一次索引查询。

是不是感觉innodb的辅助索引这样的设计,效率会很低?不一定:

优势:
    1. 因为inndo引擎的聚簇索引使用的是B+树实现的,所以每个节点上有多条记录,当访问这条记录是,会把这个叶子中的记录加载到Buffer中,查找的
       方式同CPU的方式一样,首先都去缓存中查找,没有再去内存中,然后硬盘中找。所以,在查另一条数据的时候,直接在内存中完成了。
    2. 辅助索引使用主键作为"指针"而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针
       会让辅助索引占用更多的空间,换来的好处是InnoDB在移动行时无须更新辅助索引中的这个"指针",也就是用空间换时间。你想啊,如果你用物理地
       址作为指针,那么在新增或删除记录时,会导致叶子节点拆分,那么这个物理地址也就得要改变,那么就要去维护这个指针。
    3. 又可以看到聚簇索引索引列和其他列在一起,所以在排序上,查出来后的记录就随着索引列是有序的,myisam存的是地址,所以需要额外开销继续处
       理

劣势:
    1. 首当其冲就是如果主键值过大,那么辅助索引也会很大
    2. 维护索引,就要设计到性能开销,当涉及到大量的新增、删除的时候,也会涉及到拆页、组页,建议选择低峰时间
    3. 尽量选择自增,如果选择随机的话,新增记录就有可能插入到原有数据之间,有可能会涉及到大量的拆页、组页(如上动图)

接上文

  1. 唯一索引 这个没啥可说的,就是字面意思,设置该列为当前列中的值不能重复的索引,可为null。
  2. 单值索引--复合索引 就是在单个列上建立索引,复合索引,当然也就是多个列建立了一个组合,用来作为索引。
  3. 全文索引 myisam提供的了全文索引,我没多做了解,但是我相信如果你明白了上面的概念,全文索引不在话下

我认为聚簇索引与非聚簇索引更多的体现在了存储结构上,唯一索引、单值索引等体现更多的是在处理时的逻辑控制上。  

参考博客:https://www.jianshu.com/p/fa8192853184

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!