索引是帮助MySQL高效获取数据的排好序的数据结构
弱点:一层楼上的一个节点只能放1个索引。就导致最终会有很多层
优点:层高可控,一层楼上的一个节点,可以放更多的索引;
缺点:没有双向指针,非叶子节点也放了数据,就导致索引不够纯碎;
叶子节点指的是最下面一层。
非叶子节点指的是最下面一层之外的其他层。
非叶子节点不存储data,只存储索引|(冗余),可以放更多的索引
叶子节点包含所有索引字段
叶子节点用指针连接,提高区间访问的性能
mysql分配给每个节点的数据大小默认是16k
非叶子节点每个索引元素后面紧跟着1个指针元素,假设每个索引字段都是bigint,占用8个字节,那么索引元素和指针元素大小大概是8+6 = 14b。16KB/14b约等于1170左右
每层占用1170 非叶子节点的每一层都占用1170,因为非叶子节点不保存data,第三层存的是索引元素和其他字段的所有信息。假设占用的空间变大,为1kb ,那么第三层能放16条数据;那么1个三层结构的B+树能放的数据就是1170*1170*16,约等于21902400条数据;两亿条。
引擎是修饰数据表的,数据库也可 以设置引擎,但是这个设置只是为了在创建表的时候用来做默认值;
占用三个文件
MYI:索引(index)叶子节点放的是磁盘地址,而不是数据本身。树和数据不在一起叫做非聚集索引,需要回表操作。
MYD:数据(data)
frm:旧版本表定义
sdi:新版本表定义
索引查询数据原理:
where age = 30
如果age字段有索引,就先去myi文件内找到age=30的这个数据的磁盘地址,然后用磁盘地址去myd文件内找到整行数据
如果age字段没有索引,就去myd文件内全表检索找到整行数据
旧版本占用2个文件
idb:数据和索引,叶子节点放的是数据,而不是磁盘地址,树和数据在一起叫做聚集索引,更快一点,不需要回表操作。
frm:表定义
新版本占用1个文件
idb:数据和索引,叶子节点放的是数据,而不是磁盘地址
主键索引,叶子节点放的是一行的全部数据;
非主键索引,叶子节点放的是主键id;
缺点:只支持 = in 操作,不支持范围查询。
优点:1、很多时候,hash索引比B+树索引高效;2、对key进行1次hash计算就可以定位数据的位置;
如果没有主键,那么mysql会自动帮你找一个不重复的列,创建为唯一索引,用这个字段来维护1个B+树的结构;
如果没有不重复的列,那么mysql会创建1个隐藏列来维护数据,(类比row_id)
所以要手动创建主键id,不然的话,mysql会暗地里做好多事;