索引相关(二)
程序员文章站
2022-04-10 17:14:06
...
索引相关
一、InnoDB 与 MyISAM 对比
存储引擎 | InnoDB | MyISAM |
存储结构 | InnoDB表空间数据文件和它的日志文件;表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引 | MyISAM表建立三个不同的文件;表定义、数据文件、索引文件 |
索引的数据结构 | B+树 | B+树 |
叶子节点的键值KEY | 表的主键(一般主键INT无符号自增) | 索引的相应字段的值 |
叶子节点的DATA域 | 保存完整的数据记录 | 数据记录的地址,即数据文件中的每行数据的地址 |
辅助索引 | 辅助索引data域存储相应记录主键的值而不是地址 | 与主索引在结构上无区别,主索引不可以重复,辅助索引可以 |
索引的类型 | 聚集索引 | 非聚集索引 |
全文索引、压缩索引 | 不支持 | 支持 |
主辅索引 | IAnnoDB主键节点同时保存数据行,其他辅助索引保存的是主键索引的值 | MyISAM顺序储存数据,索引叶子节点保存对应数据行地址,辅助索引很主键索引相差无几 |
数据存储 | InnoDB键值一起保存,索引与数据一起载入InnoDB缓冲池 | MyISAM键值分离,索引载入内存(key_buffer_size),数据缓存依赖操作系统 |
索引顺序 | 升序;优点:缩短索引键值的大小;缺点:不支持倒叙提取索引 | 不一定 |
博文参考:
由浅入深探究mysql索引结构原理、性能分析与优化
二、注意事项
1.InnoDB本身按照主键作为KEY形成的B+树结构,所以表必须有主键;无主键,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形
2.InnoDB不建议使用过长的字段作为主键,因为辅助索引在检索时是通过查找主索引来间接实现的;那么辅助索引的节点的data域中存放主索引的值,因为主索引很长,索引存储空间会加大
3.InnoDB主键单调,因为InnoDB的数据文件整体是一个B+树的结构,如果出现重复的数据,会不断的调整B+树的结构,增加维护成本及时间
4.InnoDB中辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录
博文参考:
MySQL索引背后的数据结构及算法原理
三、名词解释
存储引擎 | 聚集索引 | 非聚集索引 |
定义 | 索引中键值的逻辑顺序决定了表中相应行的物理顺序;检索范围数据快速,数据已经按照顺序排序,而无需进行数据排序处理; | 索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同 |
叶子节点 | 索引的叶节点就是数据节点;如InnoDB的B+树的索引结构中DATA中存放数据的完整记录 | 叶节点存放的是索引节点,有一个指针指向对应的数据块;如MyISAM的B+树的索引结构中DATA中存放指向数据表中记录的物理地址 |
数量 | 每个表中只能有一个 | 根据实际使用索引的情况而定 |
博文参考:
聚集索引和非聚集索引