【无标题】


MySQL索引为什么这么快?

数据结构

b+tree
MySQL 索引结构
相比于二叉树 b+数的高度是固定的 如果使用二叉树会出现树的高度过高影响查询效率

mysql中的b+tree
1.b+树的一个节点会存储多个元素
2.只有叶子节点会存储数据库数据 非叶子只存储索引 这样可以节约空间放更多的索引(b树非叶子节点也会存储数据)
3.一个节点mysql默认分配16KB 假设索引字段长度为8个字节mysql文件地址指针占6个字节
则索引一共可以覆盖 11701170200=273,780,000 大约两千万条数据
4.在MySQL启动时 会将 根节点和根节点的双亲节点 也就是 第一层和第二层 加载到内存中 也就是说如果走了节点 只会发生一次磁盘IO

hash
为什么很少使用hash结构 相对来说hash的查询效率更高 但是 hash不能支持 >,< 等范围查询

聚集索引和非聚集索引

聚集索引:在b+树的叶子节点存储了完整一行数据 比如mysql的主键索引
非聚集索引:
普通索引:叶子节点存放的是索引数据以及该条数据的主键Id 在用普通索引查询时 会先走普通索引找到数据的Id 然后走主键索引找到该条数据 会有一次回表操作
myIsam引擎的索引:myIsam中数据文件和索引文件是分开存放的 叶子节点存放的是索引数据和该指向该条数据文件地址的指针 不管有没有使用主键索引查询都会有一次回表操作

插入:为什么innodb表必须建立主键 而且推荐使用整形的自增主键
1.普通索引的查询方式最后还是会通过主键索引查询
2.节约空间
3.如果没有建主键 mysql会自动创建唯一主键 选择一个满足唯一要求的字段 或者用rowId
4.b+树的叶子节点是按照索引依次递增的如果插入的数据不是递增的 某些节点如果本来就存满了就需要分裂节点 会影响效率

联合索引

假设联合索引 (A,B,C)
mysql建立索引时是 先按A的大小进行排序 再B 再C
所以一定要遵守最左前缀原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值