针对数据的访问量过大和数据的动态交互过多的时候,造成服务器的内存和Cpu的使用率都是高居不下的问题我个人的一点看法。
一:数据库优化
1、数据和日志文件分开放在不同磁盘上
数据文件和日志文件的操作会产生大量的I/O。在可能的条件下,日志文件应该存放在一个与数据和索引所在的数据文件不同的硬盘上以分散I/O,同时还有利于数据库的灾难恢复。
2、优化表分区,索引分区
表分区原因:
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,此时将这个表一分为二或者更多分,表还是这个表,只是将其内容存储分开,这样读取就快了N倍了
原理:表数据是无法放在文件中的,但是文件组可以放在文件中,表可以放在文件组中,这样就间接实现了表数据存放在不同的文件中。
表分区的优缺点 :
优点:
改善查询性能,对分区对象的查询可以仅搜索自己关系的分区,提高检索数据
增强可用性,如果表的某个分区出现故障,表在其他分区的数据仍可用
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。
缺点:
分区表相关:已经存在的表没有方法可以直接转化为分区表。不过 Oracle 提供了在线重定义表的功能。
使用场景:
1、 表的大小超过2GB
2、 表中包含历史数据,新的数据北增加到新的分区表中
当一个表里的数据很多时,可以将其分拆到多个的表里,因为要扫描的数据变得更少 ,查询可以更快地运行,这样操作大大提高了性能,表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表
实现:
(1)、创建分区函数
CREATE PARTITION FUNCTION xx1(int)
AS RANGE LEFT FOR VALUES (10000, 20000);
注释:创建分区函数:myRangePF2,以INT类型分区,分三个区间,10000以内在A 区,1W-2W在B区,2W以上在C区.
(2)、创建分区架构
CREATE PARTITION SCHEME myRangePS2
AS PARTITION xx1
TO (a, b, c);
注释:在分区函数XX1上创建分区架构:myRangePS2,分别为A,B,C三个区间
A,B,C分别为三个文件组的名称,而且必须三个NDF隶属于这三个组,文件所属文件组一旦创建就不能修改
(3)、对表进行分区
常用数据规范–数据空间类型修改为:分区方案,然后选择分区方案名称和分区列列表,结果如图所示:
也可以用sql语句生成
CREATE TABLE [dbo].[AvCache](
[AVNote] varchar NULL,
[bb] [int] IDENTITY(1,1)
) ON myRangePS2;
–注意这里使用[myRangePS2]架构,根据bb分区
(4)、查询表分区
SELECT *, $PARTITION.myRangePF2 FROM dbo.AVCache
这样就可以清楚的看到表数据是如何分区的了
(5)、创建索引分区
3、分布式数据库设计
分布式数据库系统是在集中式数据库系统的基础上发展起来的,理解起来也很简单,就是将整体的数据库分开,分布到各个地方,就其本质而言,分布式数据库系统分为两种:
A .数据在逻辑上是统一的,而在物理上却是分散的,一个分布式数据库在逻辑上是一个统一的整体,在物理上则是分别存储在不同的物理节点上,我们通常说的分布式数据库都是这种
B.逻辑是分布的,物理上也是分布的,这种也成联邦式分布数据库,由于组成联邦的各个子数据库系统是相对“自治”的,这种系统可以容纳多种不同用途的、差异较大的数据库,比较适宜于大范围内数据库的集成。
二:数据表优化
1、设计规范化表,消除数据冗余
2、“三少原则”
①:数据库的表越少越好
②:表的字段越少越好
③:字段中的组合主键、组合索引越少越好
3、字段设计原则
A、数据类型尽量用数字型,数字型的比较比字符型的快很多。
B、 数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。
C、 尽量不要允许NULL,除非必要,可以用NOT NULL+DEFAULT代替。
D、少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。
E、 自增字段要慎用,不利于数据迁移
4、表与表之间依赖关系建议物理依赖
三:SQL优化
1、尽量避免模糊匹配、in、not in、or、having 、避免全表扫描
2、在WHERE 语句中,尽量避免对索引字段进行计算操作
3、减少数据库访问次数
4、使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
5、在可以使用UNION ALL的语句里,使用了UNION
UNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时便应该使用UNION ALL,如xx模块的某个查询程序就曾经存在这种情况,见,由于语句的特殊性,在这个脚本中几个子集的记录绝对不可能重复,故可以改用UNION ALL)
6、带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序