InnoDB的索引和MyISAM的索引有什么区别?
首先InnoDB和MyISAM都是使用的B+树实现的,但是InnoDB使用的是聚簇索引而MyISAM使用的是非聚簇索引,聚簇索引根据主键创建一颗B+树,叶子节点则存放的是数据行记录,也可以把叶子结点称为数据页。通俗点来说就是把数据和索引存在同一个块,找到了索引也就找到了数据。
- 因为叶子结点将索引和数据放在一起,就决定了聚簇索引的唯一性,一张表里面只能有一个聚簇索引。
- InnoDB引擎默认将主键设置为聚簇索引,但如果没有设置主键,那么InnoDB将会选择非空的唯一索引作为代替,如果没有这样的索引,InnoDB将会定一个隐式主键作为聚簇索引。
- 因为聚簇索引特殊的物理结构所决定,叶子结点将索引和数据存放在一起,在获取数据的速度上是比非聚簇索引快的。
- 聚簇索引数据的存储是有序的,在进行排序查找和范围查找的速度也是非常快的。
- ⚠️ 也正因为有序性,在数据插入时按照主键的顺序插入是最快的,否则就会出现页分裂等问题,严重影响性能。对于InnoDB我们一般采用自增作为主键ID。
- 第二个问题主键最好不要进行更新,修改主键的代价非常大,为了保持有序性会导致更新的行移动,一般来说我们通常设置为主键不可更新。