数据库索引相关问题点

数据库索引相关问题点算法

1.为何要给表加上主键?数据库

没有建立主键的表,他的数据是无序的放在磁盘中,一行行的排列很整齐,查询时也要一行行的扫描。

 建立了主键的表,在磁盘中的存储结构,由整齐的结构变成树状结构,也就是平衡树(B-Tree,B+Tree)结构。整个变成一个索引,也就是所谓的「汇集索引」。

 固然,也有使用哈希结构的索引,主流的关系型数据库仍是默认平衡树做为索引数据结构的。

不一样的数据库存储引擎,建立的索引结构也不一样。

2.为何一个表只能有一个主键?服务器

一个表只能有一个「汇集索引」,由于主键的做用是把表的数据格式转化为树形结构放置,因此一个表只有一个主键。

联合主键是主键的一种,是由多个字段组成的主键,主键并不必定只有一个字段,这里要搞清楚。

3.为何加索引后会使查询变快?数据结构

select * from table where id=82;

假如一张他table表有一亿条数据 ,须要查找id为82的数据,没建立索引的状况,多是一条一条的去匹配,最差的打算是须要匹配一亿次,一亿次匹配查询,就是一亿次IO开销,按照服务器的I/O能力与CPU的运算能力,须要几个月才能得出结果。

往table表中添加id为主键,表的数据结构变化为平衡树结构。

clipboard.png

树形结构:由根节(root)、分支(branches)、叶(leaves)三级节点组成,其中分支节点能够有多层。

下图展现定位id为82的过程:

clipboard.png

算法步骤:性能

1.读取root节点,判断82大于在0-120之间,走左边分支;

2.读取左边branch节点,判断82大于80且小于等于120,走右边分支;

3.读取右边leaf节点,在该节点中找到数据82及对应的id;

4.使用rowid去物理表中读取记录数据块。

在整个索引中,只进行了三次I/O操做,就定位到了id。spa

对于一亿的数据量最多要查询多少次呢?code

clipboard.png

树形结构,数据每增长一层,数据量就是成指数级的增加。blog

若是有2个分支,一亿条数据,最多查询27次就能够定位到数据,若是树结构是4个分叉,最多15次就能查到.索引

4.为何加索引后会使写入、修改、删除变慢?ip

缘由很简单,删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构,每次数据改变时,数据库管理系统都要从新梳理树结构,还会带来不小的性能开销。索引会给查询之外的操做带来反作用。

5.非汇集索引是怎样的呢?

非汇集索引,就是咱们平时使用的向某个字段添加索引,非汇集索引和汇集索引同样,一样能够采用平衡树做为索引数据结构,索引树各节点中的值,来自于表中字段的值,若是给字段建立一个索引,字段的值就会被复制出来,用于建立索引。给表添加索引,就会增长表的体积,占用更多的磁盘存储空间。非汇集索引都是独立存在的,每一个索引之间不存在关联。

clipboard.png

6.汇集索引和非汇集索引的区别?

经过汇集索引能够查到须要查找到的是每行的数据,经过非汇集索引查到的是记录对应的主键,再经过主键查找相应的值。无论任何查表的方式,都会经过主键定位到数据,汇集索引(主键)是通往数据的惟一途径。

7.什么状况下要同时在两个字段上建索引?

可能还有一种特殊状况,能够不经过汇集索引就获得须要的数据,这种非主流的方法 称之为「覆盖索引」查询。也就是平时建立的复合索引或者多字段索引查询。为一个索引指定两个字段,那么两个字段的内容就同步到索引中。若是经过其中的一个字段查另外一个字段时,正好在索引中有存储,就不用经过汇集索引啦。

//建立用户的index_name_and_age 索引

create index index_name_and_age on user_info(name, age);

//经过用户名查找年龄

select age from user where name = '科比';

这种状况,能够建立复合索引了。

相关文章
相关标签/搜索