面试必考题-数据库自增主键

读完需要6分钟

速读仅需2分钟

无论是做PHP开发还是做JAVA开发甚至前端开发,只要是开发,面试的时候都必考数据库。为什么前端也要考数据库?因为数据库课程是计算机的基础课程,同样的基础课程还有操作系统,数据结构。只要写代码就永远跳不出这三门基础课。

面试官和面试者都知道要考数据库,都会去刷题,数据库的知识点其实很少,一天就能刷完。长久以往面试流程会变成背书流程,面试官题目没说完,答题者已经了然于心,这样根本选不出合适的CRUD boy。很多大厂意识到了这点,所以一直在改革,比如宇宙大厂字节跳动就需要手写算法(红黑树是必背题)。怎么改呢?可以参考高考,拿高考数学来说,每年考察的知识点都差不多,这就会导致考满分的人逐年递增(优秀的人和更优秀的人无法拉开差距)。和机器学习很像,样本量越大,考生越不需要靠「运气」做出「好」的结果。所以出题人要想办法考察答题人的解题思路。

面试谈到数据库肯定会谈到数据库引擎,不同索引的数据结构实现,SQL优化等。如果面试官直接问这几个问题,面试者肯定对答如流。因为网上的面试宝典早已把这些问题分析的入木三分,配上一些形象的例子,比读修仙小说还精彩。但优秀的面试官从不按套路出牌。

正常来说程序员是不会关心自增ID用完的,阿里的编程规范广为流传,里面严格要求自增ID为`unsigned bigint`,程序员和DBA都默认遵守这个规范。`unsigned bigint`到底有多大?The unsigned range is 0 to 18446744073709551615,想把这个值用完太难了。

那面试官到底想了解什么?

一. 自增ID用完了会报什么错?

具体报错信息是什么?面试官自己都不一定知道。不同的数据库底层实现不一样,不同版本也有差异。我测试不同版本的MySQL就有两个答案:

1. Duplicate entry '*****' for key 'PRIMARY'
2. SQL Error (167): Out of range value for column 'id'.

大家都知道会报错,但是没人能肯定具体报错信息是什么。可能是数据越界,也可能是主键冲突,那就没有了标准答案,最后看谁的知识储备更多。一般来说一面面试官的技术不一定比面试者强。

二. 自增ID为什么用不完?

第一个问题是为了引出第二个问题。因为自增主键通常会设置为`unsigned bigint`,最大值为18446744073709551615,假设我们的项目需要每秒记录100万条数据,这个自增ID使用100万年后都用不完。全球也没几家公司能达到这个量级。

如果面试官问200万年后不会用完吗?这是个好问题。

参照当前的数据库软件和服务器硬件来说,MySQL单机单表的处理能力是千万级别。意思是当单表数据达到1千万时,MySQL性能就会开始下降,需要着手优化,这里的瓶颈主要是查询耗时。我们可以通过分区再撑一段时间,当数据量到10亿时,基本到了MySQL的极限,不分表分库的话,业务难以持续。如果分表分库的话自增ID很难保证唯一性,这时候必须弃用自增ID,采用其他算法。最后从业务的角度来讲自增ID不可能用完,单表支撑不了那么大的数据量。

三. 自增ID如何优化

当单表数据量达到千万时,数据库的性能会开始下降。这时为了优化性能,同时保证数据有唯一ID,就是考察另一个知识点了,这里不展开讲,大家看下这篇文章。真假唯一数

PS:感谢有朋友监督我更新文章,我尽量不鸽。明天再发一篇,分享近期挖到的一个价值3千的CSS漏洞。

本文分享自微信公众号 - 城边编程(code-log)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JetpropelledSnake

Kafka学习笔记之Kafka背景及架构介绍

  本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比。并介绍了Kafka的架构,Producer消息路由,Consumer...

7430
来自专栏架构专题

由 Canal 组件分析集成中间件架构的一般过程

为什么要做数据同步?因为数据很多,还要共享或做它用。举个栗子,你从移动硬盘拷贝一份小小电影到你的 Macbook 上赏析,也叫 数据同步。但系统不比你的单纯,它...

14740
来自专栏程序员小明

今儿聊一聊Mysql的性能优化

没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5...

10670
来自专栏架构专题

这么多监控组件,总有一款适合你

监控是分布式系统的必备组件,能够起到提前预警、问题排查、评估决策等功效,乃行走江湖、居家必备之良品。

68830
来自专栏Node开发

Redis缓存击穿、缓存穿透、缓存雪崩

上篇文章谈到了Redis分布式锁,实际上就是为了解释为什么做缓存采用Redis而不使用map/guava。缓存分为本地缓存和分布式缓存。以 Java 为例,使...

17930
来自专栏Node开发

Redis与数据库数据一致性

可能谈到保持Redis与Mysql双库的数据一致性,可能很多人最先想到的方案就是读请求和写请求串行化,串到一个内存队列里去。但是这个方案有着一个致命的缺点:读请...

37240
来自专栏数据和云

化繁为简:数据库运维人员应该知道这些...

BethuneX数据库实时监控和智能巡检平台,首先它的初衷和愿景依然没有改变:成为数据库运维人员最喜欢使用的,并且能够帮助他们快速发现和解决数据库问题的智慧平台...

11150
来自专栏PHP专享栏

phpEnv一款优雅强大的php集成开发环境

php集成开发环境有很多种,例如phpstudy,wamp,xmapp等等,各有各的优点和缺点,本文并不是对各个 IDE 的使用和调试进行详细的对比和评测,因为...

14550
来自专栏微信公众号【Java技术江湖】

Spring 常犯的十大错误,打死都不要犯!

我们正在解决这个常见错误,是因为 “非我所创” 综合症在软件开发领域很是常见。症状包括经常重写一些常见的代码,很多开发人员都有这种症状。

8620
来自专栏bigsai

从100到1000万高并发的架构演进之路

本文以设计淘宝网的后台架构为例,介绍从一百个并发到千万级并发情况下服务端的架构的14次演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一...

22240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励