1、连接数据库
最基本的就是JDBC。至于其他的ORM框架,如MyBatis、Hibernate等都是对JDBC的封装。
对数据库连接涉及到TCP连接,是有一定的网络开销的。
2、对sql解析、编译、优化、生成执行计划
sql写出来后数据库并不会完全按照我们写的sql去执行,还要对我们的sql进行相应的优化。
例如:表A中建立了A.a、A.b、A.c这个顺序的组合索引,而我们查的时候如果条件为A.a=a and A.c=c and A.B=b,显然 这种a-->c-->b去查的时候是不会用到我们建的组合索引的,但是数据库会帮我们调整顺序为a-->b-->c,这样就可以用到我们建的组合索引了。
至于执行计划,在我们的sql前面加上explain,即explain select * from .....,就可看到执行计划,这个能够真实反映出数据库对我们的sql进行的操作
explain解析及使用可参考:
http://blog.csdn.net/wuliu_forever/article/details/52804691
3、内存IO操作磁盘
我们的数据是存储在计算机的存储器上的,主要概念为内存(主存)和外存(辅存)。
对内存的读取可以直接通过地址总线和数据总线进行操作,不存在机械运动,速度比较快。而存储数据、索引等则存储在磁盘上,读取磁盘的数据需要通过转动磁盘,移动磁头到对应的扇区,这涉及到机械运动,相对直接从数据总线读取数据来说肯定会慢很多。这个读取磁盘数据的过程可以理解为读取、操作数据的I/O开销。
由以上三个过程显然可以看到,如果我们通过for循环去调用dao的话,必然会造成很大程度的性能下降。
由于项目用到的RPC是HSF的,所以可以通过EDAS监测到方法中每一行所消耗的时间。之前做性能优化时候把并发设置到几千一个dao去查一个空表基本都需要10ms出头,甚至有时候会需要将近100ms,可见调用dao的消耗还是蛮大的。