上期我们讲了索引,MyISAM和InnoDB的选择等相关的数据库面试题目,小伙伴们掌握的怎么样了?这期树懒君决定分享一下分库分表方面的面试题目,这是一个很经典的面试问题哦~
首先,要知道分库分表是两回事儿,大家可别搞混了,可能是光分库不分表,也可能是光分表不分库,都有可能。下面直接上问题!
分区表是由多个相关的底表实现的。这些基础表也由句柄对象表示,因此我们也可以直接访问各个区域,存储引擎管理区域的各个基础表与管理普通表相同(所有基础表都必须使用相同的存储引擎),区域表的索引只是在各个基础表相同的索引。该方案屏蔽了用户的细节,即使查询条件没有sharding column,也能正常工作。
许多资源受单体限制,如连接数量、网络吞吐等。如何进行隔断,在实际应用中是十分关键的要素之一。
从性能上看
随着单库数据量越来越大,数据库查询QPS越来越高,数据库读写所需的时间也越来越多。数据库的读写性能可能成为业务发展的瓶颈。相应地,需要优化数据库的性能。本文只讨论数据库水平的优化,不讨论缓存等应用水平的优化手段。
如果数据库查询QPS过高,就需要考虑拆库,通过分库分担单个数据库的连接压力。例如,如果查询QPS为3500,假设单个库可以支持1000个连接数,则可以考虑将其分成4个库来分散查询连接压力。
单表数据量过大时,数据量超过一定量级后,无论是数据查询还是数据更新,在索引优化等纯数据库水平的传统优化手段后,都可能存在性能问题。这是量的变化产生了质的变化。此时,有必要改变解决问题的想法。例如,从数据生产的源头、数据处理的源头解决问题。既然数据量很大,我们就分别治疗,成零。这产生了分钟,将数据按照一定的规则分成多个钟表,解决了在钟表环境下无法解决的访问性能问题。
从可用性上看
如果单个数据库发生事故,很可能会丢失所有数据。特别是在云时代,许多数据库都在虚拟机上行驶。如果虚拟机/宿主机发生事故,可能会造成无法挽回的损失。因此,除了传统的Master-Slave、Master-Master等部署水平,还可以考虑从数据分割水平解决这个问题。
此处我们以数据库宕机为例:
当然,我们也不能无限制的拆库,这也是牺牲存储资源来提升性能、可用性的方式,毕竟资源总是有限的。
分库分表方案可以分为下面3种
通常根据垂直拆分、水平拆分两种方式进行划分,当然,一些复杂的业务场景也可能选择两者结合的方式。
垂直拆分
垂直分表通常根据业务功能的使用频率,将主要受欢迎的字段放在一起作为主要表。然后,将不常用的东西根据各自的业务属性聚集起来,分成不同的次要表的主要表和次要表的关系一般是一对一的。
水平拆分(数据分片)
单表容量不超过500W,否则建议分级。将一块手表复制成同一块手表结构的不同手表,按照一定的规则将数据分别保存在这些手表中,保证手表的容量不太大,提高性能的当然,这些结构相同的手表可以放在一个或多个数据库中。
水平分割的几种方法: