博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
提升数据库数据查询效率
阅读量:4097 次
发布时间:2019-05-25

本文共 2838 字,大约阅读时间需要 9 分钟。

1. 前言

随着信息技术的发展,信息系统在企业中的应用也越来越广泛,信息系统在企业运营中扮演者十分重要的角色。可以说在信息化如此广泛的今天,企业信息化是提升企业运营效率的必经之路,数据是企业资产中必不可少的组成部分,数据组织效率的高低可能直接影响企业业务的进展,数据的安全则关系到整个企业的命运与兴亡。数据是系统重要的组成部分,数据库又是承载数据最重要的载体,那么数据库在整个信息系统的地位也是可想而知的。数据库不仅承担这整个信息系统数据的存储管理,还要保证应用系统能够与其进行高效的交互。在现实的工作中,我们的数据库主要还是关系型数据库,所以在本文我们还是针对关系型数据库的优化进行讨论分析。

2. 数据库优化

数据库性能的提升主要有两种途径:硬件层面的提升与软件层面的提升。硬件层面的提升主要包括数据库所在服务器硬件的提升,如增加CPU核数,提升CPU主频,增加内存容量等方法,软件层面的提升有:数据库表结构的优化,表中各字段类型的选择,SQL语句的优化等。从性能提升成本的角度讲,软件层面的优化成本远远小于硬件层面的优化成本,但是从复杂性的角度看,硬件层面的优化要胜过软件层面的优化,因为采购回来直接部署即可,在人力发明相对花费较少。大部分情况还是采取软件优化的方式,因为这种方式虽然需要花费额外的人力去进行修改维护,但这种方式还是能够为企业节省不少资金,在我们的实际工作中也是采用这样的方法,所以本文只针对从软件层面优化做进一步的解释说明。

2.1 SQL语句的优化

SQL语句设计的恰当与否对用户查询所需要花费时间可能会产生很大的差异,而这种差异往往是不可忽略的。在一般的OA系统中,查询待办任务是用户使用频率最高的操作,当同时在线的用户较少的时候,此时数据库的查询压力可能还没有那么明显,当处于工作高峰期,如在任务提交结束节点前,这时候用户对数据库的操作的并发量会突然剧增,这时候每一次查询都给数据库带来很大的压力。当待办查询涉及多表查询的时候,连接查询无疑优于嵌套查询,这是因为在得到相同结果的前提下,连接查询需要扫描查询表的次数要远远小于嵌套查询扫描的次数,连接查询只是将大部分时间花在了Join操作上。当单表的数据量很大的时候,连接查询的优势则更为明显。所以当出现这种情况,应优先使用连接查询。

2.2 表的分隔

因系统初期架构设计的原因,系统会随着时间的推移当数据量逐渐增多时会逐渐拖低数据库的效率。很多时候单一一个信息系统,由于业务的原因或者其他原因等等,致使数据库中单张表的数据量要远远大于其他表的数据量,而且该表的数据增长速度也十分高。这样的表往往是用户使用最频繁的表。假设数据库中的数据随着时间的增长会无限制地增长下去,这样无论SQL语句设计得多么高效,那么最后的查询效率情况如何肯定是可想而知的。在这样一种情况下,降低单表的数据量肯定是首选的解决方法。那么如何才能降低单表的数据量呢?一般而言有以下几种方案:水平分隔,垂直分隔,优化表中的字段。

水平分隔:顾名思义就是将表进行水平条目方向的分隔,分隔可以按照一定规则进行操作,例如,对整个系统数据活跃度的分布调查,如果发现用户查询主要集中在某个时间段,那么可以将这个时间段中的数据放在主查询的表中,而其他数据则放在从查询表中,当然如果从查询表中的数据依然很多,影响查询效率,那么可以根据一定规则对从查询表继续进行水平分隔,每次查询优先操作主查询表,如果得到相应结果,查询结束,如果没有查找到,则从优先级高的从查询表中查询,返回相应结果。

垂直分割则是从表的垂直方向,即字段方向对数据表进行分隔,不同于水平分隔的规则制定,垂直分隔的原则一般是确定的,当然最终的目的还是将该表瘦身,将用处不大的字段分离出去。一般而言应该剔除冗余字段或者不经常用到的字段,将这些字段移到其他表中。如果这些字段有需要再用到,则用连接查询进行拼接,然后继续查询,这样做就相当于恢复了原来的旧表,但是这样的查询毕竟还是频率很低的,所以此时的开销高对系统整体性能体验的影响就不是那么大了。

2.3 表的字段优化

字段类型的合理选取和优化也是数据库优化十分常见的手段.在表中作为flag功能的字段,根据业务的需求,字段的取值范围可能是确定的。字段有N种值,0表示value1,1表示value2,……,N表示valueN-1,那么该字段的长度应该设为logN上取整。例如最简单的情况只有0/1两种值,那么该字段的位数设为1即可,以此类推。尽量避免使用text类型,因为text占用空间是,根据业务需求,例如文件名一般控制在N个字符,那么可以用varchar(N)代替text类型,这样使得数据字段能够在最有效的存储空间下进行工作,如果数据库数据存储占用空间不能进行合理的管理,那么在数据库加载数据时会对数据库造成较大的压力,进而致使数据库效率下降。

对于字段的优化,还有一种常见的方法是为常用的表中的常用列添加索引。我们常见的数据库系统,其索引使用的数据结构多是B-Tree或者B+Tree。索引的建立是基于某个字段的使用频率上的,索引可以避免全表扫描。多数查询可以仅扫描少量索引页及数据页,而不是遍历所有数据页。但是索引建立是占用空间的,如果索引建立太多,无意也会影响数据查询的效率。

2.4 后台代码查询优化

后台代码的优化主要还是集中于缓存的设置,比如利用Hibernate自带的缓存,也可以利用其它第三方工具,例如memcache是的用户可以缓存当前查询数据,如果再次查询,那么服务器就不必再去扫描一次数据库表,直接从缓存中读取上次的查询结果,从用户的角度看,用户无需了解这次查询的数据是哪里得到的,只要得到结果快就可以。

另外一点是从代码整体架构角度去分析,同表分割的问题类似,如果当某一种业务对应的controller全部集中在一个文件中的时候,致使代码量十分庞大。经过编译器编译得到的class文件或者dll文件同样还是很大,所以为了提升代码的运行效率,可以将代码进行合理的重构,类似于前面所述对表进行水平分割和垂直分割的思想,对代码也进行同样的分割,降低整个controller的压力,从而提升代码的执行速度。

3. 提示硬件的性能

这一点相比较上述几点就没啥技术含量了,但是很直接有效,比如增加服务器CPU核数,更换主频更高的CPU,增加服务器内存,这都是提示硬件性能的手段,无非就是这些手段成本比较高。

4. 小结

数据查询效率的高低轻则影响用户的体验,重则影响公司业务进行的速度,最严重的情况可能给公司带来经济上的损失,所以在信息系统运维上DBA(数据库管理员)一直是一个十分重要的角色,这个职位不仅要实时监控保证数据库的正常运行,还要保证数据库系统高效地运行。为了降低运维成本,在实施后台代码设计及数据库设计的时候就要将各种可能出现的问题都要提前想到,这样就可以使得系统能够达到高可用,高效率以及高伸缩。

转载地址:http://pwhii.baihongyu.com/

你可能感兴趣的文章
日常小bug&idea
查看>>
微信订阅号改版的想法
查看>>
几种常用开发语言的对比
查看>>
各种O2O,B2C,B2B,C2C的整理
查看>>
可以举一反三的数学题
查看>>
日常运营积累
查看>>
互联网会员体系
查看>>
阿里数据技术与产品部用户型产品经理一面+二面总结
查看>>
银联产品岗面试总结
查看>>
thoughtworks业务需求分析师面试总结
查看>>
APP注册登录分析及举例
查看>>
京东管培生群面+hr面面经
查看>>
产品经理要知道的个性化推荐(附分类和标签的差异)
查看>>
携程产品经理一面二面面经
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
工商银行产品经理面试+vivo产品群面面经
查看>>
顺丰一面+二面+平安科技一面+点我达群面+一面产品面经
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
日常整理——接口
查看>>