索引INDEX
索引是一个数据库对象,用于一个表更快的数据检索或加快查询的排序。索引也用于强制执行参考完整性约PRIMARY KEY, FOREIGN KEY 和UNIQUE。
本节描述如何创建索引,激活和停用,删除他们,收集统计信息(重新计算选择性)。
作用: 为一个表创建一个索引.
用于: DSQL, ESQL
语法:
CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]
INDEX indexname ON tablename
{(col [, col …]) | COMPUTED BY (<expression>)};
表 5.10. CREATE INDEX语句参数
参数 | 描述 |
indexname | 索引名称。它可能由达 31 个字符 |
tablename | 将要建索引的表的名称 |
col | 在表中的列的名称。 索引中不能使用 BLOB 类型的列、数组和计算的字段 |
expression | 表达式将为计算索引计算值,也被称为"表达式索引" |
CREATE INDEX语句为一个表创建一个索引。它可以被用来加速搜索、排序和分组。索引在定义约束过程中能被自动创建,如主键、外键或唯一约束。
索引可以基于除了 BLOB 和数组数据类型之外的任何列的内容。索引名称(标识符)必须是唯一的,在所有索引名称中。
键索引
当一个主键、外键或唯一约束被增加一个表或一个列时,没有来自设计者的明确指令,具有相同名称的索引被自动创建.例如,当执行且提交下面的语句时,PK_COUNTRY索引将自动被创建:
ALTER TABLE COUNTRY ADD CONSTRAINT PK_COUNTRY
PRIMARY KEY (ID);
唯一索引
在索引创建语句中指定关键字UNIQUE创建一个索引,整个表将被强制执行唯一性。该索引被称为一个"唯一索引"。唯一的索引并不是一个约束。惟一的索引不能包含重复的键值(在复合的情况下,或重复键值的组合,或多列,或多段)索引。按照SQL99标准在单段和多段的索此中重复的NULL值被允许。
索引方向
所有索引在Firebird数据库中是无方向的.一个索引可能被构建从最低值到最高值(升序排列)或从最高值到最低值(降序排列)。关键字ASC[ENDING]和DESC[ENDING] 用于指定索引的方向.默认的索引排序是ASC[ENDING],它是十分有效的,在同一列或同一键集合上定义的升序和降序的索引。
提示
在一个列上降序索引可以是有用的,它将在搜索高值时起作用("最新",最大的等).
关于索引的限制
某些限制适用于索引。
在索引中的键的最大长度仅限于页面大小的 ¼。
每个表的最大索引数
可容纳每个表的索引的数目是有限的。特定表实际的最大值索引数取决于页面大小和索引中的列数。
表 5.11.每个表的最大索引数
页面大小 | 索引数依赖的列统计 | ||
单列 | 2列 | 3列 | |
4096 | 203 | 145 | 113 |
8192 | 408 | 291 | 227 |
16384 | 818 | 584 | 454 |
字符索引的限制
最大索引的字符串长度为 9 个字节小于最大键长度。可索引的最大值字符串长度取决于页面大小和字符集。
表 5.12. 最大可索引的(VAR)CHAR长度
页面大小 | 依据字符集类型最大可索引的字符串长度 | |||
1字节/字符 | 2字节/字符 | 3字节/字符 | 4字节/字符 | |
4096 | 1015 | 507 | 338 | 253 |
8192 | 2039 | 1019 | 679 | 509 |
16384 | 4087 | 2043 | 1362 | 1021 |
只有表的所有者和管理员有权使用CREATE INDEX.
使用示例 CREATE INDEX
1.在 SALARY_HISTORY 表中为列UPDATER_ID创建索引
CREATE INDEX IDX_UPDATER
ON SALARY_HISTORY (UPDATER_ID);
2.在SALARY_HISTORY表为CHANGE_DATE列创建降序排序索引。
CREATE DESCENDING INDEX IDX_CHANGE
ON SALARY_HISTORY (CHANGE_DATE);
3. 在SALES表中为ORDER_STATUS, PAID创建一个多段索引
CREATE INDEX IDX_SALESTAT
ON SALES (ORDER_STATUS, PAID);
4. 在COUNTRY表中为NAME列创建一个不允许副本值的索引
CREATE UNIQUE INDEX UNQ_COUNTRY_NAME
ON COUNTRY (NAME);
5. 为PERSONS创建一个计算索引
CREATE INDEX IDX_NAME_UPPER ON PERSONS
COMPUTED BY (UPPER (NAME));
像这样的索引可以用于不区分大小写的搜索:
SELECT *
FROM PERSONS
WHERE UPPER(NAME) STARTING WITH UPPER('Iv');
参阅: ALTER INDEX, DROP INDEX