mysql的索引是什么?

mysql的索引是什么?

Scroll Down

索引

1 索引是什么

​ 索引是一种排好序的数据结构,它能帮助mysql高效获取数据。

2 索引可能的类型

2.1 hash表

哈希表是做数据快速检索的有效利器,通过将关键值(key的hashcode()方法得到hashcode)也就是key通过一个hash函数(hash算法)加工处理之后得到一个值(hash表的索引),这个值就是数据存放的位置,我们就可以根据这个值快速的找到我们想要的数据

如果使用哈希算法实现的索引,范围查找怎么做呢?一个简单的思路就是一次把所有数据找出来加载到内存,然后再在内存里筛选筛选目标范围内的数据,这样的话效率就很低。

在进行某个值的差查找的时候用hash做索引会非常快,但是在进行范围查找的时候效率就会非常低。

2.2 搜索二叉树

在数据库中,主键一般默认都是自增的,如果采取二叉树这种数据结构作为索引,就会出现树的不平衡状态,导致查找效率降低,因此,简单的搜索二叉存在不平衡导致的检索性能降低的问题,不能直接用于实现 Mysql 底层索引的。

2.3 AVL树和红黑树

1 当数据是自增时,红黑树一直是右倾的趋势,查找效率也很低

2 AVL 树不存在红黑树的“右倾”问题,但是每一个树节点只存储了一个数据,我们一次磁盘 IO 只能取出来一个节点上的数据加载到内存里,而数据库查询数据的瓶颈在于磁盘 IO,所以设计数据库索引时需要首先考虑怎么尽可能减少磁盘 IO 的次数。

查阅可知,磁盘 IO 有个有个特点,就是从磁盘读取 1B 数据和 1KB 数据所消耗的时间是基本一样的,所以可以在一个树节点上尽可能多地存储数据。

这就是 B 树,B+树的的设计原理了。

2.4 B树

image.png
B树的优点:

  1. 优秀检索速度,时间复杂度:B 树的查找性能等于 O(h*logn),其中 h 为树高,n 为每个节点关键词的个数;
  2. 尽可能少的磁盘 IO,加快了检索速度;
  3. 可以支持范围查找。

2.5 B+树

image.png

第一,B 树一个节点里存的是数据,而 B+树存储的是索引,所以 B 树里一个节点存不了很多个数据,但是 B+树一个节点能存很多索引,B+树叶子节点存所有的数据。

第二,B+树的叶子节点是数据阶段用了一个链表串联起来,便于范围查找

3 Innodb 引擎和 Myisam 引擎的

Innodb 创建表后生成的文件有:

聚集索引方式:通俗的理解就是,数据文件和索引文件是放在一起的

image.png

  • frm:创建表的语句
  • idb:表里面的数据+索引文件

image.png

Myisam 创建表后生成的文件有

非聚集索引方式:通俗的理解就是,数据文件和索引文件没放在一起

image.png

  • frm:创建表的语句
  • MYD:表里面的数据文件(myisam data)
  • MYI:表里面的索引文件(myisam index)
    image.png