[点晴永久免费OA]键、索引、约束的理解及其区别
当前位置:点晴教程→点晴OA办公管理信息系统
→『 经验分享&问题答疑 』
今天下午刚好没事,把一些基础性的概念理顺一下,存档,省的麻烦,嘿嘿 一.索引 1. 什么是索引? 索引是对数据库表中一列或多列的值进行排序的一种结构。 在关系型数据库中,索引是一种与表有关的数据库结构,是事实存在的。它可以使对于表的select等等操作更加快速,相当于一本书的目录。 对于一张表,如果我们想要找到某一列符合特定值的记录,第一种方法是全表搜索,匹配,然后把所有符合的记录列出,但是这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。由此可知,索引是要消耗数据库空间的。 并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。 可以使用单列作为索引,也可以使用多列联合作为索引。 2. 索引的优缺点 优点: (1)大大加快数据的检索速度; (2)创建唯一性索引,保证数据库表中每一行数据的唯一性; (3)加速表和表之间的连接; (4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。 缺点: (1)索引需要占物理空间。 (2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。 建立索引时的注意事项: (1) 考虑已在表上创建的索引数量。最好避免在单个表上有很多索引 (2) 检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引 (3) 检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比如如果有1000w记录,某字段为性别,只有男,女。也就是说一半的记录都是重复的,这样就要考虑是否还有必要建立索引了。 3. 一些索引类别 (1) 普通索引 也即不加任何限制的索引。可通过以下语句理解。 create table zjj_temp_1 (id number(10),first_name char(10),last_name char(10),age number(3),val number(10,2)); insert into zjj_temp_1 values(1,''junjie'',''zhang'',25,4000); select * from zjj_temp_1; 此时一条记录已经插入进入了。 create index zjj_temp_index_1 on zjj_temp_1(first_name); --------建立索引 insert into zjj_temp_1 values(1,''junjie'',''zhang'',25,4000) --------再次插入一条一模一样的记录 select * from zjj_temp_1; Ok!两条记录出现了,也即此索引的作用是让你再查找first_name为某一个特定值的记录时速度更快而已,仅此而已。 (2) 唯一索引 一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。 继续分析例子: drop index zjj_temp_index_1; ----删除上文创建的普通索引。 create unique index zjj_temp_1 on zjj_temp_1(id); ----建立唯一索引 数据库报错了? 是的,说找到重复的关键字。 从上文我们可以看到,zjj_temp_1表中有两条记录,id都是1. 这样是唯一索引是不允许的,所以自然就创建不起来了。 delete from zjj_temp_1 where rownum<2; --删除一行 create unique index zjj_temp_1 on zjj_temp_1(id); ----继续创建,发现这次成功了。 insert into zjj_temp_1 values(2,''junjie'',''zhang'',25,4000); ----成功 insert into zjj_temp_1 values(1,''kesi'',''ma'',25,4000); 失败!!! 耶!就是这样! (3) 主键索引 数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。它和唯一索引的共性在于都不允许有重复记录,区别在于,唯一索引是不限制null的,也就是说或可以有一条以上的null值插入,但是主键却限定不能为空。 继续执行语句: insert into zjj_temp_1 values(null,''kesi'',''ma'',25,4000); ---成功 select * from zjj_temp_1; 这就表明唯一索引是允许有空值的。 Drop index zjj_temp_1; ---删除唯一索引 alter table zjj_temp_1 add constraint zjsy_1 primary key(id); ---建立主键 我们可以发现id有一条记录为空,所以是无法建立主键的。 删除那条空记录就可以了。 (4) 聚簇索引和非聚簇索引 聚簇索引也叫簇类索引,是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页。
聚簇是根据码值找到数据的物理存储位置,从而达到快速检索数据的目的。Oracle聚簇索引的顺序就是数据的物理存储顺序,叶节点就是数据节点。非聚簇索引的顺序与数据物理排列顺序无关,叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。由于聚簇索引要按照索引排序,所以一个表最多只能有一个聚簇索引,但可以使用多列。 ORACLE中的聚簇表是指两个表有一个字段完全相同,并且在业务中经常会按这个字段为目标连接这两个表,这时建立聚簇表, 这两篇都有实际的例子,这里就不再深入讨论了。 建立聚簇索引的思想 1、大多数表都应该有聚簇索引或使用分区来降低对表尾页的竞争,在一个高事务的环境中,对最后一页的封锁严重影响系统的吞吐量。 2、在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、<、<=、<>、>=)或使用group by或orderby的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。 3、在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。 4、在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。 5、选择聚簇索引应基于where子句和连接操作的类型。 本文编辑:插秧机,http://www.cgjfg.com/ 该文章在 2020/3/3 1:59:26 编辑过 |
关键字查询
相关文章
正在查询... |