数据库各类索引比较

目录

一.结论

二.各类索引说明

三.各类主键比较区别

四.补充


一.结论

索引的一个主要目的就是加快检索表中数据
索引是用来定位的

注:所有的索引都可以有多个字段,如联合索引,普通索引,主键,聚集索引

二.各类索引说明

1.唯一索引:(可以用来防止数据重复问题,用insert ignore  into插入不报错,affect:0)
注:不能重复,可以有多个,可以有一个null值

  • a.防止添加将在表中创建重复键值的新数据
  • b.加快查询速度

2.主键索引:(主键和主键索引可以想象成是一个东西)
注:不能重复,只能有一个主键,但一个主键可以包含多个字段,不可以有null值,定义主键primarykey时也定义了主键索引
定义主键将自动创建主键索引,主键索引是唯一索引的特定类型

3.聚集索引(从某种程度上,聚集索引即数据)
 注:数据库索引分为聚集索引和非聚集索引,非聚集索引分为普通索引,唯一索引,全文索引等

  • a.一个表只能包含一个聚集索引
  • b.聚集索引和非聚集索引只多了个唯一约束,其他没什么区别
  • c.MySQL-innodb里主键就是聚集索引
  • d.聚集索引的约束是唯一性,是否要求字段也是唯一的呢?不要求唯一!
  • e.聚集索引可以创建在任何一列你想创建的字段上,这是从理论上讲
  • f.聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。

三.各类主键比较区别

1.聚集索引和非聚集索引的主要区别:
(1.)数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同,一个表中就一个;索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以有多个
(2.)聚集索引的叶节点就是最终的数据节点,而非聚集索引的叶节仍然是索引节点,但它有一个指向最终数据的指针。
第三:是不是聚集索引就一定要比非聚集索引性能优呢?


例:如果想查询学分在60-90之间的学生的学分以及姓名,在学分上创建聚集索引是否是最优的呢?
答:否。既然只输出两列,我们可以在学分以及学生姓名上创建联合非聚集索引,此时的索引就形成了覆盖索引,即索引所存储的内容就是最终输出的数据,这种索引在比以学分为聚集索引做查询性能更好。
除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。

2.主键索引和主键的关系:创建主键的同时创建了主键索引
3.主键索引和唯一索引的区别:主键索引使用primarykey创建主键时自动创建,主键索引根据主键要求字段不重复不为空,唯一索    引要求字段不同,但可以有一个null值
4.唯一索引和普通索引的区别:唯一索引unique index,要求值唯一,普通索引index
5.主键和聚集索引关系:主键可分为聚集的主键和非聚集的主键。在创建主键时,如果不指定类型,则默认创建的是聚集的主键,mysql-innodb创建主键同时将主键变为聚集索引

四.补充

1.哪些字段应该加索引哪些不应该加?
注:这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改操作远远多于检索操作时,不应该创建索引。
应该加:where查询字段,order by子句,join字段
不应加:查询中很少使用或者参考的列不应该创建索引,小值字段如性别,text, image和bit数据类型,当修改性能远远大于检索性能时(常修改的字段)

2.多列索引和多个单列索引
  多列索引即是一个索引包含多个字段的情况;

  多个单列索引即是每个索引只包含一个字段,但是有多个索引。

  考虑两种不同的建立索引方式:
  case 1:对c1,c2,c3三列按此顺序添加一个多列索引;
  case 2: 对c1,c2,c3分别建立三个单列索引;

  问题1:按c1搜索时,哪种索引效率快?
  答:case2

  问题2:按C2搜索时,哪种索引效率快?
  答:case2,并且,case1的索引无效

  问题3:按C1,C2搜索时哪种效率快?
  答:不知道

  问题4:按C1,C2,C3搜索哪种效率快?
  答:case1

  问题5:按C2,C3,C1搜索时哪种效率快?
  答:case2,因为没有按多列索引的顺序搜索,case1的索引没有使用到。

 

参考文章:

### 数据库约束与索引的定义 数据库约束是一种用于强制实施数据完整性的机制,它通过设定特定规则来确保表中存储的数据满足一定的业务逻辑和一致性要求。常见的约束类型包括主键约束(PRIMARY KEY)、外键约束(FOREIGN KEY)、唯一约束(UNIQUE)、检查约束(CHECK)以及非空约束(NOT NULL)。这些约束可以防止非法数据进入数据库[^1]。 索引则是数据库管理系统提供的一种快速访问数据的技术手段。它是基于表中的某些列构建的一个特殊结构,能够显著加快查询操作的速度。常用的索引类型包括B-Tree索引、哈希索引、全文索引等。每种类型索引适用于不同的查询模式和场景[^3]。 --- ### 约束与索引的主要区别 #### 功能上的差异 - **约束**主要用于保障数据的一致性和完整性,其核心目标是控制哪些数据可以被插入或修改到表中。 - **索引**则专注于提升查询性能,减少检索时间成本,而不直接影响数据的有效性验证过程[^1]。 #### 实现方式的不同 - 唯一约束可以通过创建唯一索引来实现,但这并不意味着两者完全相同。当定义了一个唯一约束时,底层通常会自动建立相应的唯一索引以支持这一约束条件。然而,单独设置唯一索引并不会触发任何额外的约束行为,仅作为加速重复值检测的功能存在[^1]。 - 对于其他类型的约束(如外键),它们的工作原理独立于索引之外,并依赖于数据库引擎内部复杂的事务处理流程完成跨表参照关系管理等工作[^4]。 --- ### 应用场景分析 #### 数据库约束的应用场合 - 当需要保证某列或多列组合在整个表格范围内具有唯一性的时候应该考虑采用`UNIQUE CONSTRAINTS`或者`PRIMARY KEYS`; - 如果希望限制某一字段只接受指定范围内的数值,则可运用`CHECK CONSTRAINTS`; - 针对那些不允许为空白项的关键属性建议施加`NOT NULL RESTRICTIONS`. #### 各类索引适合解决的问题领域 - B树型别的索引非常适合做精确匹配以及有序排列的结果集获取任务,在大多数情况下都能带来明显的速度改进效果[^2]。 - 而像Hash这样的专用形式更适合处理相等判断密集型负载下的高效定位需求[^2]。 - 至于涉及大量文本资料搜索的任务,则推荐选用Full-text Indexes这类专门针对自然语言处理设计出来的高级工具[^3]。 此外值得注意的是,在实际部署过程中还需要综合考量诸如空间占用率、维护开销等因素的影响程度以便做出更加合理的选择决策[^5]。 ```sql -- 创建带有主键和唯一约束的表示例 CREATE TABLE employees ( id INT PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, department_id INT FOREIGN KEY REFERENCES departments(id), salary DECIMAL CHECK (salary >= 0) ); -- 添加复合索引的例子 CREATE INDEX idx_employee_department_salary ON employees(department_id ASC, salary DESC); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值