mysql 中MyISAM与InnoDB 都是用B+Tree 数据结构存储数据。但是有区别
MyISAM:
创建一个表,用MyISAM 引擎,会在存储磁盘生成三个文件
- my_table.frm -----> 表结构定义文件
- my_table.MYD -----> 用于存放数据
- my_table.MYI -----> 用于存放索引
MyISAM 的索引和数据文件存放在不同的文件
InnoDB :
创建一个表,用InnoDB 引擎,会在存储磁盘生成两个文件
- my_table.frm -----> 表结构定义文件
- my_table.IDI -----> 用于存放索引和数据的
Inno DB的 数据文件和索引文件是在一个文件里:
公共:
1:叶子节点存储数据,非叶子节点存储索引
2:索引是排好序的
MyISAM和InnoDB 叶子节点data数据存储不同
MyISAM:存当前索引所在文件的地址
InnoDB:存当前索引所有列的数据
聚簇索引:主键索引
二级索引:非主键索引
InnoDB():
索引页:默认是16kB=16*1024=16384B,
例:主键为bigint(索引)(8B),白色为下个节点磁盘地址(6B), 那么16384/14=1170个,
第一级别索引页默认有1170个索引
第二级别索引页,将会有1170*1170=136 9234 个索引页,根据数据的大小,第二级索引页所包含的数据数量不同。
第三级别数据页,存的时候数据和索引(主键索引)。
聚集索引:(第三级别数据页,存的时候数据和索引)
非聚集索引:(第三级别数据页,存的时候主键索引地址和索引)
当一张表,有主键索引(聚集索引),非主键索引。
user表:
id(设置主键索引),name(非主键索引),age
三个查询:
第一:select * from user where id=1
第二:select * from user where name=1
第三:select * from user where age=1
第四:select name from user where name=1
第五:select name ,age from user where name=1
1:设置主键索引,设置非主键索引一个
2:每张表会根据设置多少索引,生成多少索树。 目前根据例子,会生成一个(ID)主键索引树,和一个 (name)索引树
主键索引树:
非主键索引树:
三个查询:
第一:select * from user where id=1
id是主键索引,那么数据,查询会查询主键索引树查询,找到叶子节点
第二:select * from user where name=1
name是非主键索引,那么数据,查询会查询非主键索引树查询,找到叶子节点的主键索引地址,进行回表查询主键索引树,再根据主键索引找到叶子节点
第三:select * from user where age=1
age是非主键索引,那么数据,查询会查询主键索引树查询(全表查询),找到叶子节点
第四:select name from user where name=1
name是非主键索引,并且查询的数据name也是索引数据,所以查询非主键索引树,不需要回表(因为索引就是数据)。
第五:select name ,age from user where name=1
name是非主键索引,查询的数据name是索引数据,age是非索引,先查询非主键索引树,找到name所在的主键索引地址,进行回表(因为age不是索引,非主键索引没有数据)再根据主键索引查找主键索引树,找到name,age