MYSQL_05mysql索引的数据结构
2023-04-13 14:47:56 17 举报
AI智能生成
mysql索引的数据结构
作者其他创作
大纲/内容
为什么使用索引
假如不使用索引的话,造成全文索引,加入索引的话,它的速度就会快上很多。
假如我们需要查字典的话,索引就像我们的目录一样,没有索引,我们就只能一页一页去找。
而加上索引之后,我们可以根据目录来快速查找我们所需要的东西
而加上索引之后,我们可以根据目录来快速查找我们所需要的东西
为了减少磁盘 I/O 的次数,加快查询速率
索引概述
索引(Index)是帮助MySQL高效获取数据的数据结构
索引是数据结构
排好序的快速查找数据结构
优缺点
优点
提高数据检索的效率,降低 数据库的IO成本
通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性
在实现数据的参考完整性方面,可以 加速表和表之间的连接
减少查询中分组和排序的时间 ,降低了CPU的消耗
缺点
创建索引和维护索引要 耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。
索引需要占磁盘空间 ,除了数据表占数据空间之外,每一个索引还要占一定的物理空间, 存储在磁盘上 ,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸
虽然索引大大提高了查询速度,同时却会 降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
B+Tree
不论是存放用户记录的数据页,还是存放目录项记录的数据页,我们都把它们存放到B+树这个数据结构中
InnoDB 页的大小默认是 16kb
聚簇索引
一种数据存储方式(所有的用户记录都存储在了叶子节点)
所谓的索引即数据,数据即索引
"聚簇"表示数据行和相邻的键值聚簇的存储在一起
特点
使用记录主键值的大小进行记录和页的排序
页内 的记录是按照主键的大小顺序排成一个 单向链表
各个存放 用户记录的页 也是根据页中用户记录的主键大小顺序排成一个 双向链表
存放目录项记录的页 分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个 双向链表
B+树的 叶子节点 存储的是完整的用户记录
就是指这个记录中存储了所有列的值(包括隐藏列)
优点
数据访问更快 ,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快
聚簇索引对于主键的 排序查找 和 范围查找 速度非常快
按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以 节省了大量的io操作 。
缺点
插入速度严重依赖于插入顺序
按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能
对于InnoDB表,我们一般都会定义一个自增的ID列为主键
更新主键的代价很高
因为将会导致被更新的行移动
对于InnoDB表,我们一般定义主键为不可更新
限制
对于MySQL数据库目前只有InnoDB数据引擎支持聚簇索引,而MylSAM并不支持聚簇索引
由于数据物理存储排序方式只能有一种,所以每个MySQL的表只能有一个聚簇索引。一般情况下就是该表的主键
如果没有定义主键,Innodb会选择非空的唯一索引代替。如果没有这样的索引,Innodb会隐式的定义一个主键来作为聚簇索引
为了充分利用聚簇索引的聚簇的特性,所以innodb表的主键列尽量选用有序的顺序id,而不建议用无序的id,比如UUID、MD5、HASH、字符串列作为主键无法保证数据的顺序增长
回表
以某一列大小排序的B+树只能确定我们要查找记录的主键值,所以如果我们想根据某一列的值查找到完整的用户记录的话,仍然需要到聚簇索引中再查一遍
非聚簇索引的存在不影响数据在聚簇索引中的组织,所以一张表可以有多个非聚簇索引。
联合索引
多个列的大小作为排序规则,也就是同时为多个列建立索引
注意事项
根页面位置万年不动
内节点中目录项记录的唯一性
0 条评论
下一页