在mysql数据库中,myisam引擎和innodb引擎使用的索引类型不同,myisam对应的是非聚簇索引,而innodb对应的是聚簇索引。聚簇索引也叫复合索引、聚集索引等等。
非聚簇索引
以myisam为例,一个数据表table中,它是有table.frm、table.myd以及table.myi组成。table.myd记录了数据,table.myi记录了索引的数据。在用到索引时,先到table.myi(索引树)中进行查找,取到数据所在table.myd的行位置,拿到数据。所以myisam引擎的索引文件和数据文件是独立分开的,则称之为非聚簇索引。
myisam类型的索引,指向数据在行的位置。即每个索引相对独立,查询用到索引时,索引指向数据的位置。
聚簇索引
以innodb为例,在一个数据table中,它的数据文件和索引文件是同一个文件。即在查询过程中,找到了索引,便找到了数据文件。在innodb中,即存储主键索引值,又存储行数据,称之为聚簇索引。
innodb索引,指向主键对数据的引用。非主键索引则指向对主键的引用。innodb中,没有主见索引,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的id来当作主键索引。
在聚簇索引中,数据会被按照顺序整理排列,当使用where进行顺序、范围、大小检索时,会大大加速检索效率。非聚簇索引在存储时不会对数据进行排序,相对产生的数据文件体积也比较大。