`
marlonyao
  • 浏览: 252692 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HSQL 索引内部实现

阅读更多

HSQL使用AVL Tree来实现索引,AVL Tree有如下特性:

    * 它是一个二叉树。二叉树的每个结点有零个或1个左孩子,零个或1个右孩子,和一个父亲结点(除了根节点以外)。任何节点必须满足以下关系:左子树中每个结点都不能大于这个结点,右子树的每个结点都不能小于这个结点。因此对一个二叉树进行中序遍历,我们就得到这棵树的升序排列。
    * 它是平衡的。每个结点的左子树与右子树的高度之差不能大于2, 也就是说只能为-1,0,1。

HSQL 用类Index来代表索引,它其实就是一个AVL Tree,这个Tree的每个结点就是一个Record。在HSQL中, Index是数据查询的入口,所有数据的查询(也就是Select语句)都是通过遍历Index内部Tree来查找的,因此,HSQL会为每个表至少建立一个索引,也就是主键索引。如果一个表没有主键,HSQL会自动为这个表创建一个主键列,当然这个列是用户不可见的,并且为这个列创建索引。当没法利用其它索引时,就使用主键索引。

在HSQL1.43中,它只当查询条件为<, <=, =, >, >=并且对该列进行了索引,才会利用相应的索引。利用索引时,HSQL会建立两个条件表达式(内部用类Express来表示)eStart和 eEnd,HSQL会利用eStart在Index中找到第一个满足条件的Record,然后根据这个Record找到下一个紧邻的Record,二叉树的一个标准操作,一直到eEnd条件不满足为止。

例子,对于查询条件 “COLA = 1”,如果列COLA存在索引,HSQL会建立两个条件表达式(内部用类Express来表示)eStart和eEnd,这个条件都是“COLA = 1”,因此它首先找到第一个满足这个条件Record,然后根据这个Record找到下一个Record,如果这个Record也满足条件"COLA = 1",则继续查找一下Record,直到这个Record的COLA大于1为止(小于1是不可能的)。

对于查询条件“COLA>=1",eStart是“COLA = 1",eEnd为空,也就是总是满足条件。HSQL将首先找到满足条件eStart的第一个Record,然后找下一个Record,直到Tree最后一个Record.

对于查询条件“COLA>1",eStart是“COLA > 1",eEnd为空,HSQL将首先找到满足条件"COLA > 1"的第一个Record,然后再找这个Record的所有后继 Record.

对于条件 <, <=是类似的。

我们很容易得到在HSQL中基于主键的查询效率是O(log(N)),N是表中Record的数目。

思考:
1。AVL Tree无法对IN条件利用索引,因为它没有明确的顺序结构,不过可以将IN折成多个"="的或,这样就需要对AVL TREE搜索多次,如果IN的操作数不多的话,这个效率应该还是比全扫描要高得多。对LIKE条件,AVL Tree似乎没有多大的意义,当然也可以,比如对条件"COLA LIKE 'aaa%'",可能肯定满足条件的Record肯定在'aaa'和'aab'之间,因此可以将它们设置为eStart和eEnd来缩小查找范围,但如果条件是"COLA LIKE '%aaa'",应该就没辙了吧。

2。似乎同时只能利用一个索引,比如查询条件"COLA < 1 and COLB > 3",如果对在这两列上分别有索引IndexA和IndexB,那么只能要么利用IndexA,要么利用IndexB。当然也可以同时利用两个索引,对它们的结果取交集,但这样需要扫描的Record更多。

分享到:
评论

相关推荐

    hsql-file数据库的java简单调用实现

    标题中的“hsql-file数据库的java简单调用实现”指的是使用Java编程语言与HSQLDB(HyperSQL数据库)进行交互,特别是在文件模式下操作数据库。HSQLDB是一种轻量级、开源的关系型数据库管理系统,它支持内存模式和...

    hsql查询语法

    HSQL查询语法 HSQL(Hibernate Query Language)是一种强大且灵活的查询语言,用于查询Hibernate应用程序中的数据。下面将对HSQL的基本语法和使用方法进行详细介绍。 1. 大小写敏感性问题 HSQL查询语句对大小写并...

    如何使用hsql数据库

    如何使用hsql数据库

    hsql可视化工具

    2. **数据库浏览**:展示数据库的架构,包括表格、视图、索引和其他数据库对象,用户可以通过该界面查看和操作这些对象。 3. **SQL查询编辑器**:提供一个文本区域供用户编写SQL语句,支持自动补全和语法高亮,方便...

    HSQL源代码

    通过调试源代码,我们可以逐步深入理解HSQLDB的内部工作机制,如表的创建、索引的管理、SQL语句的解析和执行等。 总的来说,理解并研究HSQL源代码不仅能够提升对数据库系统的深入认识,也能锻炼和提升Java编程和...

    收集的全部HSQL DataBase资料(HSQL DataBase-关于Java 的纯数据库)

    HSQL Database,全称为HyperSQL Database,是一款轻量级、高性能、开源的SQL关系型数据库管理系统,特别适合于Java应用程序。这款数据库系统以其简洁的API、快速的性能和全面的SQL支持,在Java开发环境中得到了广泛...

    HSQL安装部署使用手册

    《HSQL数据库安装部署使用详解》 HSQL(HyperSQL)是一种轻量级、高性能的关系型数据库管理系统,常用于开发测试环境或者嵌入式应用。本文将详细介绍HSQL的安装、部署以及使用过程,帮助您顺利搭建并操作HSQL数据库...

    有关hsql处理文本数据库的笔记

    导入CSV文件到HSQL数据库是通过`LOAD DATA INFILE`语句实现的。但由于HSQL不直接支持这个功能,我们需要借助Java API或者编写一个简单的脚本来完成。以下是一个使用Java API的例子: ```java import org.hsqldb....

    pentaho HSQL连接教程

    2. **Pentaho BI Suite与HSQLDB的结合**:通过在Pentaho BI Suite中连接HSQLDB,可以实现对数据的可视化分析、报表制作等功能,这对于快速构建原型系统或者小型项目来说是非常有用的。 3. **安全性考虑**:虽然...

    Spring数据库访问(HSQL)(三)

    在本篇博文中,我们将深入探讨Spring框架在数据库访问方面的应用,特别关注使用HSQL内存数据库的实践。HSQL数据库是一种轻量级的关系型数据库管理系统,适用于开发测试和快速原型设计,因为它不需要独立服务器进程,...

    Hsql的完整demo

    首先说一下hsqldb几个优点 &lt;br&gt; 1. 轻巧,只有600多K,运行速度非常快。结合Hibernate数据库无关的特性,非常适合在项目开发的时候使用。 2. 作为单元测试数据库。单元测试的时候,启动HSQLDB的file模式,...

    Spring数据库访问(HSQL)(四)

    Spring框架的源代码可以加深我们对其内部工作原理的理解,而HSQL的源代码则可以帮助我们更好地调试和优化数据库操作。 最后,关于“工具”,可能是指使用诸如IDEA、Git等开发工具来辅助我们的开发工作。例如,IDEA...

    HSQL数据库2.2.5

    《HSQL数据库2.2.5:轻量级数据库解决方案详解》 HSQL数据库,全称为HyperSQL Database,是一款开源的、轻量级的Java数据库管理系统,尤其适用于内存模式、单机模式以及分布式多机环境。HSQLDB 2.2.5是其一个重要的...

    hsql数据库,体积最小的数据库,使用最方便的数据库

    hsql数据库,体积最小的数据库,使用最方便的数据库,不用安装,解压就能用,携带方便

    hsql及其官方说明书

    HSQldb 提供了简单的备份和恢复功能,可以通过导出和导入数据来实现数据库的备份和恢复操作。 ### 与其他技术集成 HSQldb 可以与各种Java应用程序框架如Spring、Hibernate等无缝集成,方便地在应用中使用数据库。 ...

    HSQL JDBC操作

    标题中的“HSQL JDBC操作”指的是使用Java的JDBC(Java Database Connectivity)接口与HSQLDB(HyperSQL数据库)进行交互。HSQLDB是一个轻量级、开源的关系型数据库管理系统,广泛用于测试和开发环境中,因为它启动...

    HSQL数据库下载

    HSQL数据库,全称为HyperSQL Database,是一款轻量级、高性能、完全开源的Java数据库管理系统。它被设计为一个嵌入式数据库,适用于各种应用程序,同时也支持客户端/服务器模式,可以作为独立的数据库服务器使用。...

Global site tag (gtag.js) - Google Analytics