大约SQL/NoSQL数据库搜索/思考查询
转载请注明出处:jiq•钦's technical Blog
Hbase特征:
近期在学习Hbase。Hbase基于行健是建立了索引的,查询速度会很快,全然实时。
可是Hbase要基于行健之外的字段进行查询。那么就仅仅能是全盘扫描,基本上不可接受。
所以Hbase一般来说会针对详细的应用场景来设计行健,利用基于行健的查询的实时性来达到Hbase数据的实时查询。
关系型数据库基于索引字段的实时查询:
然后联想到关系型SQL数据库,他们针对主键是建立了B/B+/B-树索引的,基于主键的查询是实时的。范围扫描也是实时的。
更重要的是,基于非主键的其它字段,关系型数据库也能够非常方便地为其建立索引,从而达到实时查询。
Hbase的二级索引:
那么Hbase这样的NOSQL数据库可不能够也为除了行健之外的字段建立索引,从而针对这些字段的查询达到实时的效果呢?
答案是肯定的。
在Hbase里面针对除了行健之外的字段建立索引称之为“二级索引”。
通常建立二级索引的方式是利用Hbase中的“协处理器”,协处理器主要包括Observer和Endpoint两种模式,前者类似于关系型数据库中的触发器trigger,而后者类似于关系型数据库中的存储过程,通过Observer能够讲用户代码嵌入到现有的执行过程中,在特定的时间发生时就会触发相应的这段用户代码,即回调函数。
眼下有三种Observer接口:
1、 RegionObserver:提供相应数据操作事件的钩子,该类操作有Get、Put、Delete、Scan 等等。
每个 region 都会有一个 RegionObserver 实例。
2、 WALObserver:提供预写日志(write-ahead log,WAL)相关操作的钩子。WALObserver在WAL处理过程中执行,每个region server有一个实例。
3、 MasterObserver:提供DDL操作的钩子,该类操作有创建表、删除表、改动表的元信息等。MasterObserver执行在HBase master上。
每一类observer都能够载入多个。全部的observer会按链式顺序运行。
Hbase社区关于使用Coprocessor框架建立二级索引的方案主要有三种:
1、 基于WALObserver在一个索引表内生成索引,通过栏截Write Ahead Log写入操作,提取写入HLog的KeyValue对信息,把对应信息存储到索引表中。
2、 基于RegionObserver在一个Region内维护一个索引列族,通过拦截Region的put、delete等操作,提取对应信息存储到同一个Region的索引列族中,这样的方式的索引是局部索引。不支持全排序。
3、 基于RegionObserver在一个索引表内生成索引。通过栏截Region的put、delete等操作,提取对应信息存储到索引表中。
这个时候大家可能想知道索引表是什么样子的。一般来说,假设某一个Hbase表中有一列叫做所在地区,存储的是用户当前所在的城市,比方南京。上海这样。那么要针对着一些创建相应的二级索引,当插入新的一行记录的时候。在协处理器的钩子函数Observer中就会提取出这一列的值,在相应的索引表中插入一行索引记录。这行索引记录的rowkey是该列提取出来的值,而将这行索引记录的rowkey是刚才插入的那条记录的真正的rowkey,这样在检索地区,比方用户输入一个“南京”。或者运行基于Hbase的SQL语句:select
* from userTable where location=’南京’的时候,就会检測到location这一列已经被创建了二级索引,所以就会在索引表中查找rowkey为’南京’的记录。然后取出真正的rowkey,在相应的数据表中取出相应的记录,展示给用户。
关系型SQL数据库和NoSQL数据的针对非主键的索引建立还是有非常多相似的地方的。
二级索引与全文检索:
可是有一点要注意,二级索引和全文检索是两个不同的概念:
建立二级索引通常是为了可以实时查询。而全文检索的目的是为了可以高速地在数据库中查找到自己关心的内容。前者是属于一种针对某一列值进行全然匹配的方式。而后一种是须要对数据进行分词,对分词的结果建立‘倒排索引’,从而可以支持依据特定的keyword查找其所属的那段内容(或者说所属的文档/记录)。
Hbase中的全文检索:
那么在Hbase中的全文检索一般怎么做呢?
之前接触过solr。是在Lucence上面的一层封装好的库,支持搭建分布式集群方式的全文检索服务。其原理就是简单地将要进行全文检索的字段的内容进行分词,然后将分词后的结果分别建立倒排索引。
Hbase中要实现全文检索。一般就能够结合Lucence/Solr来做,利用他们的自己主动创建索引的功能,针对Solr来说。无非就是其输入源不同了,曾经可能一般针对关系型数据库,如今输入源变为了Hbase。
全文检索不是实时的,并非说你往Hbase中插入一条记录,立即你就能够实时地在较快的时间内查询到,由于后台建立索引是须要一个过程的。一般来说可能几分钟左右吧。
关系型数据库中的全文检索:
在这里了解到了Hbase的全文检索之后,自然而然就联想到了关系型数据库中的全文检索。
关系型数据库的全文检索和Hbase的事实上差点儿是一样的。
比較流行的方式也是採用和Solr这样成熟的开源的全文检索库结合实现。将关系型数据库作为Solr的数据输入源,它们会定期自己主动从关系型数据库中抽取数据。或者由关系型数据库的插入/删除/更新操作触发,来在Solr中为指定的字段分词后的结果建立倒排索引。
另外国内也有一些比較出名的商用的全文检索引擎,我们公司眼下使用的就是这样的。
关系型数据库中的模糊查询like:
在思考查询的时候,非常难不想到关系型数据库中的模糊查询。
个人认为,模糊查询看似是和针对某一字段的全文检索类似,事实上在功能上讲(不谈效率)要比这个更加强大。比方你针对“我是季义钦”这句话,你可能利用全文检索引擎。分词时候会分成“我”,“是”。“季义钦”三个词(实际的分词器可能不这样。我仅仅是举个样例)。这个时候你全文检索仅仅可以搜索到“我”,“是”,“季义钦”三个词,假设你要搜索“义钦”那么就会搜索不到。
可是关系型数据库中的模糊查询,你要是用“%义钦”来查询绝对能查询到。
为什么呢?
我了解了一下,发现关系型数据库中的模糊查询并没有为这个要模糊查询的字段建立整个字段的索引,更没有分词之后再针对分词结果建立索引,而是拿到“%义钦”的查询条件之后,全表扫描,对这个正則表達式进行匹配。
尽管你把通配符放在前面。像“like %义钦”这样,这个查询肯定不会走索引,而是会全表扫描,可是假设你的模糊查询是“like 季%”。即将通配符放在前后面,那么这个查询是有可能走索引的,并且通配符放在前面的查询事实上是有一些技巧来进行详细的优化的。比方看看这个样例:http://blog.csdn.net/firstboy0513/article/details/6912632。
在大部分关系型数据库中,事实上是能够为指定字段建立全文索引(注意,这里所说的并非不是採用第三方全文检索引擎)的,比方MYSQL中像这样:
MATCH (col1,col2,...) AGAINST (expr[search_modifier])
search_modifier: { IN BOOLEAN MODE | WITHQUERY EXPANSION }
比如:SELECT * FROM tab_name WHERE MATCH (col1,col2) AGAINST(search_word);
这里的table须要是MyISAM类型的表。col1、col2须要是char、varchar或text类型,在查询之前须要在col1和col2上建立一个全文索引。
以下有一段话须要注意:
MySQL在高并发连接、数据库记录数较多的情况下,SELECT... WHERE ... LIKE '%...%'的全文搜索方式不仅效率差,并且以通配符%和_开头作查询时,使用不到索引,须要全表扫描,对数据库的压力也非常大。MySQL针对这一问题提供了一种全文索引解决方式,这不只提高了性能和效率(由于MySQL对这些字段做了索引来优化搜索)。并且实现了更高质量的搜索。可是。至今为止。MySQL对中文全文索引无法正确支持。
--- 这个问题能够通过使用一些MYSQL中文全文检索插件来解决。
关于Oracle中的全文检索能够參考这篇文章:http://www.iteye.com/topic/1118055。
这篇文章是个人意见,如果您有任何疑问或更正,欢迎大家讨论,谢谢!
版权声明:本文博客原创文章,博客,未经同意,不得转载。
大约SQL/NoSQL数据库搜索/思考查询的更多相关文章
- 如何使用SQL SERVER数据库跨库查询
SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...
- Sql Server数据库设计高级查询
-------------------------------------第一章 数据库的设计------------------------------------- 软件开发周期: (1 ...
- SQL Server数据库(高级查询)
高级查询 1.连接查询 有外键关系的两张表,通过关系一次查询两张表 (1)select * from 表名,表名 --- 直接使用出现笛卡尔积,两个表数据一一对应,查询出的结果数目是两个表的行的乘积, ...
- webform中实现SQL Sever2008数据库数据分页查询
1 分页 1.1 数据库中存储过程 已知 当前页 pageIndex 页容量 pageSize 求 总页数 pageCou ...
- SQL server 数据库基础语句 查询语句
这一章要学习查询语句 我看car这一数据 我们就开始打上 select *from car 条件修改 update 表名 set 列名1=值1 where 列名2=值2 //当列名2=值2时 ...
- SQL SERVER数据库多条件查询
例如:查询挂号超500的数据select CONVERT(VARCHAR(10),DGH,23),COUNT(*) from yxhis2017..VTBMZGHMX2017 where bth=0 ...
- 技术分享|SQL和 NoSQL数据库之间的差异:MySQL(VS)MongoDB
在当今市场上,存在各种类型的数据库,选择适合你业务类型的数据库对应用的开发和维护有着重要意义.本篇文章,将为大家分享SQL和NoSQL语言之间的区别,同时还将比较这两种类型的数据库,以帮助小伙伴们选择 ...
- SQL Server数据库 优化查询速度
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 ...
- 查询Sql Server数据库对象结构
查询Sql Server数据库对象结构 查询数据库 查询架构 查询表 查询列 查询存储过程 查询视图 1.查询某一服务器下所有数据库 select t.[name] as 数据库 from sys.d ...
随机推荐
- android imageButton 透明图片
在Android有许多不规则button.例如: 这个时候,我们假设想做成不规则button的话.第一步就是搞一张边缘透明的png图片,然后用src指定到他.这个时候我们会发现,还没有达到要的效果.还 ...
- 返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test
原文:返璞归真 asp.net mvc (5) - Action Filter, UpdateModel, ModelBinder, Ajax, Unit Test [索引页] [源码下载] 返璞归真 ...
- HR筒子说:程序猿面试那点事(转)
小屁孩曾经有过4年的招聘经验,期间见识了各种类型的程序猿:有大牛.有菜牛:有功成名就,有苦苦挣扎不知方向.等后来做了一枚程序猿之后发现,HR眼中的程序猿和程序猿中的HR都是不一样的.有感与此,从HR的 ...
- JTable demo
简单讲就是在没有使用layout manager的时候用setSize,在使用了layout manager 的时候用setPreferredSize 并且setPreferredSize通常和set ...
- 三种方式上传文件-Java
前言:负责,因为该项目他(jetty嵌入式开始SpringMvc)实现文件上传的必要性,并拥有java文件上传这一块还没有被曝光.并 Http 更多晦涩协议.因此,这种渐进的方式来学习和实践上载文件的 ...
- 设计模式Adapter模式的五分钟
五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...
- Codeforces 451E Devu and Flowers(容斥原理)
题目链接:Codeforces 451E Devu and Flowers 题目大意:有n个花坛.要选s支花,每一个花坛有f[i]支花.同一个花坛的花颜色同样,不同花坛的花颜色不同,问说能够有多少种组 ...
- cocos2d-x box2d Demo注解
勤奋努力,持之以恒. 核心概念 Box2D 中有一些主要的对象,这里我们先做一个简要的定义,在随后的文档里会有更具体的描写叙述. 刚体(rigid body) 一块十分坚硬的物质,它上面的不论什么两点 ...
- w3wp占用CPU过高
w3wp占用CPU过高 在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一 ...
- JAVA 跑马灯文字效果
JAVA跑马灯文字效果的实现: 1. 首先创建一个继承JFrame类的HorseRaceLightTextFrame窗体类,代码如下: package com.example.horseracelig ...