前言
数据库相关的面试题早已成为了一线互联网大厂面试的家常菜,如果你对数据库不太熟悉,我劝你不要轻易面试大厂。那么,为什么数据库成了大厂面试的家常菜呢?主要原因当然还是海量数据。
无论对于刚入行的小白还是有几年Java开发经验的从业而言,面试不仅是你必须要面对的事情,更是你升职加薪的一个途径。许多朋友面试了几家公司也没拿到一个满意的薪资,究其根还是在于自己的知识不够系统化,太凌乱。针对性的温故知新往往能达到事半功倍的效果。
在这里我总结一线互联网大厂java面试中常问的“数据库”问题,由于过多答案文字仅以图片展示,所有内容已总结成文档在文末有领取方式!
为什么要分库分表?
首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈。用大白话来说就是数据库快扛不住了。
数据库出现性能瓶颈,对外表现有几个方面:
- 大量请求阻塞在高并发场景下,大量请求都需要操作数据库,导致连接数不够了,请求处于阻塞状态。
- SQL 操作变慢如果数据库中存在一张上亿数据量的表,一条 SQL 没有命中索引会全表扫描,这个查询耗时会非常久。
- 存储出现问题业务量剧增,单库数据量越来越大,给存储造成巨大压力。
从机器的角度看,性能瓶颈无非就是CPU、内存、磁盘、网络这些,要解决性能瓶颈最简单粗暴的办法就是提升机器性能,但是通过这种方法成本和收益投入比往往又太高了,不划算,所以重点还是要从软件角度入手。
数据库相关优化方案
数据库优化方案很多,主要分为两大类:软件层面、硬件层面。
软件层面包括:SQL 调优、表结构优化、读写分离、数据库集群、分库分表等;
硬件层面主要是增加机器性能。
SQL 调优
SQL 调优往往是解决数据库问题的第一步,往往投入少部分精力就能获得较大的收益。
SQL 调优主要目的是尽可能地让那些慢 SQL 变快,手段其实也很简单就是让 SQL 执行尽量命中索引。
开启慢 SQL 记录
如果你使用的是 Mysql,需要在 Mysql 配置文件中配置几个参数即可。
slow_query_log=on
long_query_time=1
slow_query_log_file=/path/to/log
调优的工具
常常会用到 explain 这个命令来查看 SQL 语句的执行计划,通过观察执行结果很容易就知道该 SQL 语句是不是全表扫描、有没有命中索引。
select id, age, gender from user where name = '爱笑的架构师';
返回有一列叫“type”,常见取值有:
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
ALL 代表这条 SQL 语句全表扫描了,需要优化。一般来说需要达到range 级别及以上。
表结构优化
以一个场景举例说明:
“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如