【数据库】索引必知必会

这篇具有很好参考价值的文章主要介绍了【数据库】索引必知必会。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

什么是索引

数据库中索引(Index)是一种帮助快速查找数据的数据结构,可以把它理解为书的目录,通过索引能够快速找到数据所在位置。

索引的好处

  1. 使用索引可以加快数据查找的效率,这是创建索引的最主要原因。

  2. 场景的索引数据结构有:Hash表(通过hash算法快速定位数据,但不适合范围查询,因为需要每个key都进行一次hash)、二叉树(查找和修改效率都比较高),但是在InnoDB引擎中使用的索引是B+Tree,相较于二叉树,B+Tree这种多叉树,更加矮宽,更适合存储在磁盘中。

  3. 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。

索引的坏处

使用索引增加了数据查找的效率,但是相对的由于索引也需要存储到磁盘,所以增加了存储的压力,并且新增数据时需要同步维护索引。但是合理的使用索引能够极大提高我们的效率!

创建索引的三种方式

  1. 在执行create table时创建索引

    create table user_index(
    id  int  auto_increment   primary key,
    first_name   varchar(16),
    last_name   varchar(16),
    id_card        varchar(18),
    information   text(225),
    key    name( first_name,last_name),
    fulltext   key(information),
    unique key(id_card));
    
  2. 使用alter table添加索引

    alter table table_name add index  index_name(column_list);
    
  3. 使用create index命令创建索引

    create index index_name on table_name(column_list);
    

索引类型

  • 普通索引

    create index index_name on table_name(column_list);
    
  • 唯一索引

    create index index_name on table_name(column_list);
    
  • 主键索引

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) )
    
  • 组合索引

    ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
    
  • 全文索引

索引数据结构

Hash表

Hash索引不支持顺序和范围查找。

B树

B树是平衡的多叉搜索树。

B+树

为了提高查找速度,其常用的数据结构是一个N叉搜索树。

【数据库】索引必知必会

B树和B+树的区别

  • B 树的所有节点既存放键(key) 也存放 数据(data),而 B+树只有叶子节点存放 key 和 data,其他内节点只存放 key。

  • B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。

  • B 树的检索的过程相当于对范围内的每个节点的关键字做二分查找,可能还没有到达叶子节点,检索就结束了。而 B+树的检索效率就很稳定了,任何查找都是从根节点到叶子节点的过程,叶子节点的顺序检索很明显。

B+树的最大优点

  1. 非常善于范围查找

  2. 所有的查询最终都是落在叶子结点上,查询速度树比较稳定的。

  3. 由于叶子结点是数据的全集,因此就可以把叶子结点存到硬盘上,非叶子结点直接存到内存中,又进一步的大大降低了读取硬盘的次数。

面试题

为什么索引结构默认使用B+树,而不是B-Tree,Hash哈希,二叉树,红黑树?

  • Hash哈希,只适合等值查询,不适合范围查询。还会产生哈希冲突。
  • 一般二叉树,可能会特殊化为一个链表,相当于全表扫描。
  • 红黑树,是一种特化的平衡二叉树,MySQL 数据量很大的时候,索引的体积也会很大,内存放不下的而从磁盘读取,树的层次太高的话,读取磁盘的次数就多了。
  • B-Tree,叶子节点和非叶子节点都保存数据,相同的数据量,B+树更矮壮,也是就说,相同的数据量,B+树数据结构,查询磁盘的次数会更少。

综上,索引更适用于查找多,修改少的场景。

聚簇索引

叶子结点同时存放索引和数据。注意:聚簇索引中叶子节点存储的是行数据

非聚簇索引

索引和数据分开存放。在叶子节点中存放的是数据行的主键索引。通过非聚簇索引进行查询,会先得到一个主键ID,之后再使用主键ID去聚簇索引中的叶子节点查找数据行。

聚簇索引和非聚簇索引的区别

两者主要的区别是存储数据的不同。文章来源地址https://www.toymoban.com/news/detail-419217.html

  • 聚簇索引叶子节点存储的是行数据;而非聚簇索引叶子节点存储的是聚簇索引(通常是主键 ID)。
  • 聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,性能不如聚簇索引。
  • 聚簇索引一般为主键索引,而主键一个表中只能有一个,因此聚簇索引一个表中也只能有一个,而非聚簇索引则没有数量上的限制。

到了这里,关于【数据库】索引必知必会的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 必知必会Java

    你好,我是阿光。 最近想着把工作中使用过的java命令都梳理一下,方便日后查阅。虽然这类文章很多,但自己梳理总结后,还是会有一些新的收获。这也是这篇笔记的由来。 今天先聊聊 jps 命令。 jps 命令是JDK提供的一个工具,用于查看目标系统上的Java进程基本信息(进程

    2024年02月05日
    浏览(49)
  • MySql必知必会

    Buffer Pool基本概念 Buffer Pool:缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。 Buffer Pool由 缓存数据页(Page) 和 对缓存数据页进行描述的 控制块 组成, 控制块中存储着对应缓存页的所属的 表空间、数据页的编号、以及对应缓存页在Buffer Poo

    2024年01月22日
    浏览(63)
  • 聊聊Flink必知必会(二)

    Flink是一个有状态的流处理框架,因此需要对状态做持久化,Flink定期保存状态数据到存储空间上,故障发生后从之前的备份中恢复,这个过程被称为Checkpoint机制。而Checkpoint为Flink提供了Exactly-Once的投递保障。 流处理是一个数据不断输入的过程,为了更好更方便的快照,需要

    2024年02月08日
    浏览(45)
  • ChatGPT入门必知必会

    更多文章欢迎关注公众号: stackoveriow 2023年是真正意义上的AI之年,因为ChatGPT 2007年,iPhone开启了智能手机时代, 2023年,我们迎来了人工智能时代,我们正处于历史的大转折点上,这也许是启蒙运动级别的思想和社会转折,工业革命级别的生产和生活转折 。继22年12月份从GP

    2023年04月18日
    浏览(103)
  • 聊聊Flink必知必会(六)

    Flink是一个分布式系统,需要有效地分配和管理计算资源才能执行流应用程序。它集成了所有常见的集群资源管理器,如Hadoop YARN和Kubernetes,但也可以设置为作为一个独立的集群运行,甚至作为一个库。 Flink运行时由两种类型的进程组成:一个JobManager和一个或多个taskmanager。

    2024年02月04日
    浏览(52)
  • 《SQL 必知必会》全解析

    不要哀求,学会争取。若是如此,终有所获。 原文:https://mp.weixin.qq.com/s/zbOqyAtsWsocarsFIGdGgw 你是否还在烦恼 SQL 该从何学起,或者学了 SQL 想找个地方练练手?好巧不巧,最近在工作之余登上牛客,发现了牛客不知道啥时候上线了SQL 必知必会的练习题。 《SQL 必知必会》作为麻

    2024年02月08日
    浏览(46)
  • 聊聊Flink必知必会(七)

    虽然数据流中的许多操作一次只查看一个单独的事件(例如事件解析器),但某些操作会记住多个事件的信息(例如窗口算子)。 这些操作称为有状态的(stateful)。 有状态操作的一些示例: 当应用程序搜索某些事件模式(event patterns)时,状态(state)将存储迄今为止遇到的事件序

    2024年02月04日
    浏览(47)
  • MySQL必知必会(初级篇)

    数据库 (DataBase,DB),是统一管理的、长期存储在计算机内的、有组织的相关数据的集合。特点是数据见联系密切、冗余度小、独立性高、易扩展,并且可以为各类用户共享。 MySQL :是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的

    2023年04月08日
    浏览(47)
  • 聊聊Flink必知必会(五)

    聊聊Flink的必知必会(三) 聊聊Flink必知必会(四) 从源码中,根据关键的代码,梳理一下Flink中的时间与窗口实现逻辑。 对数据流执行 keyBy() 操作后,再调用 window() 方法,就会返回 WindowedStream ,表示分区后又加窗的数据流。如果数据流没有经过分区,直接调用 window() 方法则会返

    2024年02月05日
    浏览(62)
  • 抽象语法树AST必知必会

    打开前端项目中的 package.json,会发现众多工具已经占据了我们开发日常的各个角落,例如 JavaScript 转译、CSS 预处理、代码压缩、ESLint、Prettier 等。这些工具模块大都不会交付到生产环境中,但它们的存在于我们的开发而言是不可或缺的。 有没有想过这些工具的功能是如何实

    2024年02月16日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包