索引(一)|学习笔记

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 快速学习索引(一)

开发者学堂课程【数据库核心概念:索引(一)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/63/detail/1144


索引(一)


例:基本上应聘高新12以上岗位一定会考 SQL,面试官一定不会问如何建表(问题太过基础),但九成会考索引,笔试和面试都有此类型的题目。

回答问题时严禁说:索引像新华字典前的目录,通过目录可以找到想要查找的字;不要这样回答问题。

索引为什么在 SQL 中那么重要,SQL 的调整都是考索引。

MySQL 官方对索引的定义为:索引 Index (Index 有多种含义,Index 在数组中叫下标;而在数据库中叫索引;在 get 中是转存区)是帮助 MySQL 高效获取数据的数据结构(即在回答面试官时首先要说明索引是数据结构)。

可以得到索引的本质:索引是数据结构。

为什么建立索引?

在完成建表后需要查询字段信息,Java,Oracle,MySQL 等等如果没有进行排序,字段全部没有顺序例如执行语句  bookname=sql 如果数据量很大,且没有按一定顺序排序那么会从开始挨个查找数据;如果按26个英文字母对数据排序,可以同过 mysql 首字母 m 定位到区域不需要从 a 排查到 z。

索引的目的在于提高查询效率,可以类比字典。如果要查“mysql'”这个单词,我们肯定需要定位到 m 字母,然后从下往下找到y字母,再找到剩下的 s,q,l;如果没有索引,那么你可能需要 a--z,如果我想找到 Java 开头的单词呢?或者 Oracle 开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成?

索引提高查找效率。排好序的快速查找数据结构就是索引。在 bookname 中查找 mysql,没有排序可能需要 a--z,如果排过序可以直接找到 m。索引查找快速最基本是已经过排序,索引有两大功能第一个查找快,第二个排好序即索引用于排序和快速查找。定位的,建的索引会影响到 SQL 的两部分。

一个是 where 后的条件约束是否用到索引,他们复杂查找条件过滤,索引会影响 where 后的查找和 order by 排序。索引会影响查找和排序两大功能。SQL 语句不是随便编写,而是有一定顺序。

排好序的快速查找数据结构其中数据结构指什么?

是栈,队列还是其他数据结构。在数据库中 frm 代表表的结构,框架;第二个建完表后像表中添加数据(例如学校图书馆中图书会分门别类的摆放,不论是借书还是还书,例如去结束找到书后扫描书上二维码,去图书馆管理系统也好,整个图书馆其中的藏书相当于数据库中的表,这是需要借一本射雕英雄传,金庸的武侠小说,查找后告诉在二楼三号柜四号抽屉第五个格子中,可以瞬间精确定位。如果没有排序,而图书有一千万册,那么需要进行全书扫描)刚刚还介绍一个索引叫 MyI,假设本人是图书管理员,后面是图书,别人来借书,从电脑上查找,在前台电脑的图书管理索引系统其中索引指示书籍在几号楼几号柜子几号抽屉中;言下之意图书管理员起到的作用就是索引,后面的书籍才是数据。

那么问题是如何查找到书籍的具体位置呢?

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指针)指向数据,即可快速定位类似于 student=new student ,new student 才是书籍而等号左边的 student 是指针引用。

扫描书籍后,从哪拿书,把书还到那,此时模型是:这样就可以在这些数据结构上实现高级查找算法。

这种数据结构,就是索引即 java 程序员所常用的B数索引。在数据结构中有二叉树,在还书时扫描书籍名称,书籍最终到系统中不会使用中文名称查询,一定做了键值约束对假设射雕英雄传是28;假设在系统中有一个折中参考数据30,扫描书籍天龙八部显示书籍编号72,72大于30;(在系统中约定规范:比30小的在左边,比30大的在右边;30左边数值为20,30右边数值为40),在30左边的40比70小,又把70放在40右边过滤一定数量的值后(假设总量为100,需要从1翻到72)现在像折半查找,中间卡了很多东西,属性这种树形结构后。

image.png

记:col1 为 id,col2 为 bookname;0X07,0X56……为内存地址。左边为数据表,横,行,列为一条条数据,一共有两列七条数据,最左边的是数据记录的物理地址。

左边为数据表像图书馆中一本本图书,最左边的是图书馆管理员使用的图书管理索引系统。

假设查找4号书籍,扫码后显示4号对应编号为91(天龙八部)0xF3 表示硬盘记录的物理地址,91大于34放在右边,91再与89比较,放到89右边即可找到91;最右侧的物理地址指向表中  Col2 中的91,在比较三次后可以在许多书籍中找到物理地址检索出数据给人查阅。

为了加快 Col2 的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到相应数据,从而快速的检索出符合条件的记录。

如果不建索引只能一本本翻找书籍,建立索引后可以直接定位书记的具体位置,所说的具体地址既是表中的物理地址。

可以得到结论:

数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。本节课程讲的叫 B 数索引(BTREE)。

image.png

在工作中一定会与人发生争执,但也会与某些人关系很好;例如以 Java 程序员为例,发生争执的一定是产品经理,与运维工程师或数据库管理员关系较好,在晚上加班熬夜,生产部署时会有人留下了,当你下班后 dba 可能在做索引重建工作。Java 工程师向表中插入数据,为了快速查找dba明天给数据备份,恢复日志,最重要的是建立索引。

在写 delete 方法时不会调用真正方法将数据物理删除,有标志位把它从激活状态变为非激活状态即保证数据的连续性,例如有10条数据123456789,10删除第五条数据没有真正 delete,server 调用 delete 最后底下时 update,update 把激活标志位从1(激活状态)改为0;此时逻辑上此条数据被删除但是在物理上依然存在。是为什么呢?

Java 工程师不使用此条数据,现在已经进入云计算和大数据时代,别的部门最好保留完整记录,所以大部分把数据从激活状态改为非激活状态尽量不删除数据,这是第一个原因:为了数据分析。

第二个原因:为了索引;不删除数据一是为了数据分析二是为了索引;假如到图书馆借一步倚天屠龙记,管理员说在三楼二号抽屉,但是到地点发现抽屉中没有书籍,这是索引不准确。

第二个问题:图书位置不固定,那么在图中指针越多失效的越多,在频繁数据删除,修改,新增后二叉树会失效即建立索引,索引不准确。第二种如果把表中91删除后,再指向91,表中对应位置为空此时查找无效。

所以在 Java 工程师工作完成后,dba 锁表重建索引。Dba 在数据稳定后重新建立索引,假设图书馆搬了一次家,书籍重新分门别类,索引重新建立后索引变快。

为什么查询快,增删满?

在数据库中在除了需要改一条数据还要修改索引;例如图书馆规定:三楼不要放武侠类小说改为新闻类书籍,做 update除了数据需要改变索引指向也要改变,所以update 更新慢是因为数据在改索引也在改否则索引指向错误,所以频繁删改的字段不适合建立索引。

得到结论:一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。

平常所说的索引即 Java 工程与开发相关的,如果没有特别指明,都是指 B 树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用 B+树索引,统称索引。

当然,除了 B+树这种类型的索引之外,还有哈稀索引(hash index)等。目前着重介绍与开发相关的 B 树索引。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 关系型数据库 MySQL
索引(三)|学习笔记
快速学习索引(三)
103 0
索引(三)|学习笔记
|
SQL 关系型数据库 MySQL
索引(二)|学习笔记
快速学习索引(二)
71 0
索引(二)|学习笔记
|
自然语言处理 开发者 索引
高级查询(文本查询)| 学习笔记
快速学习高级查询(文本查询)。
126 0
高级查询(文本查询)| 学习笔记
|
编解码 开发者
数字音频基础(上)| 学习笔记
快速学习数字音频基础(上),介绍了数字音频基础(上)系统机制, 以及在实际应用过程中如何使用。
250 0
数字音频基础(上)| 学习笔记
|
存储 开发者
数字音频基础(中)| 学习笔记
快速学习数字音频基础(中),介绍了数字音频基础(中)系统机制, 以及在实际应用过程中如何使用。
123 0
数字音频基础(中)| 学习笔记
|
存储 人工智能 算法
数字音频基础(下)| 学习笔记
快速学习数字音频基础(下),介绍了数字音频基础(下)系统机制, 以及在实际应用过程中如何使用。
356 0
数字音频基础(下)| 学习笔记
|
自然语言处理 搜索推荐 开发者
高级查询(数组查询和组合查询)| 学习笔记
快速学习高级查询(数组查询和组合查询)。
136 0
高级查询(数组查询和组合查询)| 学习笔记
|
存储 缓存 监控
ChangeStreams 使用及原理(二)|学习笔记
快速学习 ChangeStreams 使用及原理
595 0
ChangeStreams 使用及原理(二)|学习笔记
|
SQL 运维 监控
ChangeStreams 使用及原理(一)|学习笔记
快速学习 ChangeStreams 使用及原理
377 0
ChangeStreams 使用及原理(一)|学习笔记
|
Web App开发 缓存 负载均衡
缓存基础(一)|学习笔记
快速学习 缓存基础(一)
94 0
缓存基础(一)|学习笔记