MySQL

作者: 不告诉你_af15 | 来源:发表于2019-08-29 13:13 被阅读0次

索引

索引是帮助MySQL高效获取数据的排好序的数据结构

如果为表的某一个字段建立索引,那么这个字段就作为索引的key值,value值就是对应于该字段的位置指针。

如果存储索引的数据结构是二叉搜索树的话,那么对一个递增的字段建立索引,在查找索引值为最大的那个数的时候,还是会扫描全表。

如果存储的数据结构是红黑树的话,红黑树的数据结构是一边的节点个数超过三个,就会进行旋转。比如某个节点的右节点的个数超过3个,那么进行RR旋转。这对于简单的二叉搜索树来说,存储的深度可能会有所的减少,但是也可能出现2的n次方等于总共节点的个数。其中n表示的是二叉树的深度,意思就是可能每层都只有两个节点。

B树相当于n叉平衡树,每个节点可以存n个节点。每一个节点中的值是排好序,在进行查找的时候,会将该节点的值存储在内存中,然后进行查找。那么相对于红黑树每次磁盘I/O只能存一个值来说,B树会明显减少磁盘I/O的次数,从而提高查找效率。

B+树相对于B树来说,非叶子节点都只是存的key值,叶子节点才是存的key,value。并且每个叶子节点都有指向它右边叶子节点的指针。这样做的优点是,非相对于B树将key和value的值都存到节点中,B+树每个非叶子节点的存储的索引值要比B树多很多。这样就能在高度有限的情况下,存储更多的节点。B+数在高度为3的情况下,就能存储千万级的数据。因为每一个高度代表要进行一次磁盘操作,所以也就是说B+树相对与B树来说在存储更多数据的情况下,减少了I/O操作的次数。

Hash索引,是用hash算法,来查找索引的值,如果我们查找某个key值,利用hash算法好像比B+树查找速度快,那么为什么不使用hash呢,因为hash虽然等值查找速度快,但是如果我们查找条件是一个范围的时候,hash算法就没办法解决了,那么也是要扫描全表。

存储引擎

MyISAM存储引擎,每一张表都存储有三个文件,一个是表的结构定义的数据文件,以frm结尾,另一个是存储表数据的文件,以MYD结尾,还有一个是记录了表的索引字段存储的未知,以MYI结尾。

InnoDB存储引擎,如果定义每一张表单独存储一个文件的话,那么每一张表对应两个文件,一个是表的结构定义文件,也是以frm结尾,另一个是存放表数据和索引的文件,以ibd结尾。

MyISAM存储引擎的的索引的叶子节点存储的是该key对应的value值的地址,然后拿到这个地址到数据文件中查找具体的数据,这就是非聚集索引。InnoDB存储引擎,叶子节点value值存储的是每一条记录,可以直接根据这个记录返回我们所需要的结果,这就是聚集索引。所以我们可以很容易的知道InnoDB存储引擎的性能比MyISAM存储引擎要高一些。

一般都推荐在为整数自增的字段上建立索引,为什么?

因为,如果不是整数,比如是在字段的数据类型为字符串上建立索引,那么在比较的时候需要一个一个字符进行比较,相对于整数来说,比较的速度要慢很多。

那又为什么要在自增的字段上建立索引呢?因为不是自增的,那么在添加一条记录,我们肯定要在索引的数据结构中进行插入,如果插入的这条记录的索引字段应该插入的节点的个数正好已经为n个,那么插入这个节点肯定会造成这个节点分裂,然后再进行以此调整的操作。如果是自增的,那么插入一条新纪录,肯定是在后面新开辟一个空间,所以相对于不是自增的,就减少了很多调整B+树的过程。

为什么B+树叶子节点都有指向它右边叶子节点的指针?

因为在进行返回查找的时候,比如我们查找某个索引值大于>20的所有元素,那么我们就可以只需要找到20对应的未知,然后依次就可以取出后面的所有的元素。

Http状态码:

1x:(被接受,需要继续处理。)这一类型的状态码,代表请求已被接受,需要继续处理。这类响应是临时响应,只包含状态行和某些可选的响应信息,并以空行结束

2x:(请求成功)这一类型的状态码,代表请求已成功被服务器接收,理解,并接受。

3x:(请求重定向)这类状态码代表客户端采取进一步操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的location域中指明。

4x:(请求错误)比如是编码格式不对,语法不对等。

5x:(服务器错误)

相关文章

网友评论

      本文标题:MySQL

      本文链接:https://www.haomeiwen.com/subject/ywjbectx.html