type
status
date
slug
summary
tags
category
icon
password
一·、什么是索引
官方定义:一种帮助mysql提高查询效率的数据结构
优点:加快查询速度
缺点:
- 需要额外的空间维护索引
- 增删改要维护索引,速度会变慢
二、索引分类(innodb)
- 主键索引(聚簇索引)
- 设置主键后数据库会自动建立索引
- 单值索引
- 一个索引值包含单个列,一个表可以有很多个单列索引
- 唯一索引
- 索引列值必须唯一,允许有空值,但只允许有一个
- 复合索引
- 一个索引包含多个列
三、创建索引
四、如何使用
- 在主键作为搜索条件的时候,就已经用到了主键索引也就是聚簇索引。
- 而如果使用其他字段作为搜索条件的时候,如果没有构建索引的话,其只能在存储中一个个比对,效率在很多数据的情况下会很差。而当这个字段建立了索引之后,再查询的话,则会用到索引,非簇拥索引。
五、B+树
既然说索引是一种数据结构,那么mysql的索引到底是一个什么样的结构呢?
先说结论,mysql的索引结构是B+树。
那么B+树到底是如何构建的呢?
首先先来看这样的一个情景,在一个表中插入了很多的无序数据。
查询之后会发现,他们是按照id顺序进行的排列。也就是说,在插入之后,数据库对数据进行了排序。为什么要排序呢。
![此图为插入数据存储时的样子](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F751ac22e-ce28-426c-a227-2b785897a15b%2FUntitled.png?table=block&id=b57d8ec5-6a02-4b32-b290-e8e082484424&t=b57d8ec5-6a02-4b32-b290-e8e082484424&width=1469&cache=v2)
这样存储在数据量大的时候就不方便查询了,于是就引入了分页的概念,相当于把所有的数据来分页管理,而且默认每页的存储16kb。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8aef743e-5000-4942-8bc6-1aaa1f7141bd%2FUntitled.png?table=block&id=9cdb4047-6c95-4fe9-9faf-ab2aa0e1d907&t=9cdb4047-6c95-4fe9-9faf-ab2aa0e1d907&width=1463&cache=v2)
有了页面,也不方便管理,要查询的时候也不知我需要查询的数据到底在那一页,于是就引入了页面的管理,也就是’页目录‘,在‘页目录’中存放了每一页的主键值和指针,指针指向的就是对于的页。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F3b6cebfd-e93b-4200-8fbb-ebfefe37ac5a%2FUntitled.png?table=block&id=a3705fa7-8d3a-4452-8689-19ead0133b75&t=a3705fa7-8d3a-4452-8689-19ead0133b75&width=1507&cache=v2)
这就是一颗B+树了,当然页目录也有存放大小,当页目录满的时候,就会再多出一层管理页目录的的页目录以此类推(套娃bushi),一般来说3层的这个结果已经可以存放很多数据了。
既然有B+树,那有B树嘛?
有,与B+树大致相同B树与B+树不同的是B树的每个节点都带有数据,
- B+树只有叶节点带有存储的数据,
- B+树所有的叶子节点都有一个链指针
- 数据记录都存放在页节点中的
六、聚簇索引与非聚簇索引
前面一直在提到主键是聚簇索引,到底什么是聚簇索引
- 聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
- 非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
非聚簇索引总是二次查找,首先非聚簇索引需要查找主键值,再拿到簇拥索引中再寻找。
那么为什么这里不存放数据直接的地址值呢?
是因为,如果数据发送增删改的话,其中的数据地址需要发生改变,而如果存放的是数据地址则需要花很多资源去维护非聚簇索引。(innodb)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fba94fbc4-544a-4d32-b131-4820c711933f%2FUntitled.png?table=block&id=ba9ee4af-c8b2-495a-8ca3-788ca6f8b179&t=ba9ee4af-c8b2-495a-8ca3-788ca6f8b179&width=401&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F17bf4218-becb-4330-a648-b7f3418ded36%2FUntitled.png?table=block&id=528c1e27-7df0-4868-b14b-cc1bf42e5034&t=528c1e27-7df0-4868-b14b-cc1bf42e5034&width=301&cache=v2)
聚簇索引需要注意什么?
主键尽量不要用uuid,太过离散,维护会消耗资源,尽量使用int这类的自增id,雪花算法生成的id
什么情况下不能使用索引?
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F7c14b434-743a-4913-8dba-fb480eb76b1d%2FUntitled.png?table=block&id=00c8448b-be74-4ef9-916c-6be60d5bdac7&t=00c8448b-be74-4ef9-916c-6be60d5bdac7&width=1111&cache=v2)
- Author:内河大魔王
- URL:https://ltyzqhh.top/article/mysql_index
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!