面试的时候,面试官经常被问到数据库优化的知识点。今天总结一下数据库优化应该经历几个阶段。我认为这个答案是一个更好的答案。0x01:SQL优化和应用优化一个系统总是从小到大,所以当系统还是小系统的时候。首先要注意表的设计,合理使用主键、外键、索引;为字段选择合适的数据类型和合适的数据长度。使用SQL考虑索引何时有效;无效时,避免使用带索引失效的SQL。此外,程序优化也很重要。例如,如果可以批量执行SQL,则不应在程序循环中执行SQL。使用各种框架的缓存也很重要。比如你使用MyBatis,你应该合理使用MyBatis的一级缓存和二级缓存;使用Hibernate时,应该合理使用Hibernate的一级缓存和二级缓存。0x02:数据库读写分类当业务量达到一定程度时,可以考虑数据库读写分离方案,将读写业务分离。但是我们必须要考虑如何解决写数据库和读数据库的数据一致性问题。目前有很多开源的读写分离服务和框架。主要基于以下两种方案:应用程序根据业务逻辑进行判断,将增删改等写操作命令发送到写库,将查询命令发送到读库。使用中间件作为代理,负责识别是读还是写数据库请求,分发到不同的数据库。0x03:引入缓存数据库NoSQL数据库目前也很流行,尤其是Redis数据库。比如使用Redis缓存服务器,可以将一些常用的、不经常变化的数据缓存到内存中。读取内存中的数据比读取硬盘中的数据快不知多少倍。缓存数据库的引入增加了系统的复杂度,同时也存在关系数据库和NoSQL数据库的数据一致性问题。0x04:垂直拆分一个数据库由很多表组成,每个表对应不同的业务,垂直拆分是指按照业务对表进行分类,分布到不同的数据库中,这样数据或者压力就可以分担到不同的库中,如下图所示:优点:拆分后业务清晰,拆分规则清晰。系统之间的集成或扩展很容易。数据维护简单。缺点:部分业务表无法join,只能通过接口解决,增加了系统的复杂度由于每个业务的限制不同,存在单库性能瓶颈,不易进行数据扩容和性能改进。事务处理复杂。与垂直拆分相比,区别在于:垂直拆分是将不同的表拆分到不同的数据库中,而水平拆分是将同一个表拆分到不同的数据库中。相对于垂直拆分,水平拆分不是将表中的数据进行分类,而是将某个字段按照一定的规则分散到多个库中,每个表包含一部分数据。简单的说,我们可以把数据的水平切分理解为按照数据行的切分,即表中的一些行切入一个数据库,另一些行切入其他数据库,主要有分表和分库两种模式。如下图:分库模式和分表模式优点:没有单库大数据,高并发性能瓶颈对应用透明,应用侧转换很少按照合理的拆分规则进行拆分.Join操作基本上避免了跨库,提高了系统性能。稳定性和负载能力缺点:拆分规则难抽象分片事务一致性难抽象多数据扩容难解决难维护大量跨库join性能差
