Mysql索引

索引

是帮助mysql高效获取数据的排好序的数据结构

索引数据结构

二叉树:对于单边增长的数列插入不能增加效率

红黑树:当一边的数高度远大于另一边的时候,会自动平衡

如果数据为千万级,树会很高,依然有可能会和磁盘进行多次IO,因此引出B树

B-Tree:

从左到右依次递增

每个子节点都存储data

B+树:

非叶子节点不存储data

叶子节点用指针连接,提高区间访问的性能

为什么mysql采用B+树

一个节点大概是16KB

以三个节点为例:

第一个节点大概可以放下1179个元素

第二个节点同上,

第三个节点因为要存储数据,大概可以存放16个元素

所以能存放的数据1179*1179*16约等于2千万条

相对的B数大约能存放的数据条数为 16*16*16约等于8000

总的来说:首先从存储的数据来说,B树每个叶子节点都会存储数据,因此它的每个节点至多可以存放16个元素,如果对于千万级数据来说,进行的磁盘IO数比B+树多很多

为什么不把所有的数据都放在第一个节点当中?

第一个节点是一定会放在内存当中的

在内存当中定位某个数值,不耗费什么性能,只有磁盘IO耗费性能

数据太大(千万级)会把内存撑爆,而且数据太多的话也不会让我们查询的速度加快

数据、表、索引都是存储在磁盘上面的

MyISAM索引文件是非聚集索引

.frm:表结构

.MYI:mysql中索引存放的文件地址

.MYD:mysql中表数据存储的文件地址

在mysql中查询的顺序

首先是根据条件项去MYI索引中查询,拿到对应的磁盘文件地址,再去MYD文件中找到对应行

InnoDB表

.frm:表结构

.idb:整张数据的所有数据都是按照B+树来组织的,索引存储所在行的其他列

聚集索引:叶子节点会包含完整的数据记录

为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?

.idb文件存储数据的时候就是用B+树来组织,它会从第一列开始寻找从头到尾数据都不同的一列当做索引,如果没有主键的话,它就会帮你建一个隐藏列

为什么要是整型的呢?

数字比大小快是比字符串比大小快的其次占用的内存相对小

为什么是自增的呢?

插入非自增的话,会导致树分裂,再做平衡,会导致效率变低

Hash索引

对索引的key进行一次hash计算就可以定位出数据存储的位置

很多时候Hash索引要比B+树索引更高效

坏处:

仅能满足“=”,“in”不支持范围查询

Hash冲突的问题

聚集索引和非聚集索引哪个速度快?

聚集索引效率高

非聚集索引:即需要再查询一次

整张表只有一个聚集索引,建了主键的话,主键就是索引,没有主键的话就会自动生成的rowid索引

为什么非主键索引结构叶子节点存储的键是主键值

一致性和为了节省存储空间

联合索引

多个索引组合成一个索引

索引最左前缀原理

当你需要使用联合索引的时候,你需要把最左边的索引先调用

为什么mysql是索引最左前缀原则

索引是排好序的数据结构

你可能感兴趣的:(Mysql,mysql,数据库,数据结构)