前面讲了从性能角度设计会员表的主要的五点设计思路中的合理定义字段的数据类型、将会员表分拆成多个表、建立分区表、普通表数据对应的表空间和索引表对应的数据表空间分离四个思考方向。
接下来将最后一个思考点,索引。
索引对表的查询性能影响极其大,良好的索引设计时数据库设计的重要组成部分。关于索引有以下一些需要掌握的知识点:
1) 主键本身就是一种索引,通常称为主键索引
2) 索引数据也和一般的表数据一样,存放在一个表中,我们称之为索引表
3) 创建索引一定会降低更新操作的性能,包括增删改,一个表上定义的索引越多,对更新操作的影响就越大,这个很容易理解,本来变更一个基表的数据,现在还要变更索引表里面的数据
4) 创建索引不一定能提升查询性能,若引用索引不正确
5) 从大的类上分,索引通常分为B树索引和位图索引两种。B树索引是默认的索引类型,也称为平衡树索引,适用于高基数(不同值数量多)列,如会员系统的用户登录名。对于绝大多数OLTP系统,使用B树索引足够了;而位图索引适用于数据参仓库环境下低基数值的列。这种索引不适合于数据行需要大量更新的OLTP数据库
6) 查询时引用索引是分优先级级别的
7) 定义索引时可以使用关键字UNIQUE创建唯一索引,这类索引有两个好处:保证字段值的唯一性、唯一索引的优先级高于非唯一索引,用定义了唯一性索引的字段作为条件查询数据性能更高
当然索引还能按不同的角度,按各种情况细分成多种类型,如下表
序号 | 索引类型 | 用法 |
1 | B树索引 | 默认的索引类型,也称为平衡树索引,适用于高基数(不同值数量多)列。对于绝大多数OLTP系统,使用B树索引足够了。 |
2 | B树簇索引 | 适用于聚簇表 |
3 | 散列聚簇索引 | 适用于散列聚簇 |
4 | 基于函数的索引 | 适用于使用了SQL函数的列 |
5 | 虚拟列索引 | 适用于使用了函数的列,可以替代基于函数的索引 |
6 | 反转键索引 | 对于平衡后续有较多数据插入的索引中的I/O非常有用 |
7 | 键值压缩索引 | 适用于引导列重复值较多的组合索引,压缩叶子块条目 |
8 | 位图索引 | 适用于数据参仓库环境下低基数值的列。这种索引不适合于数据行需要大量更新的OLTP数据库 |
9 | 位图连接索引 | 适用于数据仓库中连接事实表和维度表的查询 |
10 | 全局分区索引 | 跨分区表所有分区表的全局索引 |
11 | 本地分区索引 | 基于分区表的单独分区索引 |
12 | 域索引 | 基于具体的应用或程序模块 |
示例:在会员表中的会员登录名上建唯一索引,索引存放在mb_idx表空间中。
CREATE UNIQUE INDEX idx_memberBase_loginName ON member
Base(loginName) TABLESPACE mb_idx;
对索引的命名建议用 idx_表名_字段名,看到idx_memberBase_loginName就能立即知道这是个索引对象,建立在memberBase表上,针对的是loginName字段,清晰明了。
待续