access建立两个字段唯一索引_数据库索引原理及优化

微信公众号:云计算通俗讲义

持续输出技术干货,欢迎关注!

通过本文你将了解:

  • 概述
  • 分类
  • 索引底层实现原理
  • 基本操作
  • 索引失效
  • 索引优化

01 概述

索引是帮助MySQL高效获取数据的排好序的数据结构,用于快速找出某个列中有一特定值的行。

通过上述定义可以理解索引三个基本特性:

1、索引的作用是为了追求高效查找;

2、索引是一种数据结构,且是有序的;

3、索引用于快速查找某一个特定值的行(非特定值情况,即模糊匹配的情况是无效的)。

不使用索引,MySQL必须从第一条记录开始读完整个表,直到找到相关的行,表越大,查询数据所花费的时间就越多(全表扫描)。如果表中查询的列有一个索引,MySQL能够快速到达一个表搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。

1.1 隐式索引

隐式索引由数据库服务器在创建某些对象的时候自动生成。例如,对于主键约束和唯一约束,数据库服务器就会自动创建索引。

之所以会存在隐式索引,是因为数据库总是优先考虑使用索引的这种情况,除非索引失效,但是前提是需要有字段建立索引,如果用户不手动显式指定索引字段,那么数据库就自动添加一个。一切都是为了尽可能的将能优化的情况都考虑到。

1.2 特点

优点:

1、提高数据检索效率,降低数据库的IO成本;

2、通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

缺点:

1、实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引也是要占空间的(空间换时间);

2、虽然索引大大提高了查询速度,同时会降低更新表的速度,如对表进行INSERT、UPDATE、DELETE操作。

1.3 应用场景

需要创建索引:

1、主键自动创建唯一索引

2、频繁作为where查询条件的字段应该创建索引

3、查询中与其他表关联的字段,外键关系建立索引

4、查询中排序的字段(order by),排序的字段若通过索引区访问将大大提高排序速度

5、查询中统计或者分组字段(group by)

注:order by/group by是先做排序再分组,因此可以建索引

不需要创建索引:

1、频繁更新的字段不适合建立索引,因为每次更新不单单是更新了记录还会更新索引

2、WHERE条件里用不到的字段不创建索引

3、表记录太少,即小的数据表不应当使用索引

4、经常增删改的表

5、如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果

6、数据值分布比较均匀的不适合建索引,比如性别

7、如果列中包含大数或者NULL值,不宜创建索引

02 分类

2.1 根据索引字段

1、单值索引

单值索引即一个索引只包含单个列,一个表可以有多个单列索引。

2、复合/联合索引

一个索引包含多个列,例如:INDEX Multidx(id,name.age)。

创建单列索引还是复合索引,要看每次查询中,哪些列在作为过滤条件的WHERE子句中最常出现。

如果只需要一列,那么就应当创建单列索引。如果作为过滤条件的WHERE子句用到了两个或者更多的列,那么复合索引就是最好的选择。

2.2 根据索引字段类型

1、主键索引/聚簇索引

聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。聚簇索引总是把数据行存储在叶子页中(即数据和索引都存储在叶子节点),因此一个表中只能有一个聚簇索引。

e3788818c2e87860f19dad5dbcf92c52.png

对于上述聚簇索引结构,主键a为索引,则叶子节点就是最终的数据存储节点,查找到叶子节点也就对应找到了对应的数据了。

并不是所有的存储引擎都支持聚簇索引。

InnoDB只有一个聚集索引:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值