密集索引和稀疏索引的区别?
密集索引文件中的每个搜索码值都对应一个索引值。密集索引的叶子结点保存的不仅是键值,还保存了位于同一行记录里的其他列的信息。由于密集索引决定了表的物理排列顺序,一个表只能有一个物理排列顺序,所以一个表只能创建一个密集索引。
稀疏索引文件只为索引码的某些值建立索引项。叶子结点仅保存了键位信息以及该行数据的地址。有些稀疏索引只保存了键位信息及其主键。定位到叶子结点后,仍然需要通过主键或者地址定位到数据信息。
Mysql中有两种存储引擎:MyISAM,InnoDB
MyISAM不管是主键索引或者唯一键索引或者普通索引,其索引均属于稀疏索引。
InnoDB每个表必须有且只有一个密集索引,密集索引的选取规则:
若一个主键被定义,该主键则作为密集索引
若没有主键被定义,该表的第一个唯一非空索引则作为密集索引
若不满足以上条件,InnoDB内部会生成一个隐藏主键(密集索引)
InnoDB每个表必须有且只有一个密集索引,数据文件是和索引绑在一起的,表必须要有主键,通过主键索引效率很高。但是辅助键索引需要查两次,先查到主键索引然后再通过主键索引查询到数据。
而MyISAM是非聚集索引,数据文件与索引是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的,因此MyISAM在纯检索系统中(增删改)很少的系统中,其性能要好于InnoDB。
查看数据库下的表文件:
Person_info_large表是InnoDB引擎的,数据和索引在同一个文件中。
Shop_info_small表是MyISAM引擎的,数据和索引在不同的文件中。MYD是数据文件。