MyISAM与InnoDB的索引实现

一、MyISAM 使用B+Tree 做为索引结构,叶子节点的data存放指针,也就是记录的地址。对于主键索引和辅助索引都是同样的。
二、InnoDB 也使用B+Tree做为索引结构,也别须要注意的是,对于主键索引,InnoDB 使用汇集索引,InnoDB的数据文件自己就是就是索引文件。而MyISAM,主键索引和数据文件是分离的。
三、InnoDB数据文件,要按主键汇集索引,这就要求InnoDB的表必需要有主键(MyISAM能够没有)。若是没有显式指定主键,InnoDB会自动选择一个能够惟一标识记录的字段做为主键,好比auto_increment的字段,若是不存在这样的列,InnoDB会自动生成一个隐含字段做为主键,这个隐含字段6个字节,是长整形。
四、对于InnoDB的辅助索引,叶子节点的data存放的是主键的值。这就意味着,使用辅助索引定位记录,须要使用两次索引:首先使用辅助索引找到主键的值,根据主键的值,使用主键索引找到记录。
五、InnoDB的辅助索引为何要这样设计?
若是辅助索引data存放的行指针,当行移动或者数据页分裂时,须要更新data域行指针的值,这就增长维护成本。data存在主键的值,就没有这个问题。行移动和数据页分裂,主键索引会自动更新。data关联主键的值,不须要更新,至关于增长一个间接层。这个间接层对性能的影响也很小,由于经过主键定位记录是很是快的。
六、了解了innoDB的索引实现,有几个地方须要注意:
不要使用过长的字段做为主键,由于辅助索引都要使用主键索引定位记录,这个字段过长,使用内存更大,影响性能。
使用单调的字段做为主键,特别是insert的时候,若是是非单调的,B+Tree维护成本很高。
七、这就能很好解释,隔离级别 repeatable-read, 不使用索引锁住整个表,使用索引(主键索引或者辅助索引)只会锁住对应的行。
八、在查询执行计划中,有一个字段 type, eq_ref 表示使用主键索引,直接定位到记录。而ref 表示先使用辅助索引,找到主键的值,再使用主键索引定位到记录。性能

相关文章
相关标签/搜索