1.数据库的技术上,目前我们公司在研究hadoop分层数据库,具体了解不多;外面流行的NoSql非关系型数据库,像亚马逊、谷歌还有一些日本企业都有自己的NoSql数据库;
2.传统关系型数据库的优化,数据库层的优化和上层使用的优化。
数据库层:需要DBA进行优化,减少碎片,进行分区等;
使用层的优化,即优化SQL
从外界因素来看影响SQL有:CPU、RAM、Network、Disk
CPU:SQL的大量order
by,大量group by,case when等都会很费CPU,需要CPU进行计算。是否可以使用汇总来减少此问题
RAM:查找的数据量过大,导致内存资源占用过多。
如无where的SQL,select
*的SQL,全表扫描等;
频繁的update、insert都会影响内存,每次对SQL的解析都需要一定的时间和空间。采用绑定变量。
Network:过多的DB连接,频繁的DB开关,跨库的关联,大量数据的导出,复杂的SQL等。
Disk:
大数据量的表,建立索引,保证索引的有效性;
减少大表的insert和delete,会造成磁盘碎片,导致磁盘指针的不连续性;
大表的insert和delete会造成索引的失效,必要时先去掉索引再操作增删改;
索引其实是一张表,要保证其精简
索引的建立,最好用在易排序字段,如number,date等,勿varchar;
varchar字段尽量保持长度的一致性,宁可多给出空间;
减少磁盘的读取次数;
对大表禁止顺序性的全表扫描,使用索引;
减少disdinct,用unionall代替union;
Not like,,全模糊like,is
null,is not null,not in都会使索引失效;
索引上不要使用任何函数,尽量在等号的另一头使用函数;
SQL的书写一致,减少解析时间;
选择最佳的执行计划,复杂的SQL,不如多个简单的SQL;
减少嵌套子SQL,使用关联查询;
避免笛卡尔积连接;
避免使用*,数据库需要对*进行一次匹配,会消耗资源,而且并不一定所有的字段都要进行查询或者写入,写入时表结构变化还会导致出错,所以避免*;
全表删除,不要使用delete,使用truncate;
全表分页的效率较低,建议使用分步是分页;
3.在数据读取优化到一定程度后,代码上也可以进行很大的优化。
避免过多的开装箱,使用值类型;
对引用类型的集合,多使用泛型;
避免循环嵌套,和无休止的递归;
避免循环中建立大对象;
对大对象的释放;
4.逻辑上的优化
在需要查询大量数据的时候,可以使用分页;
分页影响到一些图标的产生时,可以借助汇总,先展示汇总信息和图标,然后在进行详情的钻取;
时间空间的相互替换。
5.对常用信息的本地化保存,如QQ第一次加载很慢,但后面登陆会很快。