数据库访问优化法则详解之返回更少的数据

返回更少的数据

如果返回的数据更少,则可以减少网络传输或磁盘访问。可通过分页处理等方式减少返回数据。

数据分页处理

常用数据分页方式有以下3 种。

1.客户端(应用程序或浏览器)分页

将数据从服务器全部下载到本地应用程序或浏览器,在应用程序或浏览器内部通过本地代码进行分页处理。

优点:编码简单,减少客户端与应用服务器网络的交互次数。

缺点:首次交互时间长,占用客户端内存。

适应场景:客户端与服务器网络延时较大,但要求后续操作流畅,如手机GPRS 应用、超远程访问(跨国)等等。

2.应用服务器分页

将数据从数据库服务器全部下载到应用服务器,在应用服务器内部再进行数据筛选。以下是一个应用服务器端Java 程序分页的示例:

List list=executeQuery("select * fromemployee order by id");

Int count= list.size();

List subList= list.subList(10, 20);

优点:编码简单,只需要一次SQL 交互,总数据与分页数据差不多时性能较好。

缺点:总数据量较多时性能较差。

适应场景:数据库系统不支持分页处理,数据量较小并且可控。

3.数据库SQL 分页

采用数据库SQL 分页需要两次SQL 完成:

一个SQL 计算总数量。

一个SQL 返回分页后的数据。

优点:性能好。

缺点:编码复杂,各种数据库语法不同,需要两次SQL 交互。

Oracle 数据库一般采用ROWNUM 来进行分页,常用分页语法有如下两种:

直接通过ROWNUM 分页

select * from (

select a.*,rownum rn from

(select * from product a where company_id=?order by status) a

where rownum<=20)

where rn>10;

数据访问开销=索引IO+索引全部记录结果对应的表数据IO

采用ROWID 分页语法

优化原理是通过纯索引找出分页记录的ROWID,再通过ROWID 回表返回数据,要求内层查询和排序字段全在索引里。

create index myindex onproduct(company_id,status);

select b.* from (

select * from (

select a.*,rownum rn from

(select rowid rid,status from product awhere company_id=? order by status) a

where rownum<=20)

where rn>10) a, product b

where a.rid=b.rowid;

数据访问开销=索引IO+索引分页结果对应的表数据IO

实例:

一个公司产品有1000 条记录,要分页取其中20 个产品,假设访问公司索引需要50个IO,2 条记录需要1 个表数据IO。

那么按第一种ROWNUM 分页写法,需要550(50+1000/2)个IO;按第二种ROWID分页写法,只需要60(50+20/2)个IO。

只返回需要的字段

通过去除不必要的返回字段可以提高性能,如下所示。

调整前:

select * from product where company_id=?;

调整后:

select id,name from product wherecompany_id=?;

优点:

(1)减少数据在网络上的传输开销。

(2)减少服务器数据处理开销。

(3)减少客户端的内存占用。

(4)字段变更时提前发现问题,减少程序的Bug。

(5)如果访问的所有字段刚好在一个索引里面,则可以使用纯索引访问提高性能。

缺点:增加编码工作量。

由于会增加一些编码工作量,所以一般需要通过开发规范来要求程序员这么做,否则等项目上线后再整改,工作量会更大。

如果你的查询表中有大字段或内容较多的字段,如备注信息、文件内容等等,那在查询表时一定要注意这方面的问题,否则可能会带来严重的性能问题。如果表经常要查询并且请求大内容字段的概率很低,我们可以采用分表处理,将一个大表分拆成两个一对一的关系表,将不常用的大内容字段放在一张单独的表中。如一张存储上传文件的表:

T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE,FILE_CONTENT)

我们可以分拆成两张一对一的关系表:

T_FILE(ID,FILE_NAME,FILE_SIZE,FILE_TYPE)

T_FILECONTENT(ID, FILE_CONTENT)

通过这种分拆,可以大大减少T_FILE表的单条记录及总大小,这样在查询T_FILE时性能会更好,当需要查询FILE_CONTENT 字段内容时再访问T_FILECONTENT 表。

本文选自《Oracle DBA手记3:数据库性能优化与内部原理解析》一书

本书详细信息:http://blog.csdn.net/broadview2006/article/details/6905948

数据库访问优化法则详解之返回更少的数据相关推荐

  1. mysql入门优化_MySQL数据库:MySQL十大优化技巧详解

    本文主要向大家介绍了MySQL数据库的MySQL十大优化技巧详解,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是 ...

  2. java 修改mysql数据库表结构_MYSQL数据库表结构优化方法详解

    摘要:这篇MySQL栏目下的"MYSQL数据库表结构优化方法详解",介绍的技术点是"mysql数据库表结构.MySQL数据库.数据库表结构.MySQL.据库表结构.数据库 ...

  3. mysql如何限制数据修改密码_MySQL_MySQL数据库中修改密码及访问限制设置详解,MySQL是一个真正的多用户、多 - phpStudy...

    MySQL数据库中修改密码及访问限制设置详解 MySQL是一个真正的多用户.多线程SQL数据库服务器.MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序 ...

  4. Android 进阶——Framework 核心之Android Storage Access Framework(SAF)存储访问框架机制详解(二)

    文章大纲 引言 一.DirectFragment 1.当选中DirectoryFragment中RecyclerView的Item时 2.选中DirectoryFragment中RecyclerVie ...

  5. IOS数据库操作SQLite3使用详解(转)

    iPhone中支持通过sqlite3来访问iPhone本地的数据库. 具体使用方法如下 1:添加开发包libsqlite3.0.dylib 首先是设置项目文件,在项目中添加iPhone版的sqlite ...

  6. IOS数据库操作SQLite3使用详解

    sqlite数据库iosdatabasesqlinteger 目录(?)[+] iPhone中支持通过sqlite3来访问iPhone本地的数据库. 具体使用方法如下 1:添加开发包libsqlite ...

  7. mysql讲事物写到数据库_CookBook/1-MySQL数据库读写锁示例详解、事务隔离级别示例详解.md at master · Byron4j/CookBook · GitHub...

    MySQL数据库读写锁示例详解.事务隔离级别示例详解 锁 性能分:乐观(比如使用version字段比对,无需等待).悲观(需要等待其他事务) 乐观锁,如它的名字那样,总是认为别人不会去修改,只有在提交 ...

  8. 删除oracle数据库的三种方法,oracle数据库的删除方法详解

    oracle数据库的删除方法详解 1.图形界面删除 练习之前记得创建快照 执行命令之前要保证数据库属于open状态 SQL> alter database open; [oracle@local ...

  9. WinXP SP2 系统服务优化设置详解

    WindowsXP Professional SP2的系统服务优化设置详解 01.显示名称:Alerter ◎进程名称:svchost.exe -k LocalService ◎微软描述:通知所选用户 ...

  10. Windows XP 系统服务优化设置详解

    Windows XP 系统服务优化设置详解(绝对精华) 分享XP_SP2服务详解及优化 XP_SP2服务详解及优化 个人认为XP的优化只有从服务着手,才是真正的优化,网上流传着一些方法,我 觉得根本就 ...

最新文章

  1. ORA-01102: cannot mount database in EXCLUSIVE mode
  2. Mining of Massive Dataset----PageRank的两种问题spider traps和dead ends
  3. jmeter提取多个变量的多个值_jmeter用一个正则提取器提取多个值的两种方法
  4. 学校为什么要单位接收函_温江会计培训学校:为什么要学习会计实操
  5. matlab labs,DOCOMO Beijing Labs 借助 MATLAB 将移动通信技术的开发时间缩短 50%
  6. Ansible自动化运维笔记1(安装配置)
  7. ibatis和myibatis
  8. 一步步使用SAP CRM Application Enhancement Tool创建扩展字段
  9. VS.NET调试问题
  10. 22张图片倒叙霍金:我爱宇宙也爱这苦乐人生
  11. javafx阴影_JavaFX技巧来节省内存! 属性和可观察对象的阴影场
  12. 该服务器支持最多2100个参数,Mybatis批量查询拼装参数超长的解决办法
  13. 【Elasticsearch】 es 索引 内置 字段 _source
  14. Git学习系列(八)标签的管理及配置别名详解
  15. Intel CPU 易受新型的 SGAxe 和 CrossTalk 侧信道攻击
  16. 金融评分卡项目—8.逻辑回归模型在申请评分卡中的应用
  17. BZOJ4170 极光
  18. 如何使用python游戏开发模块—pygame?
  19. 【OC】线性二次型(LQR)性能指标最优控制(1)
  20. JQuery实现防抖节流

热门文章

  1. Scrapy爬虫框架的安装和使用
  2. 收集异常,不会给用户弹出异常信息
  3. 精彩编码 【进制转换】
  4. 物联网操作系统再思考-共享心跳中心机制(SHBC)
  5. 使用Microsoft Sync Framework做文件同步
  6. R/3 ABAP开发学习笔记---网摘
  7. (Zotero)开源的文献管理器 真香
  8. Ubantu 安装SSH
  9. vim插件ctags的安装和使用
  10. 使用tc对linux中某ip段限速