
简单来说,数据库索引就是数据库的数据结构!进一步说则是该数据结构中存储了一张表中某一列的所有值,也就是说索引是基于数据表中的某一列创建的。总而言之:一个索引是由表中某一列上的数据组成,并且这些数据存储在某个数据结构中。
2.索引的作用。举个例子,假设有一张数据表Emplyee,该表有三列:
表中有几万条记录。现在要执行下面这条查询语句,查找出所有名字叫“Jesus”的员工的详细信息
3.如果没有数据库索引功能,数据库系统会逐行的遍历整张表,对于每一行都要检查其Employee_Name字段是否等于“Jesus”。因为我们要查找所有名字为“Jesus”的员工,所以当我们发现了一条名字是“Jesus”的记录后,并不能停止继续查找,因为可能有其他员工也叫“Jesus”。这就意味着,对于表中的几万条记录,数据库每一条都要检查。这就是所谓的“全表扫描”( full table scan)
4.而数据库索引功能索引的最大作用就是加快查询速度,它能从根本上减少需要扫表的记录/行的数量。
5.如何创建数据库索引。可以基于Employee表的两列创建索引即可:
拓展资料:
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
2.索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。
3.索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
4.例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
5.从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持
参考资料:数据库索引-百度百科
一 ROWID的概念
存储了row在数据文件中的具 *** 置 位编码的数据 A Z a z + 和 /
row在数据块中的存储方式
SELECT ROWID last_name FROM hr employees WHERE department_id =
比如 OOOOOOFFFBBBBBBRRR
OOOOOO data object number 对应dba_objects data_object_id
FFF file# 对应v$datafile file#
BBBBBB block#
RRR row#
Dbms_rowid包
SELECT dbms_rowid rowid_block_number( AAAGFqAABAAAIWEAAA ) from dual
具体到特定的物理文件
二 索引的概念
类似书的目录结构
Oracle 的 索引 对象 与表关联的可选对象 提高SQL查询语句的速度
索引直接指向包含所查询值的行的位置 减少磁盘I/O
与所索引的表是相互独立的物理结构
Oracle 自动使用并维护索引 插入 删除 更新表后 自动更新索引
语法 CREATE INDEX index ON table (column[ column] )
B tree结构(非bitmap)
[一]了解索引的工作原理
表 emp
目标 查询Frank的工资salary
建立索引 create index emp_name_idx on emp(name)
[试验]测试索引的作用
运行/rdbms/admin/utlxplan 脚本
建立测试表
create table t as select * from dba_objects
insert into t select * from t
create table indextable
as select rownum id owner object_name subobject_name
object_id data_object_id object_type created
from t
set autotrace trace explain
set timing on
分析表 可以得到cost
查询 object_name= DBA_INDEXES
在object_name列上建立索引
再查询
[思考]索引的代价
插入 更新
三 唯一索引
何时创建 当某列任意两行的值都不相同
当建立Primary Key(主键)或者Unique constraint(唯一约束)时 唯一索引将被自动建立
语法 CREATE UNIQUE INDEX index ON table (column)
演示
四 组合索引
何时创建 当两个或多个列经常一起出现在where条件中时 则在这些列上同时创建组合索引
组合索引中列的顺序是任意的 也无需相邻 但是建议将最频繁访问的列放在列表的最前面
演示(组合列 单独列)
五 位图索引
何时创建
列中有非常多的重复的值时候 例如某列保存了 性别 信息
Where 条件中包含了很多OR *** 作符
较少的update *** 作 因为要相应的跟新所有的bitmap
结构 位图索引使用位图作为键值 对于表中的每一数据行位图包含了TRUE( ) FALSE( ) 或NULL值
优点 位图以一种压缩格式存放 因此占用的磁盘空间比标准索引要小得多
语法 CREATE BITMAP INDEX index ON table (column[ column] )
掩饰
create table bitmaptable as select * from indextable where owner in( SYS PUBLIC )
分析 查找 建立索引 查找
六 基于函数的索引
何时创建 在WHERE条件语句中包含函数或者表达式时
函数包括 算数表达式 PL/SQL函数 程序包函数 SQL函数 用户自定义函数
语法 CREATE INDEX index ON table (FUNCTION(column))
演示
必须要分析表 并且query_rewrite_enabled=TRUE
或者使用提示/*+ INDEX(ic_index)*/
七 反向键索引
目的 比如索引值是一个自动增长的列
多个用户对集中在少数块上的索引行进行修改 容易引起资源的争用 比如对数据块的等待 此时建立反向索引
性能问题
语法
重建为标准索引 反之不行
八 键压缩索引
比如表landscp的数据如下
site feature job
Britten Park Rose Bed Prune
Britten Park Rose Bed Mulch
Britten Park Rose Bed Spray
Britten Park Shrub Bed Mulch
Britten Park Shrub Bed Weed
Britten Park Shrub Bed Hoe
……
查询时 以上 列均在where条件中同时出现 所以建立基于以上 列的组合索引 但是发现重复值很多 所以考虑压缩特性
Create index zip_idx
on landscp(site feature job)
press
将索引项分成前缀(prefix)和后缀(postfix)两部分 前两项被放置到前缀部分
Prefix : Britten Park Rose Bed
Prefix : Britten Park Shrub Bed
实际所以的结构为
Prune
Mulch
Spray
Mulch
Weed
Hoe
特点 组合索引的前缀部分具有非选择性时 考虑使用压缩 减少I/O 增加性能
九 索引组织表(IOT)
将表中的数据按照索引的结构存储在索引中 提高查询速度
牺牲插入更新的性能 换取查询性能 通常用于数据仓库 提供大量的查询 极少的插入修改工作
必须指定主键 插入数据时 会根据主键列进行B树索引排序 写入磁盘
十 分区索引
簇:
A cluster is a group of tables that share the same data blocks because they share mon columns and are often used together
lishixinzhi/Article/program/Oracle/201311/17769alter table a add index 'idx_eid' ('eid')
alter table b add index 'idx_eid' ('eid')
尽量将有关联的字段都建上索引,尤其是当数据量很大的时候,索引会气到很关键的作用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)