数据库优化方法
2018-10-18 本文已影响0人
小码弟

互联网数据一般都存在数据库中,如何高效快速的读写数据库对于高并发的服务至关重要。下面总结最近接触到的方法。
- 数据分区
对海量数据的查询优化,一种重要方式是如何有效的存储并降低需要处理的数据规模,所以我们可以对海量数据进行分区。例如,针对年份存取的数据,可以按照年进行分区,不同数据库有不同的分区方式,但处理机制却大体相同。例如SQLserver的数据分区将不同的数据存于不同的文件组中,而不同的文件组存在不同的磁盘分区下,这样把数据分区,减少磁盘IO和系统负荷。 - 索引
索引一般可以加速数据的检索数据,加速表之间的连接,对表建索引包括在主键上建立聚簇索引,将聚合索引建立在日期列上。
索引优点很多,但是对于索引的建立,还需要考虑实际情况,而不能对每个列都建索引。如果表结构很大,你要考虑到建立索引和维护索引的开销,索引本身也占物理空间,动态修改表也要动态维护索引,如果这些开销大过索引带来的速度优化,那就得不偿失了。 - 缓存机制
当数据量增加时,一般的处理工具都考虑到缓存问题,缓存大小的设置也关系到数据处理的表现。例如,处理2亿条数据聚合操作时,缓存设置为100000条/buffer合理。 - 加大虚存
由于系统资源有限,而需要处理的数据量非常大,当内存不足时,适量增加虚存来解决。 - 分批处理
由于处理信息量巨大,可以对海量数据进行分批处理(类似云计算的MapReduce),然后再对处理后的数据进行合并操作,分而治之,这样有利于处理小数据。 - 使用临时表和中间表
数据量增加时,处理中要考虑提前汇总,这样做的目的是化整为零,大表变小表,分块处理完成后再利用一定的规则进行合并,处理过程中的临时表的使用和中间结果的保存都非常重要。如果对超海量的数据,大表处理不了,只能拆分为多个小表。如果处理过程中需要多步汇总操作,则可按汇总步骤一步一步来。 - 优化查询语句
查询语句的性能对查询效率的影响非常大。尽量早地缩小查询范围。 - 使用视图
视图是表的逻辑表现,不占用物理空间。对于海量数据,可以按一定的规则分散到各个基本表中,查询过程基于视图进行。 - 使用存储过程
在存储过程中尽量使用SQL自带的返回参数,而非自定义的返回参数,减少不必要的参数,避免数据冗余 - 用排序来取代非顺序存储
磁盘臂的来回移动使得非顺序磁盘存取变成了最慢的操作,但是在SQL语句中这个现象被隐藏了,这样就使得查询中进行了大量的非顺序页查询,降低了查询顺序。 - 使用采样数据进行数据挖掘
基于海量数据的数据挖掘方兴未艾,面对超海量数据,一般的挖掘算法往往采用数据抽样的方式进行处理,这样误差不会太大,大大提高处理效率和处理的成功率。一般采样时应注意数据的完整性,防止过大的偏差。