首页 > 其他分享 >MyISAM 和 InnoDB 索引实现

MyISAM 和 InnoDB 索引实现

时间:2022-10-09 13:33:22浏览次数:59  
标签:数据文件 Tree 索引 InnoDB MyISAM 主键


 MyISAM索引实现

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

MyISAM 和 InnoDB 索引实现_主键


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

MyISAM 和 InnoDB 索引实现_主键_02


同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

 

InnoDB索引实现

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

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

MyISAM 和 InnoDB 索引实现_主键_03


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

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

MyISAM 和 InnoDB 索引实现_辅助索引_04


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

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

标签:数据文件,Tree,索引,InnoDB,MyISAM,主键
From: https://blog.51cto.com/u_15812686/5740246

相关文章

  • Linux_Bash_Shell_索引数组和关联数组及稀疏数组
     1. 索引数组 一、什么是索引数组?所谓索引数组就是普通数组,以整数作为数组元素的索引下标。   二、实例。  备注:(a)使用-a选项定义索引数组,使用一对......
  • mysql 删除索引 Cannot drop index 'IX_t_billing_setup_CustomerID_WarehouseID': n
     --创建表createtablet_billing_setup(BillingSetupIDintnotnullauto_incrementcomment'编号',CustomerIDintnotnullcomment'',......
  • db2 表、视图、索引
    一、表1、概述所有数据都存储在数据库的表中,表由不同数据类型的一列或多列做成数据存储在行(或称为记录)中表使用createteble语句定义的2、创建表createtableemployee(idI......
  • 力扣599(java&python)- 两个列表的最小索引总和(简单)
    题目:假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。你需要帮助他们用最少的索引和找出他们共同喜爱的餐......
  • 索引的建立原则, 如何避免索引失效
    源自面试鸭建立索引1.经常使用的字段2.字段最好唯一3.字段类型尽量用数值型,减少字符类型4.对于带条件和排序字段的字段建立索引5.频繁出现在where条件后面的字......
  • filebeat采集log日志,并自定义索引
    filebeat配置:filebeat.inputs:#Each-isaninput.Mostoptionscanbesetattheinputlevel,so#youcanusedifferentinputsforvariousconfigurations.......
  • day07-2MySQL索引
    MySQL索引说起提高数据库性能,索引是最物美价廉的东西了。不用加内存,不用改程序,不用调sql,查询速度就能提高千百倍。例子首先,创建一个有800万条数据的表--创建测试数......
  • Mysql之Innodb锁场景
    mysql锁分类基于锁的属性分类:共享锁(读锁)、排他锁(写锁)基于锁的粒度分类:行级锁(innodb)、表锁(innodb、myisam)、页级锁(innodb引擎)、记录锁、间隙锁、临建锁。mys......
  • ES 索引模块
    分析模块索引分析模块作为一个可配置的分析器注册表,可用于将一个字符串字段转换为单独的术语,这些术语被。添加到倒置的索引中,以使文件可以被搜索到被高水平的查询所使用,......
  • Mysql索引
    索引概念:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可提高数据库中特定数据的查询速度。索引特点:索引的优点主要有以下几条:(1)通过创建唯一索引,可以保......