每天坚持原创是一件非常不容易的事情,哪怕有写的不对的地方,也希望大家能够帮忙指正(昨天那篇文章,很多人评论的就很好)。因为,我希望我们一起进步!每天看文章,来打个卡,也能给自己带来一些收获和坚持。希望今后,我们能进行相互鼓励,共同进步!
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 大致上就是涨的如上图所示。这个图片来源于网络,至于为什么 MySQL 要设计成这样,我后面单独写文章来说。这里面其实还有很多精妙的设计,BTree 数据估计不少人比我还懂。我后面也得抽空去学习学习极客时间的《数据结构与算法之美》。
B+Tree 是在 B-Tree 基础上的一种优化,我后面会有单独的文章来写。
总之,还是我之前提到的那句话“大道至简”。MySQL 的索引虽然你用起来很爽,但是维护起来也相当的麻烦。就像你的数组一样,删除数据,是不是要移动元素。同样的,你在 MySQL 中删除、更新、插入记录等都是需要时间和空间来维护索引的。
一个系统,当你深入的理解后,你会发现。原来这些设计都是在基础的知识之上,一点一点堆积起来的而已。自然界也是一样的,这种元素加那种元素,结合起来组成一个分子。这种分子,那种分子组合起来,慢慢的构成细胞等结构,细胞等组织在慢慢的组成一个个生命体。
数据库也是由各种数据结构,数据模型,物理模型等组成,拿着显微镜你才有恍然大悟的感觉。最近我就有这种感觉,你是不是也需要这种感觉?请每天跟我一起来打卡,一点一点地成长。至少也能交到不少热心的朋友,你说不是吗?
: » 处处离不开的索引和MySQL的索引
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/252417.html