Innodb和Myisam索引

idnameagecountrystand name
1Dio Brando121埃及世界
2jonas21英国null
3Joseph79美国隐者之紫
4Kujo Jotaro41日本白金之星

Innodb 索引

[索引页]

非主键索引和主键索引,都是"稀疏键值+子索引页地址"或者"稀疏键值+数据页地址"。

[数据页]

主键索引数据页存完整的行数据

非主键索引数据页存放"键值+主键键值",且如果键值有重复,则一个键值对应多个主键值。如上图非主键索引中的数据页,每一列可能有多个主键id(黄色区域)。

Myisam 索引

[索引页]

非主键索引和主键索引都是"稀疏键值+子索引页地址"或者"稀疏键值+数据页地址"。

[数据页]

主键索引的数据页存放"键值+数据地址",一个键值只对应一个数据地址;

非主键索引数据页也存放"键值+数据地址",只是一个键值对应有多个数据地址,如图上图的黄色区域。


Myisam索引也被称为非聚簇索引,因为叶子节点中记录的数据地址是分散的,所以即便按照索引找到了地址,也会因为地址不相邻发生多次磁盘读取。会拖慢查询速度。

Innodb索引因为主键索引的叶子节点就是完整的数据块,对应一块连续的磁盘空间,可以大大减少读盘次数,加快查询速度。它的非主键索引依赖主键索引,进行回表也能利用到该特性。

====================================================================

2022.02.26

联合索引

多个非主键列组合在一起,做为索引键,构成一棵B+树。具有左结合特性,比如有a,b,c,d,e,f六个字段,现在将(a,b,c)组合作为键,实际上会生成三个索引, a,ab,abc,对应三棵B+树。搜索的时候会根据sql语句选择合适的索引:

①使用abc索引

Select * from mytable where a>? and b<? and c=?

②使用ab索引

Select * from mytable where a>? and b<? and d=?

③使用a索引

Select * from mytable where a>? and e<? and f=?

只要where条件中有a或ab或abc,则就能找到合适的索引,与a,b,c的顺序无关。需要注意只有b和c,没有a是不能找到索引的。

④使用abc索引

Select * from mytable where b>? and c=? and a<?

⑤不使用索引

Select * from mytable where b<? and c=?

[索引失效]

sql语句中一些内置函数可能会导致索引不可用,转而使用全表扫描,严重拖慢查询速度。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值