非聚簇索引:索引与真实数据文件不在一个文件中
myisam的一个数据表table中,它是有table.frm、table.myd以及table.myi组成。
table.myd记录了数据,table.myi记录了索引的数据。
在用到索引时,先到table.myi(索引树)中进行查找,取到数据所在table.myd的行位置,拿到数据。
所以myisam引擎的索引文件和数据文件是独立分开的,则称之为非聚簇索引。myisam类型的索引,指向数据在行的位置
聚簇索引:索引与数据是在一个文件中的
聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储
InnoDB的数据文件只有数据结构文件.frm和数据文件.idb 其中.idb中存放的是数据和索引信息是存放在一起的
在innodb中,即存储主键索引值,又存储行数据,称之为聚簇索引。
innodb中,没有主键索引;
则会使用unique索引,没有unique索引;
当这种列不存在的时候,会默认生成一个6字节整型的隐藏列作为主键;
一本英文课本为例,要找第8课,直接翻书,若先翻到第5课,则往后翻,再翻到第10课,则又往前翻。这本书本身就是一个索引,即“聚簇索引”。
如果要找"fire”这个单词,会翻到书后面的附录,这个附录是按字母排序的,找到F字母那一块,再找到"fire”,对应的会是它在第几课。这个附录,为“非聚簇索引”。
由此可见,聚簇索引,索引的顺序就是数据存放的顺序,所以,很容易理解,一张数据表只能有一个聚簇索引。
优缺点
聚簇索引将索引和数据行保存在同一个B-Tree中,查询通过聚簇索引可以直接获取数据,相比非聚簇索引需要第二次查询(非覆盖索引的情况下)效率要高。
聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的,
聚簇索引的更新代价比较高,如果更新了行的聚簇索引列,就需要将数据移动到相应的位置。这可能因为要插入的页已满而导致“页分裂”。
插入速度严重依赖于插入顺序,按照主键进行插入的速度是加载数据到Innodb中的最快方式。如果不是按照主键插入,最好在加载完成后使用OPTIMIZE TABLE
命令重新组织一下表。
聚簇索引在插入新行和更新主键时,可能导致“页分裂”问题。
聚簇索引可能导致全表扫描速度变慢,因为可能需要加载物理上相隔较远的页到内存中(需要耗时的磁盘寻道操作)。