【索引专题】其他索引问题

本问题对应的项目链接:高频题回答模版训练

1、默认情况下我们会使用自增主见,你觉得为什么要⽤⾃增的主键?有什么好处?

2、自增主键的话,如果用 INT,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?

3、mysql 有多种引擎,介绍下 MEMORY 和 INNODB 的区别?

4、可以简单说一下 MEMORY 和 INNODB 各自适合用什么样的场景吗?

共以下 2 个回答

  • 終达·斯维达尼亚 永久会员 2024年2月16日 上午2:27

    1、默认情况下我们会使用自增主键,你觉得为什么要用自增的主键?有什么好处?

    • 从性能方面考虑,系统会自动获取当前 ID 的最大值加 1 作为下一条记录的 ID 值,也就是每次插入操作都是追加操作,不涉及到挪动其它记录,也就不会触发页分裂,效率更高。
    • 从存储空间方面考虑,由于每个非主键索引的叶子节点都保存有主键的值,如果使用整形自增主键,只占用 4 个字节。而如果使用业务字段,比如身份证,电话号等等,都远超这个大小,并且所有的二级索引都要承担这个空间占用。显然也不如自增主键。

    2、自增主键的话,如果用 int,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?

    int类型的字符有四个字节,上限是2^32 – 1,如果超出会报主键冲突错误,可以提前预测主键大小,提前将主键类型设置为8 个字节的 bigint unsigned,或者实行分库分表。

    3、Mysql 有多种引擎,介绍下 MEMORY 和 INNODB 的区别?

    • memory是Mysql的原生引擎,innodb是后来引入的第三方引擎。
    • innodb的索引是B+树结构,而memory的索引是B树,B+树可以减少内存的读写次数从而提高效率。
    • innodb支持行锁功能,而memory只支持表锁。
    • innodb支持redo log和bin log,支持数据库崩溃的恢复。

    4、可以简单说一下 MEMORY 和 INNODB 各自适合用什么样的场景吗?

    • Memory 引擎适合用在需要用内存临时表的场景,内存临时表数据量小,不会被其他线程访问,没有并发性的问题。临时表重启后数据需要删除,这也符合内存表的特性。
    • 其它情况都建议使用 InnoDB,因为如果表更新量很大,那必然需要考虑并发性,InnoDB 的行锁要比 Memory 的表锁并发性好。如果表查询量大,在数据量不大的前提下,InnoDB 也会将数据缓存在内存的 Buffer Pool 里,相比 Memory 的性能也不算差。
    0 赞同 0 条回复
  • 秊 永久会员 2023年8月2日 下午8:31

    1、默认情况下我们会使用自增主见,你觉得为什么要⽤⾃增的主键?有什么好处?

    从性能方面考虑,使用自增主键,可以在插入新记录时不指定 ID 的值,系统会自动获取当前 ID 的最大值加 1 作为下一条记录的 ID 值,也就是每次插入操作都是追加操作,不涉及到挪动其它记录,也就不会触发页分裂,效率更高。

    从存储空间方面考虑,由于每个非主键索引的叶子节点都保存有主键的值,如果使用整形自增主键,只占用 4 个字节。而如果使用业务字段,比如身份证,电话号等等,都远超这个大小,并且所有的二级索引都要承担这个空间占用。显然也不如自增主键。

    2、自增主键的话,如果用 INT,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?

    表定义的自增值达到上线后的逻辑是,再申请下一个 ID 得到的值不变。也就是当自增 ID 到达 $2^{32}-1$ 后,下一次插入的 ID 还是 $2^{32}-1$ 这时数据库就会报主键冲突错误,这个时候也没啥办法,可以提前考虑表是否可能达到这个上限,如果有可能,就该创建成 8 个字节的 bigint unsinged。

    3、mysql 有多种引擎,介绍下 Memory 和 InnoDB 的区别?

    首先 Memory 引擎不同于 InnoDB 的索引组织表,它使用堆组织表来组织数据,也就是数据和索引是分开的,其中数据部分以数组的方式单独存放,主键索引中存的是每个数据的位置,并且索引上的 key 是无序的。

    在插入新数据时,只要找到空位就可以插入新值。查询数据时,也不存在 InnoDB 的回表过程,所有索引的地位相同,都只查一次。

    除此之外,Memory 引擎不支持行锁,只支持表锁,在处理并发事务时,不如 InnoDB 的行锁性能好。但由于内存表的所有数据都保存在内存,在某些情况下它还是有速度快这个优势的。

    4、可以简单说一下 Memory 和 InnoDB 各自适合用什么样的场景吗?

    Memory 引擎适合用在需要用内存临时表的场景,内存临时表数据量小,不会被其他线程访问,没有并发性的问题。临时表重启后数据需要删除,这也符合内存表的特性。

    其它情况都建议使用 InnoDB,因为如果表更新量很大,那必然需要考虑并发性,InnoDB 的行锁要比 Memory 的表锁并发性好。如果表查询量大,在数据量不大的前提下,InnoDB 也会将数据缓存在内存的 Buffer Pool 里,相比 Memory 的性能也不算差。

    0 赞同 0 条回复

# 回答此问题

后才能回答