MyISAM与InnoDB索引实现对比详解

 更新时间:2020年09月29日 08:49:32   作者:奔跑的小河  
这篇文章主要给大家介绍了关于MyISAM与InnoDB索引实现对比的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

MyISAM索引实现

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。如图:

MyISAM主键索引

这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:

MyISAM辅助索引

同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

InnoDB索引实现

虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

InnoDB主索引

上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:

InnoDB辅助索引

这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

总结

在数据库开发中,了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助。例如,知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好做法,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

到此这篇关于MyISAM与InnoDB索引实现对比的文章就介绍到这了,更多相关MyISAM与InnoDB索引对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Dbeaver如何从一个数据库复制表到另外一个数据库

    Dbeaver如何从一个数据库复制表到另外一个数据库

    在数据库管理中,导出表是一项常见操作,可以通过特定的工具或数据库自带的功能实现,步骤包括:1.在数据库管理软件中找到需导出的表,右键选择导出数据,2.选择目标数据库,并进行表映射设置,3.根据需求调整导出参数,4.执行操作完成数据导出
    2024-10-10
  • Linux系统下Navicat 激活教程详解

    Linux系统下Navicat 激活教程详解

    Navicat 是香港卓软数字科技有限公司生产的一系列 MySQL、MariaDB、MongoDB、Oracle、SQLite、PostgreSQL 及 Microsoft SQL Server 的图形化数据库管理及发展软件。这篇文章主要介绍了Linux系统下Navicat 激活教程详解,需要的朋友可以参考下
    2021-08-08
  • telnet连接操作memcache服务器详解

    telnet连接操作memcache服务器详解

    这篇文章主要介绍了telnet连接操作memcache服务器详解,本文讲解了连接、添加修改、读取、删除、清空所有缓存等操作命令,需要的朋友可以参考下
    2015-04-04
  • MSSQL自动同步设置方法

    MSSQL自动同步设置方法

    因有几台服务器,做下同步方便数据传输与备份
    2008-09-09
  • GaussDB数据库使用COPY命令导入导出数据的场景分析

    GaussDB数据库使用COPY命令导入导出数据的场景分析

    使用COPY命令可以方便地导入数据到GaussDB,GaussDB还提供了其他数据导入工具和功能,如使用GDS导入数据、使用INSERT多行插入、使用gsql元命令导入数据、ETL工具集成等,以满足不同场景下的数据导入需求,对GaussDB COPY命令相关知识感兴趣的朋友一起看看吧
    2024-01-01
  • ADO.NET数据库访问技术

    ADO.NET数据库访问技术

    本篇文章主要介绍了ADO.NET数据库访问技术以及在线或离线访问数据库的实现步骤,有需要的朋友可以参考下
    2015-07-07
  • Navicat Premium12进行数据库定期自动备份的方法步骤

    Navicat Premium12进行数据库定期自动备份的方法步骤

    本文主要介绍了Navicat Premium 12进行数据库定期自动备份,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 14张图看懂什么是区块链技术

    14张图看懂什么是区块链技术

    这篇文章主要为大家分享了14张图,帮助大家看懂什么是区块链技术,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • centos虚拟机部署opengauss数据库详细图文教程

    centos虚拟机部署opengauss数据库详细图文教程

    这篇文章主要给大家介绍了关于centos虚拟机部署opengauss数据库的相关资料,文章详细介绍了在CentOS上安装和配置openGauss数据库的过程,包括安装步骤、环境配置、权限设置、预安装和正式安装等,需要的朋友可以参考下
    2024-12-12
  • 干掉Navicat,这个数据库管理工具真香

    干掉Navicat,这个数据库管理工具真香

    这篇文章主要介绍了干掉Navicat,这个数据库管理工具真香,本文详细的介绍DataGrip的具体使用方法和实现,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论