深入理解Mysql索引底层数据结构与算法
什么是数据结构
数据结构是计算机科学中的一个基础概念
数据结构(data structure)是带有结构特性的数据元素的集合
它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。
是指相互之间存在一种或多种特定关系的数据元素的集合。
数据结构决定了数据的存储、组织和访问方式。
常见的数据结构
-
数组(Array):是一组通过索引来访问元素的线性集合。
-
链表(Linked List):是通过指针链接在一起的线性集合。
-
栈(Stack):是一种LIFO(Last In First Out后进先出)的线性表。
-
队列(Queue):是一种FIFO(First In First Out先进先出)的线性表。
-
树(Tree):是一种分层的数据集合,通过树节点之间的链接关系组织数据。
-
图(Graph):是网络结构,由节点和边组成,表达对象之间的某种关系。
-
散列表(Hash Table):通过散列函数,直接访问存储在该表中的数据。
数据结构的设计与选用直接影响到程序的性能。针对不同的任务场景,选择合适的数据结构非常重要。掌握各种数据结构的特点以及它们之间的关系,是成为优秀程序员的基础。
数据结构研究的内容
就是如何按一定的逻辑结构,把数据组织起来,并选择适当的存储表示方法把逻辑结构组织好的数据存储到计算机的存储器里。
算法研究的目的是为了更有效的处理数据,提高数据运算效率。
数据的运算是定义在数据的逻辑结构上,但运算的具体实现要在存储结构上进行。
一般有以下几种常用运算
检索。检索就是在数据结构里查找满足一定条件的节点。
插入。往数据结构中增加新的节点。
删除。把指定的结点从数据结构中去掉。
更新。改变指定节点的一个或多个字段的值。
排序。把节点按某种指定的顺序重新排列。例如递增或递减。
什么是算法
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。
算法通常具有以下特征
- 有穷性 - 算法必须总能在执行有限步之后结束。
- 确定性 - 每一步都有明确定义的操作。
- 输入 - 算法有0个或多个输入。
- 输出 - 算法有1个或多个输出。
- 有效性 - 算法的每一步都必须正确。
- 可行性 - 每一步都可以完成的操作。
评价算法优劣的主要指标
一个算法的评价主要从时间复杂度和空间复杂度来考虑。
- 正确性 - 算法是否能够正确地解决问题,得出预期的结果。
- 时间复杂度 - 算法执行所需的计算步骤数量的增长率,反映算法的运行效率。常用大O符号表示。
- 空间复杂度 - 算法执行过程中所需要的内存空间大小的增长率。
- 可读性 - 算法的代码是否容易理解。
- 稳定性 - 相同的输入是否会得到相同的输出。
- 影响因素 - 算法性能是否容易受到输入数据大小、数据分布等因素的影响。
- 通用性 - 算法是否能够适用于更广范围的问题,而不仅仅是专为一个问题设计。
- 可扩展性 - 当输入数据规模扩大时,算法的性能是否能够扩大规模。
- 资源消耗 - 算法对计算资源的需求量。包括CPU时间、内存消耗等。
- 实用性 - 考虑算法的实现难度、调试难度以及使用成本。 综合考虑这些指标,选用总体性能最优的算法才是最重要的。实际应用中,不同指标可以根据需要进行权衡。
一些常见的算法示例
todo
索引的定义
索引是数据库系统中用来优化查询速度的数据结构。
索引的优点是可以显著提高数据库查询的效率,缺点是会占用额外存储空间,以及增加数据修改时的开销。
常见的数据库索引
- B树索引:最常见的索引类型,可以对数据进行排序和分块,支持等值查询和范围查询。
- 哈希索引:通过散列函数直接访问数据,速度极快,但只支持精确匹配,不支持范围查询。
- 全文索引:特殊的索引,优化数据库中的文本搜索,能实现较快的关键词搜索。
- 空间索引:存储地理空间数据的索引,可以优化空间数据的查询。
课程内容
学习数据结构网址 www.cs.usfca.edu/~galles/vis…
索引数据结构红黑树,Hash,B+树详解
树的高度决定了查询的次数,访问磁盘的次数
红黑树是一种自平衡二叉搜索树,它通过对节点着色并保持颜色平衡来确保树的平衡,具有以下特点
- 每个节点要么是红色,要么是黑色。
- 根节点必须是黑色。
- 红色节点不能连续(也就是说不能有两个连着的红色节点)。
- 从任一节点到其叶子节点的所有路径,必须包含相同数目的黑色节点。
B树是一种自平衡的树数据结构,通常用于数据库和文件系统之中,具有以下特点:
- 每个节点都包含数据项和指向子节点的指针。
- 每个节点中的数据项数目都保持在一个预定区间内,通常是节点占用空间的一半到两倍之间。
- 每个内部节点都有k个子节点(k是预定的区间值)。
- 数据项按键值的大小顺序存放在节点中。
- 节点中的数据项数量达到上限时,节点会分割,新的节点插入到父节点中。
- 若删除节点后的键值数量少于下限,则需要与兄弟节点融合。
B+Tree
-
非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
-
叶子节点用指针连接,提高区间访问的性能
-
仅叶子节点包含数据项(主键索引包含所有数据项;非主键索引包含主键id)
-
保证了数据项的一致性
-
增加了索引树的存储容量 ( (Innodb_page_size / (主键id + 指针))^(树高 - 1) * (主键id + 指针 + data) )
-
数据页分裂
Hash
- 仅能满足 “=”,“IN”,不支持范围查询
- 对索引的key进行一次hash计算就可以定位出数据存储的位置,查询高效
千万级数据表如何用B+树索引快速查找
表数据文件本身就是按B+Tree组织的一个索引结构文件
Mysql从根节点开始查找索引进行比较,
聚集索引&聚簇索引&稀疏索引到底是什么
索引按照物理实现方式,索引可以分为 2 种:
- 聚簇(聚集)和非聚簇(非聚集)索引
- 非聚集索引称为二级索引或者辅助索引
聚集索引 == 聚簇索引
稀疏索引不知道是啥玩意
为什么DBA总推荐使用自增主键做索引
使用整型自增主键可以减少索引空间占用,利于数值比较,可以减少数据页分裂,从而提高数据库性能。
联合索引底层数据结构又是怎样的
根据创建联合索引的字段顺序,依次进行排序
Mysql最左前缀优化原则是怎么回事
Mysql最左前缀优化原则是由Mysql索引构建方式决定的。如果跳过最左前列,后面的列未必是有序的。
总结
- 索引的本质是高效获取数据的排好序的数据结构
- 提高数据检索的效率
- 创建索引和维护索引要耗费时间和空间
Mysql把客户端输入的数据按照建表语句的要求进行顺序重组,然后根据查询条件利用索引再把数据拿回来
CREATE TABLE `test_dept`(
`id` BIGINT UNSIGNED AUTO_INCREMENT,
`name` VARCHAR(20) NOT NULL DEFAULT '',
`position` VARCHAR(13) NOT NULL DEFAULT '',
`age` TINYINT unsigned NOT NULL DEFAULT 0,
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
INDEX `idx_multi`(`name`,`age`,`position`)
);
INSERT INTO `test_dept` (`name`,`position`,`age`) VALUES
('Sally','novel',20),
('Alma','novel',25),
('Sally','Law',25),
('Alma','medicine',27),
('Sally','cartoon',35),
('Alma','medicine',44),
('Gina','cartoon',35);
#最左前缀测试
explain select * from `test_dept` where position = 'cartoon';
explain select * from `test_dept` where name = '' and position = 'cartoon';