Mysql索引
1 Mysql如何实现的索引机制?
MySQL中索引分三类:B+树索引、Hash索引、全文索引
2 InnoDB索引与MyISAM索引实现的区别是什么?
-
MyISAM的索引方式都是非聚簇的,与InnoDB包含1个聚簇索引是不同的。-
在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录,而在MyISAM中却需要进行一次回表操作,意味着MyISAM中建立的索引相当于全部都是二级索引 。
-
InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是分离的 ,索引文件仅保存数据记录的地址。
- MyISAM的表在磁盘上存储在以下文件中:
*.sdi(描述表结构)、*.MYD(数据),*.MYI(索引) - InnoDB的表在磁盘上存储在以下文件中:
.ibd(表结构、索引和数据都存在一起)
- MyISAM的表在磁盘上存储在以下文件中:
-
InnoDB的非聚簇索引data域存储相应记录主键的值 ,而MyISAM索引记录的是地址 。换句话说,InnoDB的所有非聚簇索引都引用主键作为data域。
-
MyISAM的回表操作是十分快速的,因为是拿着地址偏移量直接到文件中取数据的,反观InnoDB是通过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。
-
InnoDB要求表必须有主键 ( MyISAM可以没有 )。如果没有显式指定,则MySQL系统会自动选择一个可以非空且唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。
-
3 一个表中如果没有创建索引,那么还会创建B+树吗?
会
-
如果有主键会创建聚簇索引
-
如果没有主键会生成rowid作为隐式主键
4 聚簇索引与非聚簇索引b+树实现有什么区别?
聚簇索引
特点:
-
索引和数据保存在同一个B+树中 -
页内的记录是按照主键的大小顺序排成一个单向链表。 -
页和页之间也是根据页中记录的主键的大小顺序排成一个双向链表。 -
非叶子节点存储的是记录的
主键+页号。 -
叶子节点存储的是
完整的用户记录。
优点:
- 数据访问更快 ,因为
索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。 - 聚簇索引对于主键的
排序查找和范围查找速度非常快。 - 按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于
数据都是紧密相连,数据库可以从更少的数据块中提取数据,节省了大量的IO操作。
缺点:
- 插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个
自增的ID列为主键。 - 更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义
主键为不可更新。
限制:
- 只有InnoDB引擎支持聚簇索引,
MyISAM不支持聚簇索引。 - 由于数据的物理存储排序方式只能有一种,所以
每个MySQL的表只能有一个聚簇索引。 - 如果没有为表定义主键,InnoDB会选择
非空的唯一索引列代替。如果没有这样的列,InnoDB会隐式的定义一个主键作为聚簇索引。 - 为了充分利用聚簇索引的聚簇特性,InnoDB中表的
主键应选择有序的id,不建议使用无序的id,比如UUID、MD5、HASH、字符串作为主键,无法保证数据的顺序增长。