id | name | age | country | stand name |
1 | Dio Brando | 121 | 埃及 | 世界 |
2 | jonas | 21 | 英国 | null |
3 | Joseph | 79 | 美国 | 隐者之紫 |
4 | Kujo Jotaro | 41 | 日本 | 白金之星 |
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语句中一些内置函数可能会导致索引不可用,转而使用全表扫描,严重拖慢查询速度。