数据库索引
索引是为了提高数据的查询速度,相当于给数据进行编号,在查找数据的时候就可以通过编号快速找到对应的数据。
索引内部数据结构:B + Tree
主键自带索引。 如:
insert into user (id, name) values (1,'f');
insert into user (id, name) values (5,'h');
insert into user (id, name) values (2,'d');
insert into user (id, name) values (6,'c');
insert into user (id, name) values (3,'e');
insert into user (id, name) values (4,'a');
insert into user (id, name) values (8,'g');
insert into user (id, name) values (7,'b');
乱序插入数据,会自动按照 id 进行升序排列,这是因为主键自带索引。
数据存储的内部结构类似于链表的形式,通过指针关联不同的数据。
这种结构当数据量很大的时候查询还是很慢,MySQL是如何解决的?
MySQL中有一个 page 的概念,相当于给数据进行分页,把一部分数据存入一个 page 中。
如下图所示:
每个 page 可以存储 16KB 的数据,这样就相当于给数据建立了上层目录。先找大目录,再找具体的数据。
MySQL给 page 也提供了快速查询的 page目录,如下所示:
把每个 page 中的第一条数据的 id+指针 存入 page目录 中,查询数据的时候,先找到它的 page。再进入到相应 page 里面查询具体的数据。
如:查询出 id=4 的数据,因为3 < 4 < 5,所以根据 page 目录可以判断在 page2 中,然后在 page2 中查询具体的数据。
一个 page目录 也可以存储 16KB 的数据,如果是海量数据,page目录也会有很多层。
为了提高查询效率,MySQL给 page目录 再加上一次目录,如下所示:
这种结构就是 B+树
假设一条记录的空间为32个byte,最底层一个单元可以存储数据 16*1024/32=512
第二层只需要记录 id+p,假设是6个byte,则可以保存的数据是 16*1024/6=2730
第三次存储的数据是 16*1024/6=2730
总共可以存储的数据是 512 * 2730 * 2730=38亿(约等于)