数据库索引
1、请你说一说数据库索引
- 索引(Index)是帮助MySql高效获取数据的数据结构,索引的目的在于提高查询效率,类比字典;实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,索引列也是要占用空间。
- 主键索引索引着数据,然而普通索引索引着主键ID值。当你查询用的是where id=x 时,那只需要扫描一遍主键索引,然后拿到相应数据,但是如果是查询的普通索引的话,那么会先扫描一次普通索引,拿到主键值,然后再去扫主键索引,拿到所需要的数据,这个过程叫做回表
2、缺少主键(InnoDB对数据的存储和处理都是基于聚簇索引的)
-
存在的问题
(1) 使用不了主键索引,查询会进行全表扫描,影响查询的速度;
(2) 影响数据插入性能,插入数据需要生成ROW_ID,而生成的ROW_ID是全局共享的,并发会导致锁竞争,影响性能。 -
MySQL如何处理
(1)如果定义了主键,那么InnoDB会使用主键作为聚簇索引
(2) 如果没有定义主键,那么会使用第一非空的唯一索引(NOT NULL and UNIQUE INDEX)作为聚簇索引
(3)如果既没有主键也找不到合适的非空索引,那么InnoDB会自动生成一个不可见的名为RO