01.多码访问
一.多个单码查询交集
二.复合搜索码
这里用到了上面的B+树的范围查找
02.位图索引
位图定义:
位图索引结构:就是一组二进制的字符,每一个元素表示这个属性的一种值,每一个元素的信息要从左往右开始看,
位图对于多码查找有交作用
效率判断:
另一个作用:用于计算
高效使用:
用计算机and命令
where语句中有or条件时候,用or命令,并运算
where语句中有not条件,用补码
所谓断言就是一个谓词,它表达了我们希望数据库总能满足的一个条件。域约束和参照完整性约束是断言的特殊形式。
SQL-92中断言的定义形式
create assertion <断言名> check <谓词>
例如,在银行企业数据库中规定:每个分支机构的贷款金额的总和必须少于该支行帐户余额的总和。用断言描述如下:
create assertion sum-constraint check
(not exists (select * from branch
where (select sum(amount) from loan
where loan.branch-name = branch.branch-name)
>= (select sum(balance) from account
where account.branch-name = branch.branch-name)
)
)
SQL中的索引
03.散列
一.
放记录的地方:
散列函数:
查找的过程:
散列应用的场景
理想的散列函数:
例子1:
例子2:
这两个例子都不是很好
例子3:
例子:
s【0】是一个字节,用asc码
桶溢出:
方法:
闭地址可以添加溢出桶,桶的地址是固定的,但是数量可以改变,多用于数据库
开地址:和线性探查法有关,当一个桶满了,会在附近找有空间的桶,桶数量是不变的
散列索引:
用处:
二.动态散列,只是改变了散列函数
可扩展散列
这里的i表示的是前i位
例子:Suppose that we are using extendable hashing on a file that contains records with the following search-key values:24, 29, 2, 17,5, 19,3, 18, 7, 11, 37,15,23, 31。
Show the extendable hash structure for this file if the hash function is h(x) = x mod 16 and buckets can hold three records.
分析:题目中告知桶可存键值的大小为3,散列函数h(x)=x mod 16,16=2^4,即k=4(可变桶的最大位数)。
操作:求所有键值的二进制码。
24(11000),29(11101),2(10),17(10001),5(101),19(10011),3(11),18(10010),7(111),11(1011),37(100101),15(1111),23(10111),31(11111)。
根据以上二进制码,大家可以看到二进制码的长度不一致,所以以最大长度为准。
24(011000),29(011101),2(000010),17(010001),5(000101),19(010011),3(000011),18(00010),7(000111),11(001011),37(100101),15(001111),23(010111),31(011111)。
此时进行存储:i=1,每次存储时,都观察二进制的前i位,按照顺序依次插入二进制码,具体如下图
因为题目中告知桶的大小为3,所以当一个存储块中存够3个键值之后,如果还需存入数据,则需进行扩展散列桶,此时i=2;具体如下图:
如上图,接下来需在01对应的桶中插入19(010011),所以进行扩展散列桶,此时i=3,又因为00对应的桶中并没有存满,所以00桶对应的
存储块上标不变。具体如下图:
后续的操作便如上述插入进行操作即可,我就不在这里赘述了,相信各位聪明的宝宝已经学会了如何操作
例子中的是i从1开始的,但是一般是从0开始的
例子:
最开始的两条,不用前i位,i=0
第三个记录,此时桶满了,就会扩展,要用到i位
i=1
2的一次方 = 2 这代表 桶地址表有两项
分别是 0 ,1
扩展的桶的i标志位修改为1
第四条记录
那个桶扩展,那个桶标志位i改变,在原有的地址上扩展,原来的桶代表的意义不变
由于扩容,i=2,有四个桶地址项
最开始的桶表示前缀0,因此 00,01 都指向