fastdb使用简单的规则来应用索引,让程序员来预言什么时候以及哪一个索引将被使用。索引的适用性检查在每一次查询执行期间进行,因此该决策可以依赖于操作数的值来决定。下面的规则说明了fastdb应用索引的算法:
1. 编译好的条件表达式总是从左到右检查
2. 如果最终(topmost)表达式是AND,则尝试在表达式的左半部分使用索引,右半部分作为过滤(filter)
3. 如果最终表达式是OR,则如果左半可以使用索引则使用,然后测试右半使用索引的可能性
4. 此外,当下列条件满足时,则索引适用于表达式
A. 最终表达式是关系操作 (= < > <= >= between like)
B.操作数的类型是布尔型,数值型,字符串和引用
C.表达式的右操作数是文本常量或者C++变量,或者
D. 左操作数是记录的索引字段
E.索引与关系操作兼容
现在我们应当确认“索引与操作兼容”的意思以及在没种情况中使用什么类型的索引,一个哈希表在下列情况下可以使用:
1. 相等=比较;
2. Between操作并且两个端点操作数的值相等;
3. Like操作并且模式串 不包含特别字符(’%’或者’_’)并且没有转义字符(在escape部分指定)。
当hash表不适合并且如下条件满足时,可以使用T-tree:
比较运算( = < > <= >= between)
Like运算并且模式串包含非空前缀(也就是说模式的第一个字符不是’%’或者’_’)
如果用索引来搜索like表达式的前缀,并且其后缀不只是’%’字符,则这个索引搜索操作能够返回的记录比真正匹配模式的记录要多。在这种情况下,我们应当过滤模式匹配的索引搜索的结果。。
我们在查询的时候使用了with (updlock)选项,在查询记录的时候我们就对记录加上了更新锁,表示我们即将对此记录进行更新. 注意更新锁和共享锁是不冲突的,也就是其他用户还可以查询此表的内容,但是和更新锁和排它锁是冲突的.所以其他的更新用户就会阻塞.。14、并不是所有索引对查询都有效,sql是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sql查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。14、并不是所有索引对查询都有效,sql是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sql查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
指出mysql能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。14、并不是所有索引对查询都有效,sql是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sql查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。14、并不是所有索引对查询都有效,sql是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sql查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
10、合并多个索引到一个大索引,为搜索提供索引库(merge)。下面都使用磁盘模式的precommit方式,再来看索引查询的性能表现,测试时都是先插入十万条数据后,再分别对该十万条数据进行查询,同时对fastdb是否增加hash索引的性能进行了横向测评,fastdb增加hash索引很简单,通过修改type- descriptor来完成,上面的class中改为type_descriptor((key(intkey, indexed), key(strkey, indexed)))。索引库,搜索引擎的,在库中每个关键词都会有很多对应的页面,当获取用户搜索词时,会对搜索词进行分词,在到索引库中进行匹配,最后,按照一定规则把匹配到的内容展示给用户。
第2节.逆引用
逆引用提供了在表之间建立关系的高效并且可靠的方法。Fastdb在插入/更新/删除记录时以及查询优化时使用逆引用的信息。记录之间的关系可以是这些类型:,一对多以及多对多。
1. 的关系用自身以及目标记录的一个引用字段表示。
2. 一对多用自身的一个引用字段及目标表中的一个引用数组字段表示。
3. 多对一用自身的一个引用数组字段以及所引用的表中的记录的一个引用字段表示。
4. 多对多用自身及目标记录中的引用数组字段表示。
如果你需要在web端创建上述表的话,那么当选择的字段类型为pointer或relation时,会提示你选择该字段所指向或关联的数据表。记录头指明了记录的类型(也即id)以及后继数据的长度,记录体被分割成多个字段(field),字段包含数值数据(包括对其他记录的引用)、字符数据或标记。为此目的,该索引有多行,例如行208,行中有包含识别符的字段210和字段212、214和216,它们每一个包含指向各自带有相关数据的文件的引用。
判断参数是否为文本1983获取信息与转换数值函数1991应用cell函数计算并显示单元格的信息1992应用error.type函数判断错误的类型2023应用info函数计算有关当前操作环境的信息2034应用n函数计算转化为数值后的值2045应用na函数计算错误值#n/a2066应用type函数计算数值类型2067应用sheet函数返回引用工作表的工作表编号2078应用sheets函数返回引用中的工。我学的是云计算网络应用工程师的,java是必修课,其实我选择java也是出于以上的原因,但是现在确实真正地爱上了java。程序中都会引用库api,比如每个c程序都要引用stdio.h库的printf(),在程序运行时,库代码也要被加入到内存,这么多程序都引用了这个库,难道我内存中需要加很多份吗。
使用下面的表作为例子:
class Contract;
class Detail {
public:
char const* name;
char const* material;
char const* color;
real4 weight;
dbArray<dbReference<Contract> > contracts;
TYPE_DESCRIPTOR((KEY(name,INDEXED|HASHED),
KEY(material, HASHED),
KEY(color, HASHED),
KEY(weight, INDEXED),
RELATION(contracts, detail)));
};
class Supplier {
public:
char const* company;
char const* location;
bool foreign;
dbArray<dbReference<Contract> > contracts;
TYPE_DESCRIPTOR((KEY(company,INDEXED|HASHED),
KEY(location, HASHED),
FIELD(foreign),
RELATION(contracts, supplier)));
};
class Contract {
public:
dbDateTimedelivery;
int4quantity;
int8price;
dbReference<Detail> detail;
dbReference<Supplier>supplier;
TYPE_DESCRIPTOR((KEY(delivery,HASHED|INDEXED),
KEY(quantity, INDEXED),
KEY(price, INDEXED),
RELATION(detail, contracts),
RELATION(supplier, contracts)));
};
这个例子中,在表Detail-Contract 和 Supplier-Contract之间存在一对多的关系。当一个Contract记录插入中,仅仅只要把引用detail和supplier设置到Detail和Supplier表的相应记录上。这些记录的逆引用contracts将自动更新。当一个Contract记录被删除时同样:从被引用的Detail和Supplier的记录的contracts字段中自动排除被删除的记录的引用。
此外,使用逆引用可以在查询执行时选择更有效的规划。考虑下面的查询,选择某公司装船的细节:
q = "existsi:(contracts[i].supplier.company=",company,")";
14、并不是所有索引对查询都有效,sql是根据表中数据来进行查询优化的,当索引列有大量数据重复时,sql查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。曾经测试对一个包含400多万条记录(有索引)的表执行一条条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂。我们可以清晰的看到,那些索引用的多,那些索引没用过,大家可以根据查询出来的东西去分析自己的数据索引和表。
从1.20版本开始,fastdb支持串联(cascade)删除。如果使用OWNER宏声明一个字段,该记录就被当作是这个层次关系的所有者(owner)。当所有者记录被删除,该关系的所有的成员(从所有者引用的记录)将被自动删除。如果该关系的成员记录要保持对所有者记录的引用,该字段应当用RELATION宏声明。
附1:FastDB不同访问模式带来的影响
FastDB中不同的访问DataBase的模式在程序中能体现不一样的结果。从试验可以知道,不同访问模式主要体现在对表的锁上。(具体的试验,可以自己做一下,用subsql -access [read-only concurrent-read concurrent-update normal]可以指定访问数据的模式,然后自己构建相关测试用例进行测试)。
否则,可能阻塞直到有相应进程为写而打开该fifo(当前打开操作设置了阻塞标志)。主要包含如o_sync表示打开的文件作一些写入操作都会阻塞进程,直到文件写入操作完成之后等这类标志值。否则,可能阻塞直到有相应进程为读而打开该fifo(当前打开操作设置了阻塞标志)。
dbDatabase::dbConcurrentUpdate,使用该模式访问表,如果某个进程对数据进行修改性的操作,同时另外的进程使用dbDatabase::dbReadOnly或者dbDatabase::dbConcurrentRead读取数据,不会出现阻塞的情况。但是dbDatabase::dbReadOnly会把未提交的脏数据读出来;而dbDatabase::dbConcurrentRead则不会。(dbReadOnly和dbConcurrentUpdate时,必须先打开dbConcurrentUpdate,再打开dbReadOnly,否则dbConcurrentUpdate会打开失败)
如果多个进程都使用dbDatabase::dbConcurrentUpdate,实际效果和dbDatabase::dbAllAccess一样,一旦一个进程修改了数据,其他进程所有的操作(包括open、select)都将阻塞,直到该操作提交或回滚。
结论:FastDB没有提供商用的记录锁甚至是页级锁的机制,锁的范围是一个DataBase文件,所以在日常的使用过程中:
1. 仔细分析业务需求,如果你只需要访问数据,那么最好是使用dbDatabase::dbReadOnly或者是dbDatabase::dbConcurrentRead。这样的话,你的访问操作不会因为这个表被其他进程修改数据而阻塞。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-106153-10.html
这是两岸人民的共同心声
地沟油都不致癌
在一段时间里将会成为常态