mysql 索引

  • Post author:
  • Post category:mysql




为什么要使用索引?

我们可以将索引理解为书的目录,通过索引可以使查询效率更高。


主键默认是添加索引的。



什么是索引?

索引是帮助 MySql 高效获取数据的

数据结构

例如:主键 。 主键会默认添加索引。

主键维护在一个 B+ 树中,保持这条记录的物理地址。



索引的优劣势


优势:

  • 提高了查询效率(有 B+ 数排序,把索引数据加载到内存中),减少了 IO 次数。
  • 索引使用 B+ 树结构,是有序的,排序是比较快捷方便,减少了CPU 的消耗。


劣势:

  • 索引需要空间来存储和维护
  • 执行新增、修改、删除操作时,需要对索引进行结构的更新



添加索引的原则



1.哪些情况适合建立索引?

  1. 主键:默认添加唯一索引
  2. 作为查询条件的列
  3. 作为外键关联的列
  4. 排序的列
  5. 分组的列



2.哪些情况不适合添加索引?

  1. 表记录很少的(例如系统参数设置表)
  2. 不作为查询条件的列
  3. 增删改较为频繁的表,最好为需要的列来添加
  4. 数据重复度较高的(如性别)



索引分类

  1. 主键索引

    primary key 主键列自动会添加索引
  2. 单值索引/单列索引

    一个索引对应一个列
  3. 唯一索引

    列的值是唯一性的
  4. 组合索引

    一个索引中包含多个列
  5. 组合索引最左前缀原则

    例如:a、b、c 3列,a、b 列创建了组合索引,在查询时,必须要满足最左侧索引原则,否则索引失效。(最左侧索引原则:在使用组合索引时,最左侧的列必须被使用到,否则索引失效)
  6. 全文索引

    mysql 8 之后 innodb 引擎开始支持全文索引,使用全文索引可以代替 like 实现模糊查询,索引不会失效。



mysql 索引的数据结构

在这里插入图片描述

mysql 索引使用 B+ 树结构存储索引

B+ 树是有序的,每个节点可以存储多个数据(横向扩展)

非叶子节点不存储数据,只存储索引,一个节点中就可以存储多个索引

所有的数据存储在叶子节点中,每个叶子节点之间有指针指向

使用索引有序的节省了排序时间,一个节点中可以存储多个元素,从而使树高度降低了,并且叶子节点之间有指针,便于区间范围查询。



聚簇索引和非聚簇索引

聚簇索引:找到索引就找到了数据。

例如:innodb 引擎。索引和数据在同一个文件中,找到索引也就可以找到数据。(使用主键作为条件进行查询;如果使用其他列进行查询的话,查询的结果就只有自己)

非聚簇索引:找到了索引以后,还需要回表查询。

例如:myisam 引擎。索引和数据不在同一个文件中,找到索引后,就要去存储数据的文件中查找数据。

innodb 非聚簇:使用其他列作为条件进行查询,查询结果除了本列以外还有其他列的内容,这种情况就需要通过该列先查询到主键,然后通过主键再次回表查询数据。



版权声明:本文为qq_46381044原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。