MySQL索引实现原理

本文详细介绍了MySQL中B+树索引的原理,包括查找、插入和删除的过程,以及索引的分类,如聚集索引、辅助索引、联合索引和覆盖索引。此外,还探讨了哈希索引和全文索引的实现,包括自适应哈希索引和倒排索引。通过这些内容,读者将更好地理解如何优化MySQL的查询性能。

       要提升查询效率一般会想到用索引,在数据库中,如果索引太多,应用程序的性能可能会受到影响,如果索引太少,又会对查询性能产生影响。所以,需要寻找一个平衡点,足够多的索引带来查询性能提高,又不因为索引过多导致修改数据等操作时负载过高。

这里主要讲,B+树索引,索引的分类,哈希索引,全文索引,这个几个方面讲解

B+树索引:索引的查找、 索引的插入、索引的删除

索引的分类:聚集索引、辅助索引、联合索引、覆盖索引

哈希索引:哈希算法、自适应哈希索引

全文索引:倒排索引、全文检索索引缓存、全文索引的一些限制

InnoDB支持3种常见索引,我们接下来要详细讲解的就是 B+ 树索引,哈希索引,全文索引。

B+树索引

1、B+树中的B不是代表的二叉(Binary) ,而是代表平衡(Balance),因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树。

2、B+树是为磁盘或其他直接存取辅助设备设计的一种平衡查找树,在B+树中,所有的记录节点都是按照键值大小顺序存在同一层的叶子节点,由叶子节点指针进行相连。

3、B+树在数据库中的特点就是高扇出,因此在数据库中B+树的高度一般都在2~4层,这也就是说查找一个键值记录时,最多只需要2到4次IO,当前的机械硬盘每秒至少可以有100次IO,2~4次IO意味着查询时间只需要0.02~0.04秒。

4、B+树索引并不能找到一个给定键值的具体行,B+树索引能找到的只是被查找的键值所在行的页,然后数据库把页读到内存,再内存中进行查找,最后找到要查找的数据。

5、数据库中B+树索引可以分为,聚集索引和非聚集索引,但是不管是聚集索引还是非聚集索引,其内部都是B+树实现的,即高度是平衡的,叶子节点存放着所有的数据,聚集索引和非聚集索引不同的是,叶子节点是否存储的是一整行信息。每张表只能有一个聚集索引。

6、B+树的每个数据页(叶子节点)是通过一个双向链表进行链接,数据页上的数据的顺序是按照主键顺序存储的。

先来看一个B+树,其高度为2,每页可以放4条记录,扇出为5。

图:一颗高度为2的B+树

 

索引的查找

B+树索引使用二分法查找,也称折半查找法,基本思想就是:将记录有序化(递增或递减)排列,在超找过程中采用跳跃式方式查找,既先以有序数列的中心点位置比较对象,如果要查找的元素小于该元素的中心点元素,则将待查找的元素缩小为左半部分,否则为右半部分,通过一次比较,将查找区间缩小一半。

如图所示,从有序列表中查找 48,只需要3步:

图:二分法查找

 

索引的插入

B+树的查找速度很快

### MySQL 唯一索引实现方式和工作原理MySQL 中,唯一索引确保表中的特定列不包含重复值。创建唯一索引可以防止应用程序错误并提高查询性能。 #### 创建唯一索引的方法 可以通过两种主要方法来创建唯一索引: - 使用 `CREATE INDEX` 语句时指定 `UNIQUE` 关键字。 ```sql CREATE UNIQUE INDEX idx_unique ON table_name (column_name); ``` - 或者,在定义表结构时通过 `ALTER TABLE` 添加唯一约束。 ```sql ALTER TABLE table_name ADD UNIQUE (column_name); ``` 这两种方法都会强制执行该字段内的数据不允许有重复项[^1]。 #### 存储引擎支持 不同存储引擎对唯一索引的支持有所不同。InnoDB 和 MyISAM 是最常用的两个存储引擎,它们都提供了对唯一索引的良好支持。对于 InnoDB 表来说,如果违反了唯一性约束,则会抛出异常;而对于 MyISAM 表而言,当遇到冲突时只会发出警告而不阻止操作继续进行。 #### 工作机制 当向具有唯一索引的表中插入新记录或更新现有记录时,数据库管理系统会在内部自动检查即将写入的数据是否已经存在于对应的索引节点上。具体过程如下: - 插入前先查找目标位置; - 如果发现相同的关键字则拒绝此次修改请求,并返回相应的错误信息给客户端应用层处理; - 否则允许完成正常的增删改动作并将新的关键字加入到 B+Tree 结构里去维护整个树形结构平衡状态以便后续高效检索使用[^3]。 ```python def insert_with_unique_check(table, column_value): try: cursor.execute(f"INSERT INTO {table} VALUES ({column_value})") connection.commit() except IntegrityError as e: print("Duplicate entry found:", str(e)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值