处处离不开的索引和MySQL的索引

SQL herman 88浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xmtxtt,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序

每天坚持原创是一件非常不容易的事情,哪怕有写的不对的地方,也希望大家能够帮忙指正(昨天那篇文章,很多人评论的就很好)。因为,我希望我们一起进步!每天看文章,来打个卡,也能给自己带来一些收获和坚持。希望今后,我们能进行相互鼓励,共同进步!

MySQL是一个非常复杂的系统。不管我们的数据是在几条,还是上千万到几亿条,每次查询等操作它都能过快速的给我们响应。这是如何设计的呢?

估计很多人会回答说,MySQL 设计的好,有索引等。那么 MySQL 为什么设计的好呢?有什么高深的技术吗?

还真没有什么太高大上的新技术等新花样。就拿索引来说,你以为它是什么很神秘的东西?索引你又不是没见过,比如我们访问一个数组,根据数组的下标就能快速的访问到数组中对应的元素。其实这个下标就是一个索引。

再比如,一个 Map,健值对形式的数据结构。我们能很快的访问到,是因为它的 Key 使用了 Hash。这个 Hash 就是一个索引。

在 MySQL 中索引常见的就是一个 BTREE、B+Tree 搜索树(HASH 也有存储引擎用到)。如果没有索引,那么你要找一条数据就只能从第一条开始,一条记录一条记录的遍历,直到找到该条信息为止。如果有了索引,就能够事半功倍,快速的定位到数据。

BTree 是平衡搜索多叉树,也有人称作 B 树为平衡多路查找树。设树的度为 2d(d>1),高度为 h,那么 BTree 要满足以一下条件:

  • 每个叶子结点的高度一样,等于h;
  • 每个非叶子结点由 n-1 个 key 和 n 个指针 point 组成,其中 d<=n<=2d,key 和 point 相互间隔,结点两端一定是 key;
  • 叶子结点指针都为 null;
  • 非叶子结点的 key 都是 [key,data] 二元组,其中 key 表示作为索引的键,data 为键值所在行的数据
BTree 平衡搜索多叉树

我不懂算法,BTree 大致上就是涨的如上图所示。这个图片来源于网络,至于为什么 MySQL 要设计成这样,我后面单独写文章来说。这里面其实还有很多精妙的设计,BTree 数据估计不少人比我还懂。我后面也得抽空去学习学习极客时间的《数据结构与算法之美》。

《数据结构与算法之美》通过我的海报上的二维码购买,加 xttblog 微信,返现24

B+Tree 是在 B-Tree 基础上的一种优化,我后面会有单独的文章来写。

总之,还是我之前提到的那句话“大道至简”。MySQL 的索引虽然你用起来很爽,但是维护起来也相当的麻烦。就像你的数组一样,删除数据,是不是要移动元素。同样的,你在 MySQL 中删除、更新、插入记录等都是需要时间和空间来维护索引的。

一个系统,当你深入的理解后,你会发现。原来这些设计都是在基础的知识之上,一点一点堆积起来的而已。自然界也是一样的,这种元素加那种元素,结合起来组成一个分子。这种分子,那种分子组合起来,慢慢的构成细胞等结构,细胞等组织在慢慢的组成一个个生命体。

数据库也是由各种数据结构,数据模型,物理模型等组成,拿着显微镜你才有恍然大悟的感觉。最近我就有这种感觉,你是不是也需要这种感觉?请每天跟我一起来打卡,一点一点地成长。至少也能交到不少热心的朋友,你说不是吗?

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 处处离不开的索引和MySQL的索引