zoukankan      html  css  js  c++  java
  • 数据库优化问题

    数据库优化

    前言:

    前一段时间常常遇到数据库优化问题。相关的博客我也看了,比较好的如下:

    ---- http://blog.csdn.net/java_pengjin/article/details/6122919

    然而每个人有每个人的经验和说法。以下是我非常认可的优化策略

    .调整数据库结构的设计

    1.从表的设计开始,对访问频繁的数据,充分利用数据库cache和应用的缓存。

    cache就是数据库插件,它为 Oracle 数据库提供了实时、可更新的缓存。详情了解:http://www.oracle.com/technetwork/cn/products/timesten/timesten-imdb-cache-083828-zhs.html

    2.数据量比较大的,在设计过程中,为了减少其他表的关联,增加一些冗余字段,提高查询性能。所以说数据冗余,不能说全都是没用的,合理的使用,也是可以提高效率的。

    3.原则上为创建的每个表都建立一个主键,主键唯一标识某一行记录,用于强制表的实体完整性。实际情况按实际情况出发。

    4.每一个外键列要建立一个索引之前先考虑,如果确认它是唯一的,就建立唯一索引。

    5.在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

    6.在频繁进行排序或分组(即进行group byorder by操作)的列上可以建立索引。

    .调整应用程序的结构设计

    1.减少应用和数据库的交互次数、同一个sql语句的执行次数

    2.设置Fetch Size:这里引用一下大神的结论。

    Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据我的测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%Fetch Size继续增大,性能提升的就不显著了。

    因此我建议使用Oracle的一定要将Fetch Size设到50。不过并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。

    3.优化业务逻辑:这里就不用说了,这需要根据具体业务优化具体内容。

    4.使用存储过程:如果采用存储过程你可以将整个业务逻辑封装在存储过程里,然后在客户端直接调用存储过程处理,这样可以减少网络交互的成本。

    .调整数据库sql语句

    sql语句优化。

    1.避免使用'*'查询仅仅返回需要的行和列就好,全表查询数据,味着将耗费时间是最长的。当然,数据量特别小的时候,使用列名和'*',效率几乎没特别大的区别,效率提高的也不是特别大。但是建议还是使用列名代替’*’。

    2.应尽量避免在 where 子句中对字段进行 null 值判断,并且避免在WHERE子句中使用innot inor 或者having。因为效率方面低。

    3.尽量减少表之间的关联,因为关联的表越多,效率越低。

    4.尽量减少使用NOT IN,可以用LEFT OUTER JOIN代替它

    5.使用exists代替select count(*)来判断是否存在记录

    6.尽量减少使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BYSQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序

    7.合理使用分组Group by...Having、排序ORDER BY

    8.大量复杂运算可以在客户端处理.

    4.调整服务器内存的分配

    1.可以根据数据库的运行状态调整数据库全局区(SGA)区的数据缓冲区,日志缓冲区,和共享池的大小;

    2.还可以调整全局区的大小;需要注意的是,SGA区不是越大越好,SGA区过大会占用操作系统使用的内存而引起虚拟内存的页面交换,这样反而会降低系统。

    SGA主要有三部分组成:共享池,数据库缓冲区,日志缓冲区;

    共享池:共享SQL区和数据缓冲区;

    共享SQL区是存放SQL命令的区域;

    数据字典缓冲区存放的是数据库运行的动态信息;

    具体设计,想了解的可以看看:http://blog.csdn.net/zhoudaxia/article/details/9008361

    5.调整硬盘I/O

    1.这一步是在信息系统开发之前完成的。数据库管理员可以将组成同一个表空间的数据文件放在不同的硬盘上,做到硬盘之间I/O负载均衡。

    相关解析:

    http://www.yqdown.com/shujuku/Oracle/27984.htm

    6.调整操作系统的参数

    1.运行在UNIX操作系统上的ORACLE数据库,可以调整UNIX数据缓冲池的大小,每个进程所能使用的内存大小等参数。

    2.减少数据库服务器CPU运算

    北上广深是个高节奏的生活,作为一个新人,很多时候我们都在感叹职位上老人的智慧。以前通过搜索引擎,80%的问题都有答案。那么现在我是觉得90%都会有答案。那么作为我们新人的的核心竞争力到底在哪里?
  • 相关阅读:
    【问题解决方案】单个文件夹嵌套时github仓库中最外层文件夹直接显示所有嵌套文件夹名的问题
    【问题解决方案】本地仓库删除远程库后添加到已有github仓库时仓库地址找不到的问题(github仓库SSH地址)
    【问题解决方案】git/github本地和远程仓库的重命名
    【学习总结】《大话数据结构》- 总
    【机器学习】李宏毅机器学习-Keras-Demo-神经网络手写数字识别与调参
    【问题解决方案】Keras手写数字识别-ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接
    【学习总结】win7使用anaconda安装tensorflow+keras
    【问题解决方案】AttributeError: module 'pygal' has no attribute 'Worldmap'
    【问题解决方案】ImportError: No module named 'pygal'
    【问题解决方案】Github中的jupyter notebook文件(.ipynb)加载失败/失败
  • 原文地址:https://www.cnblogs.com/harry-Consonance/p/6148509.html
Copyright © 2011-2022 走看看