B-Tree
优点:
– 根节点指向多个分支节点
– 分支节点指向叶子节点
– 叶子节点指向实际的数据行
缺陷:
– 当搜索一个连续的范围时效率不高
– 我们可以在上下方向方便的搜索,但是左右方向却不行
B+ Tree:
级别:
– 最上层只有一个根页/结点
– 每个分支节点都有指向更低层节点的指针,和指向同一级别下一个节点的指针
– 每个叶子节点都有一个指向表中数据行地址的列表
在叶子页/节点中的关键字值是有序的:
– 一个索引项包含一个关键字值和1到多个的数据行指针
– 关键字的值是来自于索引列中某一行的数据
– 一个数据行指针提供了能定位到数据行的关键字(rowid)
在B+ 树中:
– 根节点指向分支节点
– 分支节点有向下,向左和向右的指针
– 叶子节点可以指向左,右,并向下通过rowid指向数据行
– 能够从一个节点向左或向右跳转到它的兄弟节点的能力是B+树的一个亮点
Hash:待补充
Bitmap:待补充
CLUSTER INDEX:
用于在物理上根据索引顺序组织数据的存储位置,去除extents内数据的交叉,
--使得数据页连续,继而可以避免排序操作
使用cluster index:
– 静态表,很少或者不修改数据的表(不适合动态表)
– 对于需要频繁读操作,并且读取记录数量巨大的表
使用CLUSTER在物理上基于索引循序重组数据记录:
– Informix会基于索引顺序重新组织数据页
– 因此,一个表只能有一个CLUSTER索引
CREATE CLUSTER INDEX ix_cust ON customer(lname);
ALTER INDEX ix_cust TO CLUSTER;
函数索引:
functional index可以是B-tree index, R-tree index。
函数必须基于用户定义函数(UDF)
– 不能基于built-in function 创建函数式索引
– 但是我们可以创建一个调用build-in函数的UDF,然后基于它创建函数式索引
B-Tree 的例子:
CREATE INDEX ix1 on state (UPPER(sname)); ###无效(upper 是built-in function):
CREATE FUNCTION myupper (v_value char(15))
RETURNING char(15) with (not variant);
define r_value char(15);
execute function upper(v_value) into r_value;
return r_value;
END FUNCTION;
create index ix1 on state (myupper (sname)); #### 有效(定义UDF myupper):
R-Tree
用于GIS处理,暂时不用关心拉。
索引示例:
CREATE UNIQUE CLUSTER INDEX ix_manufact ON manufact(manu_code) FILLFACTOR 80;
CREATE INDEX ix_man_stk ON items(manu_code desc, stock_num);
CREATE INDEX order_ix1 ON orders (order_num, order_date desc);
Attached index没有单独的表空间,并且索引数据是在表的tblspace中与数据交错存放的.
Detached Indexes是说index的extents是与表的extents分开的,存储在自己的tblspace中.
增加主键:
ALTER TABLE tab1 ADD CONSTRAINT PRIMARY KEY (col1);
key-only搜索:
当查询的所有列都在索引中时,也就是select和where后面的列都在索引中的时候就会使用key-only方式搜索。也就是所谓的三星索引。
涉及索引性能的几个内容:
1. 估算创建索引需要的临时dbspace空间和存储索引需要的空间,优化存储索引和临时dbspace的位置(DBSPACETEMP)
2. 设置PDQPRIORITY 和PSORT_NPROCS 环境变量,用于优化并行的索引构建
3. 如果有必要,检查并优化以下配置参数
B-tree cleaners (自动清除已删除关键字对应内存页的线程)
Buffers (I/O数据和索引缓存)
Temporary dbspaces (用于索引构建)
Parallelism (用于加速索引构建和其他引擎操作)
启用禁用索引:
set constraints/indexes … enabled