RDBMs 中的内部模式定义
关系型数据库的内部模式能控制处理和存储效率。下述是一些用于调整关系型数据库内部数据模型的运行性能的技术:
- 选择索引主键和/或次键以增加行检索,表联结,和行排序的速度。你也可以删除索引以增加表更新的速度。
- 为基表选择合适的文件组织,以匹配表上进行的处理活动的类型 (例如,使用常用的报告排序键对表进行物理排序)。
- 为索引 (也是一个表) 选择合适的文件组织,以匹配索引被使用的方式并为索引文件分配额外的空间,这样索引就能在不重新组织的情况下增长。
- 聚集数据,这样频繁连接的表中的相关行在次级存储中被存储在一起,以减小检索时间。
- 维护关于表和其索引的统计数据,这样 DBMS 能找到最有效的方式执行不同的数据库操作。
Create Indexes
索引通过对表中的一个或多个列进行预先排序和索引优化数据库查询。理论上在索引的帮助下,不需要检索表中的每行,就可以找到表中的特定行。索引不是免费的,它们在每次修改表时更新,且会占据额外的存储空间。
索引可以在主键和次键上创建,也可以在单列键和多列键上创建。在一些系统中,用户可以为索引中的键选择升序还是降序。
CREATE [UNIQUE] INDEX index_name
ON table_name(column_name[,...]);
CREATE INDEX idx_employee_name ON employees(name);
索引能在任何时刻被创建和丢弃。如果在键列中已存在数据,索引将自动为现存数据填充。如果索引被定义为 UNIQUE (使用语法 CREATE UNIQUE INDEX…) 且现存的数据与改条件冲突,则索引创建失败。一旦索引被创建,它将随着数据的插入,更新和删除而更新。
通常索引允许重复的值。可选的 UNIQUE 关键词表示重复的条目时不被允许的,使用不唯一的值对表进行插入和更新的任何尝试都会导致一个错误。对于引用多列的唯一索引,所有列都匹配的条目才被认为时重复的。
RDBMs 通常支持几种不同类型的索引,以协助不同类型的键词的搜索。例如,在 MySQL 中你可以创建下列索引类型:unique (适用于主键),nonunique (适用于次键),fulltext (用于 full-text 搜索),spatial (用于空间数据搜索),和 hash (用于内存中的表)。
当我们不再需要表,视图,和索引,我们使用相关的 DROP 语句。
DROP INDEX index_name;
索引是数据库系统使用的辅助数据结构,用于实施唯一性,加速排序操作,以及为指定记录提供更快的访问。
每个索引都关联一个特定的表。索引可以是单列的也可以是多列的,但是所给索引的所有列必须属于同一个表。内部地,一个普通表的行被存储在索引结构中。SQLite 使用 B-Tree 结构。当你创建一个索引时,数据库系统创建一个树结构来保存索引数据。树使用你在索引定义中指定的列(们)进行排序和组织。索引条目包含索引列的值的拷贝,和对应的 ROWID 值的拷贝。这允许使用索引列值能快速找到索引条目。
为了对查询性能产生积极的影响,索引必须多样化。索引显著减少了查询行的数量,从而减少了查询的开销。索引性能的盈亏点大概在 10% 到 20% 区间内。一次查询从表中获取多余这个范围的行,扫描整个表将更好。获取更少的行的查询使用索引将获得性能提升。如果索引不能将行划分到这一等级,则没有理由去使用它。事实上,如果查询优化器错误的使用了索引并返回了很大百分比的行,索引会降低查询性能。