既然有主键,为何还要建索引?

之前一直没用过oracle,数据库的基础也差,

这几天garry给讲了一些关于索引相关的东西,

虽然懂了不少还是有一些不清楚的地方。

如,

create table nice(
  id number(4) constraint pk_id primary key,
  name varchar2(20) constraint u_name unique
)

 在建表之后就会有两个index,select * from user_indexes where table_name="NICE";可以查看。

既然primary和unique是可以作为索引的,那么,为什么还要建索引呢,

在网上查到的说法,虽然清晰了一点,但是还是不是很清楚。

扫描二维码关注公众号,回复: 1336297 查看本文章

1.这个主键和索引并非是两个相同的东西,表中的主键一般作用是用来对记录进行区分的,使得记录可以唯一方便查找。但是又很多时候我们需要查找的并不是主键,而且其他的属性,比如学生表的主键是“学号”,但是我经常要根据学生的“姓名”来进行查询,那么建立索引就会提高查询效率(但相对的插入和删除的效率就会变慢)。

至于什么时候使用索引这个一般是根据场景决定的,索引会加快查询(select)的速度,但是会减慢(insert和delete)的速度,需要自己根据业务和数据权衡使用,很难有定论

2.主键只是不得重复的属性.按照主键查找,只能挨个的对比,找到相等的就ok

而索引呢,不必挨个对比. 就像哈希结构(虽然很多数据库不用哈希作为数据结构,但相似的道理),索引在你存储的时候会在键与"该组数据的物理位置"(就比如C中的数组,存储在连续的区域)建立关系(哈希中叫做哈希函数),这样在查询的时候:输入键->得到数据的位置->在那个位置上取出数据.所以比挨个对比快的多.

因此索引加快了查询,但是减慢了存储(插入,修改). 所以索引适合查询而不适合写数据

猜你喜欢

转载自liujiawinds.iteye.com/blog/1731318