主键、外键和索引的区别?

主键
定义:惟一标识一条记录,不能有重复的,不容许为空
做用:用来保证数据完整性
个数:主键只能有一个sql

外键
定义:表的外键是另外一表的主键, 外键能够有重复的, 能够是空值
做用:用来和其余表创建联系用的
个数:一个表能够有多个外键数据库

索引
定义:该字段没有重复值,但能够有一个空值
做用:是提升查询排序的速度
个数:一个表能够有多个唯一索引
 oracle

汇集索引和非汇集索引的区别?工具

汇集索引必定是惟一索引。但惟一索引不必定是汇集索引。  sqlserver

汇集索引,在索引页里直接存放数据,而非汇集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据。spa

汇集索引和非汇集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,汇集索引表记录的排列顺序与索引的排列顺序一致,优势是查询速度快,由于一旦具备第一个索引值的纪录被找到,具备连续索引值的记录也必定物理的紧跟其后。汇集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,下降了执行速度。指针

建议使用汇集索引的场合为:
  a.此列包含有限数目的不一样值;
  b.查询的结果返回一个区间的值;
  c.查询的结果返回某值相同的大量结果集。orm

非汇集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,汇集索引和非汇集索引都采用了B+树的结构,但非汇集索引的叶子层并不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针的方式。非汇集索引比汇集索引层次多,添加记录不会引发数据顺序的重组。server

建议使用非汇集索引的场合为:
  a.此列包含了大量数目不一样的值;
  b.查询的结束返回的是少许的结果集;
  c.order by 子句中使用了该列。排序

组合索引(concatenated index):由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则咱们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导

列(leading column),在上面的例子中,col1列为引导列。当咱们进行查询时能够使用“where col1 = ? ”,也能够使用“where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,可是
“where col2 = ? ”查询就不会使用该索引。因此限制条件中包含先导列时,该限制条件才会使用该组合索引。
(1)不要忘记索引(index)也不要滥用索引(index)索引是提升数据库效率的简单又高效的方法。只要是设置了数据库表(table),就不要忘记设置索引(index)。将索引设置在常常用于排序的字段上,其余字段就不要设置了。
 索引不是越多越好,也不是什么字段都适合创建索引的。数据重复性太多的字段不要设置索引。好比 tblMEMBER 的 iSex 字段只有 0 1 两个值,就不要设置索引。

注:根据业务的状况来创建索引。

(2)排序消耗开销:很明显省掉了排序的操做,在页面上进行分面处理。

有时候,排序和时间是有相关性的,而汇集索引,没有建在时间上,会致使排序成本的增长,恰当的利用自增ID来作时间排序,也能省掉不少开销。
若是业务上的排序能够建在汇集索引上,哪么这个排序消耗就会大大降低。(通常作不到这点)

a.用聚合索引比用不是聚合索引的主键速度快

b.用聚合索引比用通常的主键做order by时速度快,特别是在小数据量状况下
     事实上,若是数据量很小的话,用汇集索引做为排序列要比使用非汇集索引速度快得明显的多;而数据量若是很大的话,如10万以上,则两者的速度差异不明显。 

注意:在用sql时看这句sql的效率高不高能够用工具来分析,sqlserver用显示估计的执行计划来分析,oracle用解释计划来分析。 

相关文章
相关标签/搜索