【索引专题】其他索引问题
本问题对应的项目链接:高频题回答模版训练
1、默认情况下我们会使用自增主见,你觉得为什么要⽤⾃增的主键?有什么好处?
2、自增主键的话,如果用 INT,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?
3、mysql 有多种引擎,介绍下 MEMORY 和 INNODB 的区别?
4、可以简单说一下 MEMORY 和 INNODB 各自适合用什么样的场景吗?
本问题对应的项目链接:高频题回答模版训练
1、默认情况下我们会使用自增主见,你觉得为什么要⽤⾃增的主键?有什么好处?
2、自增主键的话,如果用 INT,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?
3、mysql 有多种引擎,介绍下 MEMORY 和 INNODB 的区别?
4、可以简单说一下 MEMORY 和 INNODB 各自适合用什么样的场景吗?
共以下 2 个回答
1、默认情况下我们会使用自增主键,你觉得为什么要用自增的主键?有什么好处?
2、自增主键的话,如果用 int,会有 int 最大数限制,如果超过 int 最大数,你觉得应该怎么办?
int类型的字符有四个字节,上限是2^32 – 1,如果超出会报主键冲突错误,可以提前预测主键大小,提前将主键类型设置为8 个字节的 bigint unsigned,或者实行分库分表。
3、Mysql 有多种引擎,介绍下 MEMORY 和 INNODB 的区别?
4、可以简单说一下 MEMORY 和 INNODB 各自适合用什么样的场景吗?
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 的性能也不算差。