MyISAM的数据文件和索引文件是分开存储的。MyISAM使用B+树构建索引树时,叶子节点中存储的 键值为索引列的值,数据为索引所在行的磁盘地址。

主键索引


ssms索引的引用 myisam索引_ssms索引的引用

等值查询数据

select * from t_user_myisam where id=30;

        1. 先在主键树中从根节点开始检索,将根节点加载到内存,比较30<56,走左路。(

1次磁盘IO)

        2. 将左子树节点加载到内存中,比较20<30<49,向下检索。(1次磁盘IO)

        3. 检索到叶节点,将节点加载到内存中遍历,比较20<30,30=30。查找到值等于30的索引项。(1 次磁盘IO)

        4. 从索引项中获取磁盘地址,然后到数据文件t_user_myisam.MYD中获取对应整行记录。(

1次磁盘 IO)

        5. 将记录返给客户端。         

        磁盘IO次数:3+1次。

范围查询数据

select * from t_user_myisam where id between 30 and 49

        1. 先在主键树中从根节点开始检索,将根节点加载到内存,比较30<56,走左路。(1次磁盘IO)

        2. 将左子树节点加载到内存中,比较20<30<49,向下检索。(1次磁盘IO)

        3. 检索到叶节点,将节点加载到内存中遍历比较20<30,30<=30<49。查找到值等于30的索引项。 根据磁盘地址从数据文件中获取行记录缓存到结果集中。(2次磁盘IO) 我们的查询语句时范围查找,需要向后遍历底层叶子链表,直至到达最后一个不满足筛选条件。

        4. 向后遍历底层叶子链表,将下一个节点加载到内存中,遍历比较,30<49<=49,根据磁盘地址从 数据文件中获取行记录缓存到结果集中。(2次磁盘IO)

        5. 最后得到两条符合筛选条件,将查询结果集返给客户端。

        磁盘IO次数:2+检索叶子节点数量+记录数

辅助索引    

        在 MyISAM 中,辅助索引和主键索引的结构是一样的,没有任何区别,叶子节点的数据存储的都是行 记录的磁盘地址。只是主键索引的键值是唯一的,而辅助索引的键值可以重复。

        查询数据时,由于辅助索引的键值不唯一,可能存在多个拥有相同的记录,所以即使是等值查询,也需要按照范围查询的方式在辅助索引树中检索数据。