MyISAM 和 InnoDB 索引结构及其实现原理

  1. 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。mysql

  2. 索引的实现一般使用B_TREE。
    B_TREE索引加速了数据访问,由于存储引擎不会再去扫描整张表获得须要的数据;
    相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。算法

  3. MyISAM引擎 使用B+Tree做为索引结构,叶节点的data域存放的是数据记录的地址.
    即:MyISAM索引文件和数据文件是分离的,MyISAM的索引文件仅仅保存数据记录的地址。
    MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,
    若是指定的Key存在,则取出其data域的值,而后以data域的值为地址,读取相应数据记录。
    MyISAM的索引方式也叫作“非汇集”的。
    物理文件结构为:
    .frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
    .myd(mysql data)文件:myisam存储引擎专用,用于存储myisam表的数据
    .myi(mysql index)文件:myisam存储引擎专用,用于存储myisam表的索引相关信息sql

  4. InnoDB引擎 也使用B+Tree做为索引结构,可是InnoDB的数据文件自己就是索引文件,叶节点data域保存了完整的数据记录。
    这个索引的key是数据表的主键,所以InnoDB表数据文件自己就是主索引。这种索引叫作“聚焦索引”。
    InnoDB的辅助索引的data域存储相应记录主键的值而不是地址。
    换句话说,InnoDB的全部辅助索引都引用主键做为data域。
    汇集索引这种实现方式使得按主键的搜索十分高效,可是辅助索引搜索须要检索两遍索引:
    首先检索辅助索引得到主键,而后用主键到主索引中检索得到记录。
    InnoDB的索引实现后,不建议使用过长的字段做为主键,由于全部辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
    在InnoDB中也不建议使用非单调的字段做为主键,
    由于InnoDB数据文件自己是一颗B+Tree,非单调的主键会形成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,建议使用自增字段做为主键。
    物理文件结构为:
    .frm与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。
    .ibd文件和.ibdata文件:
    这两种文件都是存放innodb数据的文件,之因此用两种文件来存放innodb的数据,是由于innodb的数据存储方式可以经过配置来决定是使用共享表空间存放存储数据,仍是用独享表空间存放存储数据。
    独享表空间存储方式使用.ibd文件,而且每一个表一个ibd文件;
    共享表空间存储方式使用.ibdata文件,全部表共同使用一个ibdata文件;
    以为使用哪一种方式的参数在mysql的配置文件中 innodb_file_per_table;数据库

相关文章
相关标签/搜索