索引是数据库系统重要的feature,不管是传统的关系型数据库还是时兴的NoSQL数据库,它攸关查询性能,因而在设计数据库时须要细加考量。然而,Lotus Notes隐藏技术底层。以用户界面为导向。追求高速开发的理念,使得“索引”鲜有开发者提及,甚至了解。大家仅仅论及视图。而当不同的人在不同的场合说“视图”时。所指各异。

普通用户假设用视图一词,指的是显示一行行信息的列表;开发者口里的视图。是数据库里的一类设计元素。这种设计元素,依照Lotus Notes的风格,将视图层的设计与数据层的定义混合在一起,前者比如列的字体、颜色、宽度;后者包括选择文档,提取字段和计算列内容,定义排序、分类、总计等等。假设单纯考虑Notes的数据库部分。后者的数据定义才是有关主题的。

Notes应用程序往往在使用了一段时间后,也就是在数据库变大,用户变多后,变得非常慢。当中一个重要因素就是视图,打开应用程序、新建改动文档、运行代理都可能或明或暗地打开视图。

这些时候。正是索引隐藏在视图背后影响着性能。

在主流开发所用的技术组合中,数据库是独立的一块。开发者需用与编写业务逻辑时所用的语言不同的专业知识来设计和定义数据,所以才会衍生出专精于此的数据库管理员。在Lotus Notes应用程序中,数据库、业务逻辑和用户界面的开发紧密耦合,在大公司里尽管也有人专职维护server,部署和更新数据库,可是他们一般不会检查数据库的设计来优化性能。数据库的性能是程序开发者的分内之事,而实际上,若非经验丰富的程序猿,应用程序慢到非常多用户无法忍受,性能在Notes程序猿开发时,差点儿不会被考虑。数据库慢仅仅会被归咎于文档太多、附件太大、Notes数据库本来就如此。

很多老程序猿开发的应用程序里。同一类文档仅仅是为了分类顺序的不同就建了十来个视图,每一个视图十多二十个列,六七列为分类,其他差点儿全设置了排序。

文档数量一旦增多,如此设计将严重影响性能,而在设计者眼里,仅仅是为了方便用户而且是Notes便利性的证明。这种视图设计和其功能滥用。当然责任不全在程序猿身上,引导他们这样做的Notes的开发理念、帮助文档都难辞其咎。

说了这么长的开场白,如今就来讨论索引及其和应用程序性能的关系。

先概括关系型数据库里的索引的作用,以作为Notes视图索引的对比。简单地说。索引就是在大量数据中为了高速查询建立的从数据中某些实用的信息到这些信息所在位置的映射。

字典前面的拼音和部首检字表就是索引。更形象的样例是国外非常多图书的末尾都附有的索引,能够此查到重要的词语出现的页码。数据库里的记录数量庞大。实际使用时又有找出符合各种各样条件的记录的需求。比如一个记录了一百万条人员信息的表。包括姓名、生日、性别、地址、电话号码等等信息。

要从中找出姓赵的或者电话号码是26538941的人。假设没有特别的帮助,数据库系统仅仅能逐行检查记录是否符合条件,找到一条记录平均所需读取和检查记录的数量是N/2(N为记录的总数)。假设从记录中提取电话号码字段,排序。而且每条号码指向相应记录在表中的位置,就建成了一个索引。此时再要查询电话号码是26538941的人,仅仅需对索引应用二分查询算法,工作量就会降低到log2(N)的级别,再加上从定位的索引行确定和读取原始数据行的一次操作。另外,由于索引的每一行数据比原始记录的每一条要短非常多。单次读取本身也更快。索引的负面影响则是空间和维护成本。

索引的数据本身要占领空间,这非常好理解。原始记录更新(新增、改动和删除)时。索引自然也要随着更新。索引的更新能够选择与原始记录同一时候、定时或者在用到索引也就是查询时再进行。但不管怎样,与没有索引相比。都须要额外的计算。新增记录时,更新索引单纯是性能上的开销。

改动和删除时,除非是对全部记录,否则都有选择条件。此时的索引正起到与查询时相同的帮助,而改动和删除后更新索引则是开销。由于前者的优点更大。所以合起来的效果一般对性能还是正面的(除非记录数量不大或者索引数量过多)。

在《从视图索引说Notes数据库(下)》里将接着具体讨论Notes视图索引。

83. 从视图索引说Notes数据库(上)的更多相关文章

  1. 84. 从视图索引说Notes数据库(下)

    作用和代价上文介绍了关系型数据库里的索引.Notes数据库里的索引隐藏在视图概念里(本文的讨论仅仅针对Notes的视图索引,不包括全文索引.).开发者创建的视图仅仅是存放在数据库里的一条设计文档.数据 ...

  2. Oracle数据库对象(表空间/同义词/序列/视图/索引)

    数据库对象 Oracle数据库对象: 数据库对象是数据库的组成部分,常常用 CREATE 命令进行创建,可以使用 ALTER 命令修改,用 DROP 执行删除操作. 种类: (1)表空间:所有的数据对 ...

  3. 6SQL SERVER视图/索引

    一.视图 1.视图概念 ①视图是包含由一张或多张表的列组成的数据集.该表中的记录是由一条查询语句执行后所得到的查询结果所构成的. ②视图是一张虚拟表,它表示一张表的部分数据或多张表的综合数 据,其结构 ...

  4. 第五章 MySQL事务,视图,索引,备份和恢复

    第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行 ...

  5. flask 在视图函数里操作数据库

    在视图函数里操作数据库 在视图函数里操作数据的方式和在python shell中的联系基本相同,只不过需要一些额外的工作.比如把查询结果作为参数 传入模板渲染出来,或是获取表单的字段值作为提交到数据库 ...

  6. (4.22)sql server视图/索引视图概念

    (4.22)sql server视图 关键词:sql server视图.索引视图 SQL Server视图是由SQL语句组成的逻辑数据库对象.它也可以称为由SQL语句组成的虚拟表,该SQL语句可能包含 ...

  7. oracle 序列 视图 索引 同义词

    序列 Oracle 12C 之后,Oracle 之中提供的是一种手工的自动增长列控制,而这样的控制在 Oracle 之中使用序列(对象)完成. 序列的创建: CREATE SEQUENCE 序列名称 ...

  8. SQL Server 视图索引

    在视图上创建索引的另一个好处是:查询优化器开始在查询中使用视图索引,而不是直接在 FROM 子句中命令视图.这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益.在视图上创建 ...

  9. Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器

    ---视图 ---视图的概念:视图就是提供一个查询的窗口,来操作数据库中的数据,不存储数据,数据在表中. ---一个由查询语句定义的虚拟表. ---查询语句创建表 create table emp a ...

随机推荐

  1. Unity3D在一建筑GL材料可以改变颜色和显示样本

    void CreateLineMaterial()     {         if (!mat)         {             mat = new Material("Sha ...

  2. Android数据库专家秘籍(七)经验LitePal查询艺术

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/40153833 经过了多篇文章的学习,我们已经把LitePal中的绝大部分内容都掌握 ...

  3. Java贪吃蛇游戏

    package snake.game; import java.awt.CardLayout; import java.awt.Color; import java.awt.Graphics;   i ...

  4. "Cannot find entry symbol nable-stdcll-fixup; defaulting to 00401000" 解决方案

    在使用Qt 4.7.3, Qt 4.7.2 ,Qt 4.7.1(mingw 4.6.2 )的时候都会有一个问题无法编译通过,即用Qt Creator 编译的时候会发生一个错误 "Cannot ...

  5. 聊聊并发(六)——ConcurrentLinkedQueue的实现原理分析

    1. 引言 在并发编程中我们有时候需要使用线程安全的队列.如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把 ...

  6. table 谷歌下不出现滚动条

    <table> </table> <style> table {overflow-y:scroll;max-height:152px; height:auto;} ...

  7. Cocos2d-x 3.1.1 学习日志14--CocosStudio学习必看

    听说Cocos Studio非常久了,主要是由于骨骼动画.眼下看来Cocos2d-x播放动画的方式仅仅有2种: 第一种:是播放序列帧动画,即将动画的每一帧都载入进缓存里,须要播放时再使用Animati ...

  8. jQuery照片伸缩效应,这不是一个简单的图像缩放,它不影响其它元素的布局

    之前在网上看到这样的效果,但我没有收藏夹网址,后来被我不知道如何来实现这种效果. 如今,互联网已收集有关专门.真是功夫不负有心人,被我发现. 我也努力过自己尝试着写: 但仅仅是单纯的图片放大.并且还影 ...

  9. 【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

    内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做 ...

  10. 开源Math.NET基础数学类库使用(08)C#进行数值积分

    原文:[原创]开源Math.NET基础数学类库使用(08)C#进行数值积分               本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4 ...