赞
踩
在公司做程序,用的是阿里云的RDS数据库,里面存储的数据不是很多,所以就没有太在意里面的内容。然而到了压测的时候出现了问题,里面的数据查询异常的缓慢,这个为什么呢,如果也让整个程序运行的时候查询数据库的时间可以短一点,分多线程的时候如何才能让整个数据库的瓶颈提高一下呢?
发现这个问题还真是一个偶然,在功能上可以实现的程序,我们可以做优化的地方第一个要想到的就是索引,这个很是重要。
我们都知道,数据库的索引,一般都是数据库的主键为首,一个数据库表在建立的时候,数据库自动为主键ID建立了一个唯一索引来标记主键,这样就可以在插入重复数据的时候有一个对应了,但是其他的字段都是没有索引的。我们的环境是2万条数据,联3表进行查询,然后查询到匹配的数据。由于之前的数据量都是很少的,所以没有注意到这个问题,现在是2万条数据,很是明显,联表查询的过程持续了3分钟多才好。但是给查询条件里面的字段都添加上索引之后呢?这个时间变为了0.04秒,这个效率是显而易见的,让我们节省了几倍的时间。
我们在写数据库操作的时候,如果是碰到了多步的操作,必定会想要一个事务来管理这个操作的原子性,我这里的获取坑位号的功能也是这样的,但是在方法上加上了@Transaction标记之后,运行出现了奇怪的错误,说事务执行时间过长,导致事务执行失败,查了一下才知道是因为过于频繁的操作导致了数据库的事务锁,这个锁有两种方法可以解决,一是我们可以把里面查询和更新方法进行逻辑优化,达到不争用锁的目的,二就是我们可以在数据库配置的时候把这个等待时间适当的增大,就可以办到,具体是阿里云的RDS已经做好了,而且配置的很好,所以在RDS上面程序是本身没有问题的。
在程序中有一些固定逻辑的运算,可以适当的吧他们放到存储过程中去使用,这样可以很好的使我们在执行的时候加快执行的速度,因为存储过程是不用二次编译的。并且我们在java程序中加锁的时候,只需要在调用sql的时候加锁就可以了,这样也可以保证唯一性。
但是要牢记的是,存储过程实现比较复杂,并且在表和逻辑都不变更的情况下使用,这就要求很高的固定性。对于经常修改的数据库不是很合适,并且需要实际程序在访问的时候的权限问题,看能不能调用到存储过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。