MySQL索引(Index)

Index

数据库中的索引(Index)是一种数据结构,用于提高数据库查询性能和加速数据检索过程。索引可以看作是数据库表中某个或多个列的数据结构,类似于书中的目录,可以帮助数据库管理系统更快地定位和访问数据。它们是数据库优化的重要工具,特别是在处理大量数据时。

传统的Select搜索策略为:线性搜索,从数据集的开头开始,按顺序逐个比较每个元素,直到找到目标元素或者遍历完整个数据集。

而Index搜索策略为:B-Tree(平衡树)或者B+Tree。

B-Tree(平衡树)索引 : B-Tree 是一种常见的索引数据结构,适用于范围查询和等值查询。B-Tree 索引在数据库中广泛使用,它保持树的平衡,使得在平均情况下,每次搜索都能在 O(log n) 时间内找到目标。
B+Tree(平衡加强树)索引: B+Tree 是 B-Tree 的变种,更适合数据库系统,特别是范围查询。B+Tree 的叶子节点形成一个有序链表,可以支持高效的范围查询操作。

执行 CREATE INDEX 语句可以为数据中某个字段构建索引:

sql 复制代码
 CREATE INDEX index_name ON table_name (column_name);
 -- 在这里,index_name 是索引的名称(唯一),table_name 是表的名称,column_name 是要创建索引的列名。
 
 show index from table_name ; 
 -- 查看索引
 drop index index_name on table_name;
 --删除索引

另外需要注意,MySQL为了支持高速搜索,有一些字段或变量默认情况下会自动使用索引。

主键(Primary Key): 在创建表时指定的主键列会自动创建主键索引,确保该列的值唯一且非空。主键索引是一种特殊的唯一性索引,通常用于唯一标识表中的每一行数据。

唯一性约束(Unique Constraint): 在创建表时指定的唯一性约束会自动创建唯一性索引。唯一性索引确保该列的值在表中是唯一的,但允许包含空值。

外键(Foreign Key): 在创建外键时,被引用的列会自动创建索引,以加速连接操作。这个索引通常是 B-Tree 索引。

自动递增列(Auto-Increment Column): 在 MySQL 中,使用自动递增的整数值作为主键,例如 AUTO_INCREMENT 列,会自动创建 B-Tree 索引。

Index的优势与劣势

优势:

提高数据查询效率,降低数据的IO成本。

通过索引对数据进行排序,降低数据排序的成本,降低CPU消耗。
劣势:

索引会占用存储空间。

索引在大大提高查询效率的同时,也降低了insert,update,delete的效率。

B-Tree

B-Tree的结构:

每个节点可以存储多个Key(有n个key就有n个指针)

所有数据都存储在叶子节点,非叶子节点仅用于索引数据

叶子节点形成一个双向链表,便于数据的排序以及区间范围的查询。

如下是B-Tree查询的伪代码

javascript 复制代码
function search_btree(node, key):
    // 在当前节点中查找 key
    i = 1
    while i <= node.num_keys and key > node.keys[i]:
        i = i + 1
    
    // 如果 key 等于节点中的某个 key,返回找到的节点
    if i <= node.num_keys and key == node.keys[i]:
        return node
    
    // 如果是叶子节点,表示 key 不存在
    if node.is_leaf:
        return NULL
    
    // 否则,继续在相应子节点中查找
    else:
        read child_node from disk at node.children[i]
        return search_btree(child_node, key)

这个伪代码描述了 B-Tree 的查询操作。主要步骤包括:

在当前节点中查找给定的 key,找到一个最小的 i,使得 key 小于等于 node.keys[i]。

如果在当前节点中找到了 key,说明查询成功,返回当前节点。

如果在当前节点中未找到 key,且当前节点是叶子节点,表示 key 不存在,返回 NULL。

如果在当前节点中未找到 key,且当前节点不是叶子节点,进入相应的子节点,继续查找。

重复上述步骤,直到找到 key 或者到达叶子节点。

需要注意的是,B-Tree 的查询操作是一个递归过程,通过逐层查找直到叶子节点。这种策略可以在平均情况下保持 O(log n) 的时间复杂度,从而实现高效的数据检索。

相关推荐
Matrix703 分钟前
HBase理论_HBase架构组件介绍
大数据·数据库·hbase
不太灵光的程序员5 分钟前
【HBase分布式数据库】第七章 数据的导入导出 importtsv导入数据
数据库·分布式·hbase
Mephisto.java10 分钟前
【大数据学习 | HBASE高级】region split机制和策略
数据库·学习·hbase
大气层煮月亮19 分钟前
python调用MySql详细步骤
数据库·mysql
Yawesh_best22 分钟前
MySQL(5)【数据类型 —— 字符串类型】
android·mysql·adb
Code哈哈笑28 分钟前
【MySQL 保姆级教学】详细讲解视图--(15)
数据库·mysql
x2lab1 小时前
国产化 ARM 环境mysql-mariadb 部署
arm开发·mysql·docker·mariadb
哭哭啼1 小时前
Redis环境部署(主从模式、哨兵模式、集群模式)
数据库·redis·缓存
咕噜Yuki06092 小时前
OCP证书如何下载?
数据库·ocp·证书查询
冬瓜3122 小时前
linux-c 使用c语言操作sqlite3数据库-1
数据库·sqlite