数据库优化指南

选用合适数据库

SQL

SQL Server、MySQL(根据事务选择存储引擎)、Oracle

NoSQL

键值型数据库、文档型数据库、搜索引擎、列式存储和图形数据库。

表设计

  1. 表结构遵循第三范式原则;
  2. 如果分析查询应用比较多,尤其是需要进行多表联查的时候,可以采用反范式进行优化。反范式采用空间换时间的方式,通过增加冗余字段提高查询的效率;
  3. 表字段的数据类型选择,关系到了查询效率的高低以及存储空间的大小。一般来说,如果字段可以采用数值类型就不要采用字符类型;字符长度要尽可能设计得短一些。针对字符类型来说,当确定字符长度固定可以采用 CHAR 类型;当长度不固定通常采用VARCHAR 类型。

优化逻辑查询

逻辑查询优化

对 SQL 语句进行等价变化,重写查询(子查询、等价谓词、视图重写、条件简化、连接消除、嵌套连接消除)

物理查询优化

物理查询优化是将逻辑查询的内容变成可以被执行的物理操作符,从而为后续执行器的执行提供准备。它的核心是高效地建立索引,并通过这些索引来做各种优化。

建立索引注意事项:

  1. 数据重复度高,就不需要创建索引。通常在重复度超过 10% 的情况下,可以不创建这个字段的索引;
  2. 要注意索引列的位置对索引使用的影响;
  3. 要注意联合索引对索引使用的影响;
  4. 要注意多个索引对索引使用的影响。

使用 Redis 或 Memcached 作为缓存

因为数据都是存放到数据库中,我们需要从数据库层中取出数据放到内存中进行业务逻辑的操作,当用户量增大的时候,如果频繁地进行数据查询,会消耗数据库的很多资源。如果我们将常用的数据直接放到内存中,就会大幅提升查询的效率。

键值型数据库可以帮助我们解决上述问题。

从支持的数据类型来说, Redis 比 Memcached 要多,它不仅支持 key-value 类型的数据,还支持 List,Set,Hash 等数据结构。 当我们有持久化需求或者是更高级的数据处理需求的时候,就可以使用 Redis 。如果是简单的 key-value 存储,则可以使用 Memcached 。

库级优化

如果读和写的业务量都很大,并且它们都在同一个数据库服务器中进行操作,那么数据库的性能就会出现瓶颈,这时为了提升系统的性能,优化用户体验,我们可以采用读写分离的方式降低主数据库的负载,比如用主数据库( master )完成写操作,用从数据库( slave )完成读操作。除此以外,我们还可以对数据库分库分表。

垂直切分、水平切分

垂直切分

数据表过多,可以采用垂直分库的方式,将关联的数据表部署在一个数据库上。列过多,可以采用垂直分表的方式,将数据表分拆成多张,把经常一起使用的列放到同一张表里。

水平切分

采用垂直分表的形式,就是将一张数据表分拆成多张表,采用水平拆分的方式,就是将单张数据量大的表按照某个属性维度分成不同的小表(将大的数据表分拆成不同的子表,每张表保持相同的表结构)
eg:把不同年份的数据放到不同的数据表中。

总结

本文从数据库的选取、表的设计、查询的优化、使用键值型数据库帮助以及库级别的优化几个方向提供了数据库优化的思路,具体的优化案例请期待后续博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章