MyISAM和InnoDB的索引在实现上的不同

1 MyISAM只把索引载入内存,数据缓存依赖于操作系统,InnoDB把索引和数据都载入内存缓冲

2 MyISAM数据库中的数据是按照插入的顺序保存,在每个索引节点中保存对应的数据行的地址,理论上说主键索引和其他索引是一样的,InnoDB数据库中的数据和主键节点保存在一起,所有其他索引节点中保存的是主键索引的值。

3 对于字符串索引,MyISAM默认采用增量保存,例如第一个索引值是‘perform‘,第二个索引的值是‘performance‘, 在索引文件中第二个索引被保存为‘7,ance‘。这样能够减小索引的尺寸。

4 MyISAM保存索引的状态信息在磁盘里,每次执行ANALYZE TABLE会更新这个信息。InnoDB则通过在启动的时候随机读取索引来估计索引的状态信息,所以Show Index的结果对于MyISAM是精准的,但对于InnoDB不是绝对精准。

5

索引长期运行之后会产生碎片,一种碎片是一行数据被保存在不同的数据段,另一种是连续的表空间或行在磁盘上被分散地保存。对于MyISAM两种索引碎片都
会出现,对于InnoDB只会出现后一种因为InnoDB不会把短行保存到不同的数据段。要消除索引碎片一种方法是OPTIMIZE
TABLE,另一种方法是把数据重新倒入。

针对MyISAM和InnoDB不同的索引结构,要注意以下几点:

1 在InnoDB表中插入数据一定要尽可能按照主键增加的顺序,AUTO_INCREMENT最好,这样插入的速度最快

2 因为InnoDB索引节点中保存的是主键的值,所以主键的值越简单越好

3 对于InnoDB表,在查询的时候如果只需要查找索引列,就不要加入其它列,这样速度最快。

时间: 2024-10-10 05:48:45

MyISAM和InnoDB的索引在实现上的不同的相关文章

MyISAM 和 InnoDB 中索引使用的区别

两个小型表 item.category: CREATE TABLE `item` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL, `category_id` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `name` (`name`), KEY `category_id` (`category_id`) ) CH

了解MyISAM与InnoDB的索引差异(转)

出处原文: 1分钟了解MyISAM与InnoDB的索引差异 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引,其又有什么差异呢?这是今天要聊的内容. 一,MyISAM的索引 MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index). 其主键索引与普通索引没有本质差异: 有连续聚集的区域单独存储行记录 主键索引的叶子节点,存储主键,与对应行记录的指针 普

MySQL的MyISAM与InnoDB的索引方式

在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式. MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意.可以看出MyISAM的索引文件仅仅保存数据记录的地址.在MyISAM中,主索引和辅助索引(Se

1分钟了解MyISAM与InnoDB的索引差异

一.MyISAM的索引 MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index). 其主键索引与普通索引没有本质差异: 有连续聚集的区域单独存储行记录 主键索引的叶子节点,存储主键,与对应行记录的指针 普通索引的叶子结点,存储索引列,与对应行记录的指针 画外音:MyISAM的表可以没有主键. 主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录. 举个例子,MyISAM: t(id PK, name KE

MyISAM与InnoDB的索引差异

数据库的索引分为主键索引(Primary Index)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引的,又有什么差异呢?一.MyISAM的索引MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index).其主键索引与普通索引没有本质差异: 有连续聚集的区域单独存储行记录 主键索引的叶子节点,存储主键,与对应行记录的指针 普通索引的叶子节点,存储索引列,与对应行记录的指针MyISAM的表可以没有主键.主键索引

1分钟搞定 MyISAM与InnoDB的索引差异

B+树,它是一种非常适合用来做数据库索引的数据结构: (1)很适合磁盘存储,能够充分利用局部性原理,磁盘预读: (2)很低的树高度,能够存储大量数据: (3)索引本身占用的内存很小: (4)能够很好的支持单点查询,范围查询,有序性查询: ? 数据库的索引分为主键索引(Primary Inkex)与普通索引(Secondary Index).InnoDB和MyISAM是怎么利用B+树来实现这两类索引,其又有什么差异呢?这是今天要聊的内容. ? 一,MyISAM的索引 MyISAM的索引与行记录是分

MyISAM与InnoDB的索引实现

1.MyISAM 使用B+Tree 作为索引结构,叶子节点的data存放指针,也就是记录的地址.对于主键索引和辅助索引都是一样的.2.InnoDB 也使用B+Tree作为索引结构,也别需要注意的是,对于主键索引,InnoDB 使用聚集索引,InnoDB的数据文件本身就是就是索引文件.而MyISAM,主键索引和数据文件是分离的.3.InnoDB数据文件,要按主键聚集索引,这就要求InnoDB的表必须要有主键(MyISAM可以没有).如果没有显式指定主键,InnoDB会自动选择一个可以唯一标识记录的

MyISAM和InnoDB在索引上的差别及其它区别

首先我们知道MyISM和InnoDB索引都是由B+树实现的,但在索引管理数据方式上却有所不同. InnoDB是聚集索引,数据文件是和(主键)索引绑在一起的,即索引 + 数据 = 整个表数据文件,通过主键索引到整个记录,必须要有主键,通过主键索引效率很高.但是辅助索引需要两次查询,因为辅助索引是以建索引的字段为关键字索引到主键,所以需要两次,先查询到主键,然后再通过主键查询到数据.因此,主键不应该过大,因为主键太大,其他索引也都会很大.话不多说上图: 主键索引:以主键索引到整条记录 辅助索引:以另

myisam和innodb索引实现的不同

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