面经 -1

本贴最后更新于 392 天前,其中的信息可能已经渤澥桑田

电话面试

简历存在问题

项目逻辑复杂、冷门,很难给对方表述清楚

改进:项目修改为 OJ 平台

相关问题

1、MySQL 分库分表

  • 为什么要分库分表?

    当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果再有联合查询的话,我想有可能会死在那儿了。而分库主要是为了面对高并发的读写访问。总的来说目的都是减小数据库的负担,缩短查询时间。

  • 具体是如何对数据库如何进行垂直拆分或水平拆分的?

    水平拆分的意思,就是把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一样,只不过每个库表放的数据是不同的,所有库表的数据加起来就是全部数据。水平拆分的意义,就是将数据均匀放更多的库里,然后用多个库来扛更高的并发,还有就是用多个库的存储容量来进行扩容。


    • 垂直拆分的意思,就是把一个有很多字段的表给拆分成多个表,或者是多个库上去。每个库表的结构都不一样,每个库表都包含部分字段。一般来说,会将较少的访问频率很高的字段放到一个表里去,然后将较多的访问频率很低的字段放到另外一个表里去。因为数据库是有缓存的,你访问频率高的行字段越少,就可以在缓存里缓存更多的行,性能就越好。
  • 分库分表后,id 主键如何处理?
    snowflake 算法是 twitter 开源的分布式 id 生成算法,一个 64 位的 long 型的 id,1 个 bit 是不用的,用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。

    • 1 bit:不用,为啥呢?因为二进制里第一个 bit 为如果是 1,那么都是负数,但是我们生成的 id 都是正数,所以第一个 bit 统一都是 0。
    • 41 bit:表示的是时间戳,单位是毫秒。41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2^41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
    • 10 bit:记录工作机器 id,代表的是这个服务最多可以部署在 2^10 台机器上哪,也就是 1024 台机器。但是 10 bit 里 5 个 bit 代表机房 id,5 个 bit 代表机器 id。意思就是最多代表 2^5 个机房(32 个机房),每个机房里可以代表 2^5 个机器(32 台机器)。
    • 12 bit:这个是用来记录同一个毫秒内产生的不同 id,12 bit 可以代表的最大正整数是 2^12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。

    算法可见:面试官:分库分表之后,id 主键如何处理? (qq.com)

    怎么说呢,大概这个意思吧,就是说 41 bit 是当前毫秒单位的一个时间戳,就这意思;然后 5 bit 是你传递进来的一个机房 id(但是最大只能是 32 以内),另外 5 bit 是你传递进来的机器 id(但是最大只能是 32 以内),剩下的那个 12 bit 序列号,就是如果跟你上次生成 id 的时间还在一个毫秒内,那么会把顺序给你累加,最多在 4096 个序号以内。

    所以你自己利用这个工具类,自己搞一个服务,然后对每个机房的每个机器都初始化这么一个东西,刚开始这个机房的这个机器的序号就是 0。然后每次接收到一个请求,说这个机房的这个机器要生成一个 id,你就找到对应的 Worker 生成。

    利用这个 snowflake 算法,你可以开发自己公司的服务,甚至对于机房 id 和机器 id,反正给你预留了 5 bit + 5 bit,你换成别的有业务含义的东西也可以的。

    这个 snowflake 算法相对来说还是比较靠谱的,所以你要是真搞分布式 id 生成,如果是高并发啥的,那么用这个应该性能比较好,一般每秒几万并发的场景,也足够你用了。

2、创建表的时候需要注意什么

  • 尽量做到冷热数据分离,减小表的宽度。更有效的利用缓存,避免读入无用的冷数据
  • 经常一起使用的列放到一个表中 (避免更多的关联操作)
  • 消除冗余,减少存储成本。不过有时为了提高运行效率,适当保留冗余数据
  • 命名规范
  • 注释

3、外键相关

  • 为什么要用外键使用外键
  • 使用外键可以让数据库自身保证数据一致性,完整性,更可靠。
  • 但是外键也有很多弊端
    • 外键会降低数据库性能。总是需要对外键相对应的表查询有无对应的数据
    • 复杂的外键关联导致维护困难

4、如何去优化一条 SQL 语句?explain

image.png

详情可见:mysql explain 的用法 - 简书 (jianshu.com)

5、redis 什么时候把内存中的数据同步到数据库

6、简单描述一下项目的业务流程

  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 612 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...