记得当初学习数据库的时候知道我们需要建立一列来作为主键(一般用数字(类型),自动递增),目的是标记唯一一条数据,且用来和其他表进行关联。方便后期做查询,这可能就是我最初对主键的认识吧。慢慢的后面学习各种技术。主键变成了雪花算法(还不错),uuid(字符串hash算法得到)便出现在我们的视野中。同学你也经历这个过程了嘛。
由于工作慢慢接触sql优化,提到sql 优化可能大家最先想到的就是“索引”,有一句话这么说:”合理的设计且使用索引的mysql 是一辆超跑,没有设计和使用索引的mysql就是一辆牛车”---------彩币运维。看到这里是不是觉得索引很重要 ,sql优化当然因素有很多,今天我这里只提索引。
要优化好索引首先就要知道索引的工作结构和概念?给你一分钟想一下 什么是索引?
索引是帮助mysql高效获取数据的排好序的数据结构。
排序和数据结构整明白这个两个东西索引基本就搞定啦 。
索引我们都知道快,是因为他会将我们的数据单独通过表的形式存储起来(大多数存储磁盘地址),那么为什么索引查询就会很快(数量级的区别)单独查询表就不快了?且看下面》》》》》》
数据结构自然少不了二叉树,红黑树,BTree,B+Tree,那么索引的存储是否用到了tree结构,其实mysql索引底层用的是一个B+Tree的数据存储结构,或者是说是一个复杂二叉树存储结构上图》
解释一下这个图,图里面是一个主键索引,底层存储的数据结构,上图中,左边叶子上的数据永远必右边叶子上的数据大,然后叶子中上存储了该数据的磁盘物理地址0x开头的那个,其次,叶子上还存储了相邻右边叶子的磁盘底子就是你看到图中最下面的从左到右的箭头那是个指针。举个例子:如果你要找20这个主键对应的数据 ,比较大小发现20处于根节点15和56之间,往下走一层,找到主键20,然后往下走到叶子存储位置,取出物理地址,让后在磁盘上找到这个地址上所对应的行数据,就完成了数据查询,不加索引就需要从表中第一条记录开始all扫描最终得到结果,相比,有索引是不是有很快,只需要很少的扫描就能得到结果。O(∩_∩)O哈哈~。
为啥不用UUID,首先我们从uuid数据类型上来看,uuid首先是一个字符串且不规律,既然我们说索引是一个排好序的数据结构,添加数据是时为了维持B+Tree数结构就会出现插入数据时比较字符串大小,那不要太费劲,挨个字母比较大小(ASSIC大小,如果是最后一位才比出来大小那不扯犊子,但是数字比较大小是不是就很舒服,且插入数据不需要更改已有的数据地址,只需要添加就可以了,效果立竿见影)那么存储的时候就会出现新加入的数据存储的时候比之前的数据小,那么插入结构的时候就出现已插入数据物理地址大量的发生变化,出现节点和树结构的变化,这样的操作是比较浪费mysql资源的,或者说插入就会变得很慢(因为很多数据地址都发生了变化,mysql索引需要维护B+Tree树结构),mysql 本来资源就很紧张,你说对不对。
共同分享共同进步-----------------------------------------------彩币运维
2022年4月17日18:27:21