数据库的索引原理???

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZSS1753936255/article/details/83032770

使用索引很简单的。只要能写创建表单语句。就能写创建索引的语句。

当然我的本科的局限性:就是加索引能失败查询变快。。。变快。变快

特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,BTree索引,哈希索引,全文索引。因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构

为什么要给表加上主键???

主流的RDMBS都是把平衡树当做数据库默认的索引数据结构。当然也有的是哈希桶作为索引的。。

我自己理解的就是:不同的引擎的话,索引是不同的。

我们平时建表的时候都会为表加上主键,在某些关系数据中,如果建表时不指定主键,数据库会拒绝建表

的语句的执行。事实上,一个加了主键的表,并不能称之为表,一个没加主键的表,她的数据会无序的放置在磁盘‘存储器上,

一行一行的排列的很整齐,和我认知中的表很接近,如果这时候加上了主键,那么表在磁盘上的存储结构就有整齐排列结构变成了树状结构。也就是上面的平衡树。整个表就变成了一个聚集索引,这就是为什么一个表只能有一个主键,一个表只能有一个聚集索引,因为主键的作用就是把表的数据格式转换成平衡树的格式放置。

讲完聚集索引,接下来我们就聊一聊非聚集索引,也就是我们平时经常提起和使用的常规索引。

非聚集索引和聚集索引一样。同样是采用非平衡树作为索引的数据结构的。索引结构中个节点的值来自于表中

的索引字段,假如给user表的name字段加上索引,那么索引就是有name字段的值构成,在数据改变时,DBNS需要一直维护索引结构的正确性,如果给表中的多个字段加上索引,那么就会出现多个独立的索引结构,每个索引(非聚集聚集)就不互相关联了。每次给字段建一个新索引,字段中数据就会被复制一份出来。用于生成索引。因此,给表添加索引,就会添加表的体积。占用磁盘存储空间。

       非聚集索引和聚集索引的区别在于:通过聚集索引可以查到需要查找的数据,而通过非聚集索引可以查到记录对应的主键值,在使用主键的值通过聚集索引查找需要的数据。

  不管以任何方式查询表,最终都会利用主键通过聚集索引来定位到数据,聚集索引(主键)是通往真实数据真实数据的唯一途径。

-----------------这里我们介绍的就是为什么添加索引后,效率会高很多-------------------

B数又叫B-树,它就是一种平衡多路查找数。。

这里我们就简单的去描述一下B数的主要特点。。

所有的叶子节点必须在同一层次,也就是他们具有相同的深度。

在一个节点中,第n个子数中的所有key,小于这个节点第n个key.大于n-1的key。。就是这样的。

由于B_tree的特性,在B-tree中安key解锁数据的算法非常直观:如果找到则返回对应的节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败,B-tree上查找算法的伪代码的如下:

根据上面的性质的话,我们对于一个度为d的B-tree,设其索引N个key,则其树的高上面为logd((N+1)/2),解锁一个key.其查找节点个数的建进度复杂度O(logdN).这点。B-tree是一个 非常有效率的索引数据结构。

另外, 由于插入删除新的数据会破坏B-tree的性质,在插入删除时,需要对数进行一个分裂,合并,转移等操作以保持

B-tree性质。

这里的话,b-tree有很多变种,其中最常见的就是b+tree,比如mysql就普遍使用B+tree实现其索引结构。

这里就是每个节点不存储data,只储存key.

叶子节点不存储指针。

。。。。。。。。这里我们对数据库 的优化,谈谈自己的看法吧。。。。。。。。。。。。

sql的优化就是结构优化和查询语句的优化:(就是简单点的话,就是避免全表扫描)

1.对查询进行优化,应尽量避免的是全表扫描,首先应考虑的在where 即order by设计的列上建立索引。

这里我们就简单的说三条可以不?

应尽量避免在where字句中对字段进行null值判断,否则将导致引擎方式使用索引而进行全表扫描。

应尽量避免使用where语句中使用or来连接条件。否则将导致引擎放弃 使用索引而进行全表扫描。

猜你喜欢

转载自blog.csdn.net/ZSS1753936255/article/details/83032770