索引

  • 索引
  • 索引的优缺点和使用场景
  • 索引的优点:
  • 索引的缺点:
  • 使用场景:
  • 索引的分类:
  • 创建普通索引:
  • 创建主键索引:
  • 创建唯一索引:
  • 删除索引:
  • 索引实现的原理
  • 面试常见问题


索引

索引是一种特殊文件,包含对数据表数据里面所有记录的数据引用指针,并且指定索引类型,我们可以通过索引快速找到数据。
索引可以避免顺序查询,从而直接将查询的访问定位出来,这样的话查询效率就能大大提升 。并且可以将数据库中的关键索引信息存储到内存中,而内存的操作速度远远比磁盘快。
MySQL官方对索引的定义:索引是帮助MySQL高效获取数据的数据结构,提取句子主干,就可以得到所哟因的本质。索引是数据结构。
关于MySQL常见的数据库引擎;
MySQL5.5之后默认的数据库引擎是InnoDB,5.5之前的都是MyISAM.
1。稳定性:InnoDB引擎支持事务(保证数据的稳定性)他的稳定性比MyISAM好,MyISAM不支持事务。
2.性能:MyISAM性能比较高,而InnoDB性能不如MyISAM。

存储数据模组:
1.磁盘:容量大,价格低廉,操作速度快,可以持久化,重启之后数据还依旧存在。
2.内存:容量小,价格比较贵,操作上速度快,比可以被持久化。
3.CPU缓存(L1,L2,L3)容量小,操作速度极快,不可以被持久化。

索引的优缺点和使用场景

索引的优点:

加速查询效率

索引的缺点:

  • 增加了维护成本,因为索引使用的是B+树,在删除数据和添加数据时需要整理树结构,这样的话就增加了新的开销。
  • 增加存储成本(磁盘空间成本的提升,内存空间成本的提升)。
  • 如果索引过多会对MySQL的优化器造成一定的负担。

使用场景:

创建索引时需要考虑的因素:
1.数据量较大
2.经常查询的列
满足这俩条件时,可以考虑对表中这些字段创建索引,来提高查询的效率。
但如果是不需要经常使用的列,即不用经常进行插入,修改操作的列,则不适合创建索引,因为插入修改及删除才做会重新整理索引,速度会很慢。
MySQL服务器本身安装的电脑上磁盘空间或空间不足的情况下就不要创建索引。

索引的分类:

唯一的标识,主键不可重复,只能有一个列作为主键

按照是否为主键划分

  • 主键索引(primary key ) (簇拥索引/聚集索引)
  • 非主键索引(非簇拥索引/非聚集索引/二级索引)
    特征:
  • 普通索引
  • 唯一索引(unique key) 创建索引的这个字段能保证唯一性的
    在一个表中,主键索引只能有一个,但唯一索引可以有多个
  • 联合索引 由一个表中多个字段组成的索引。

在创建主键primary key/unique/fornign key时会自动创建索引,而对于非主键,非唯一约束,非外键的字段,可以手动创建索引。并且每个索引都会对应一个B+树。

创建普通索引:

create index 索引名 on 表名(字段名);

GoldenDB 和mysql语法区别_mysql

创建主键索引:

alter table 表名 add primary key(column);

GoldenDB 和mysql语法区别_主键_02

创建唯一索引:

create unique index 索引名 on 表名(字段名);

GoldenDB 和mysql语法区别_java_03

删除索引:

每个索引名在一张表中是唯一的不能重复。

drop index 索引名 on 表名;

GoldenDB 和mysql语法区别_GoldenDB 和mysql语法区别_04


小结:在创建索引时,会创建相应的约束,而删除索引时相应的约束也会被删除。

唯一索引在被删除时,要确保原先的数据符合唯一约束,这样才能成功的创建唯一约束,否则将会创建失败。

索引实现的原理

1.二叉树阶段
缺陷:层级比较高,查询和维护比较不方便
2.B树阶段
缺陷:将所有叶子节点都存储在叶子节点和非叶子节点,当数据量特别大的时候,索引加载起来就需要很长时间。
3.B+树阶段
缺陷:只有叶子节点才存储数据,且数据和索引是分离的,所谓的存储的数据,其实是指向数据的地址,数据量就会变得非常小。
优化:非叶子节点不在存储数据。叶子节点存储的并不是数据本身,而是数据的地址。

面试常见问题

聚簇索引(聚集索引)和非聚簇索引(非聚集索引)(二级索引)的区别:

聚簇索引:

GoldenDB 和mysql语法区别_mysql_05


只要可以定位到这个id,我就可以获取到这个id相对应的一组数据。

非聚簇索引:

GoldenDB 和mysql语法区别_mysql_06


聚簇索引和非聚簇索引的区别在于:

1.执行效率:聚簇索引查询速度更快,因为聚簇索引存储的是数据,而非聚簇索引存储的是主键id,需要进行回表查询。

2.数量上:聚簇索引一个表只能有一个,而非聚簇索引可以有多个。