尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

11 MySQL索引实现

11 MySQL索引实现 在MySQL中索引属于存储引擎级别的概念不同存储引擎对索引的实现方式是不同的下面主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。1、MyISAM索引实现MyISAM引擎使用BTree作为索引结构叶节点的data域存放的是数据记录的地址。这里设表一共有三列假设我们以Col1为主键则上图是一个MyISAM表的主索引Primary key示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中主索引和辅助索引Secondary key在结构上没有任何区别只是主索引要求key是唯一的而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引则此索引的结构如下图所示同样也是一颗BTreedata域保存数据记录的地址。因此MyISAM中索引检索的算法为首先按照BTree搜索算法搜索索引如果指定的Key存在则取出其data域的值然后以data域的值为地址读取相应数据记录。MyISAM的索引方式也叫做“非聚集”的之所以这么称呼是为了与InnoDB的聚集索引区分。2、InnoDB索引实现虽然InnoDB也使用BTree作为索引结构但具体实现方式却与MyISAM截然不同。第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道MyISAM索引文件和数据文件是分离的索引文件仅保存数据记录的地址。而在InnoDB中表数据文件本身就是按BTree组织的一个索引结构这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键因此InnoDB表数据文件本身就是主索引。上图是InnoDB主索引同时也是数据文件的示意图可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集所以InnoDB要求表必须有主键MyISAM可以没有如果没有显式指定则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键如果不存在这种列则MySQL自动为InnoDB表生成一个隐含字段作为主键这个字段长度为6个字节类型为长整形。第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说InnoDB的所有辅助索引都引用主键作为data域。例如下图为定义在Col3上的一个辅助索引这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效但是辅助索引搜索需要检索两遍索引首先检索辅助索引获得主键然后用主键到主索引中检索获得记录。了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助例如知道了InnoDB的索引实现后就很容易明白为什么不建议使用过长的字段作为主键因为所有辅助索引都引用主索引过长的主索引会令辅助索引变得过大。使用自增字段作为主键则是一个很好的选择。3、二级索引1.除主键以外建立的所有索引都叫二级索引2.唯一索引、普通索引、前缀索引等索引属于二级索引3.核心结构区别二级索引叶子节点**不存完整行数据只存主键值**。二级索引又称为辅助索引是因为二级索引的叶子节点存储的数据是主键。也就是说通过二级索引可以定位主键的位置。3.1 常见的二级索引唯一索引(UniqueKey)唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据但是允许数据为NULL一张表允许创建多个唯一索引。 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性而不是为了查询效率。普通索引(Index)普通索引的唯一作用就是为了快速查询数据一张表允许创建多个普通索引并允许数据重复和NULL。前缀索引(Prefix)前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引相比普通索引建立的数据更小 因为只取前几个字符。3.2 非聚集索引的缺点1.跟聚集索引一样非聚集索引也依赖于有序的数据2.可能会二次查询(回表):这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后可能还需要根据指针或主键再到数据文件或表中查询。
返回列表