数据库索引,是数据库管理系统中一个排序的数据结构,主要有B树索引Hash索引两种

一:B树索引

先来看下B树索引结构实列

关于图的说明如下:
左边表示的是某个数据库的数据表,一共有两列七条记录,最左边的是数据记录的物理地址(就是在硬盘的存储位置)。为了加快对Col2这一列的查找,可以创建一个如右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在O(log2n)的复杂度内获取到相应数据。

举例子来看下,比如这样的一个查询select * from tablename where Col2=5
这时候会先从Col2=34的根节点开始找,因为5小于34,会进入到左边的编号位22的子节点,依次向下推,就会找到Col2=5,这样就比用5Col2中的每个数字来对比下要快的多了。

其实关于B树,大多数用的是B树的变种,主要有B-,B+树,关于这两个介绍,我帮大家找了两篇以漫画形式解释这两个概念的,比较容易理解,保证你看完后不会有这样的感觉

两篇通俗易懂的文章:
漫画:什么是B-树?
漫画:什么是B+树?

二:理解Hash树索引

哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,这时疑问就来了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

1.Hash索引只支持等值比较,例如使用=,IN( )和<=>。对于WHERE price>100并不能加速查询

如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

2.Hash 索引无法被用来避免数据的排序操作

由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算;

3.Hash 索引不支持多列联合索引的最左匹配规则

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

4.Hash索引在任何时候都不能避免表扫描

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。

补充:

什么情况下会使用索引呢?

  1. 主键自动建立唯一索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 查询中于其他表关联的字段,外键关系建立索引
  4. 频繁更新的字段不适合建立索引,因为每次更新不单单时更新了记录还会更新索引
  5. where 条件里用不到的字段不创建索引
  6. 查询中排序的字段,排序的字段若通过索引去访问将会大大提高排序速度
  7. 查询中统计或者分组的字段

哪些情况不需要创建索引

  1. 表记录太少
  2. 经常增删改的表
  3. 如果某个数据列包含许多重复的内容,为它建立索引
    就没有太多太大实际效果

关于这篇文章,希望大家能够多理解几遍,把索引的概念给吃透。

参考链接
1.数据库索引B树、B+树、Hash索

jpa 每次启动都要创建外键索引_索引(五)索引数据结构相关推荐

  1. jpa 每次启动都要创建外键索引_JPA 不生成外键

    在用jpa这种orm框架时,有时我们实体对象存在关联关系,但实际的业务场景可能不需要用jpa来控制数据库创建数据表之间的关联约束,这时我们就需要消除掉数据库表与表之间的外键关联. 但jpa在处理建立外 ...

  2. jpa 每次启动都要创建外键索引_什么情况下外键建立索引?是必须的吗

    朋友问了一个问题: 首先,外键什么情况下采用呢? 外键是否采用看业务应用场景,以及开发成本的 1. 互联网行业应用不推荐使用外键: 用户量大,并发度高,为此数据库服务器很容易成为性能瓶颈,尤其受IO能 ...

  3. mysql可视化创建外键说明_关于使用可视化图形工具navicat for mysql来创建外键的步骤...

    主键:主键是一张表的唯一标识符,应该让其处于不可被外界更改状态. 且主键对于用户来说是无意义的,为了明确这一点,我们应该让主键处于一种幽魂状态,即主键存在,但其他人并不感觉到它存在. 外键:创建外键是 ...

  4. Mysql无法创建外键的原因

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  5. mysql创建外键级联更新_MySQL中利用外键实现级联删除、更新

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  6. mysql 创建外键索引吗_索引-MySQL无法创建外键约束

    我在为mysql数据库中的现有表创建外键时遇到一些问题. 我有experiment表: +-------------+------------------+------+-----+--------- ...

  7. mysql setnull_1、Mysql无法创建外键的原因 2、MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用...

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  8. mysql外键排序规则_mysql创建外键出错(注意数据库表字段排序)

    标签: 1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 ...

  9. mysql创建外键级联更新_MySQL使用外键实现级联删除与更新的方法

    本文实例讲述了MySQL使用外键实现级联删除与更新的方法.分享给大家供大家参考,具体如下: MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时 ...

最新文章

  1. 【爬虫系列之一】爬虫开发环境的搭建
  2. html中如何实现选择存储路径的功能_16687.VSM006分解03_如何打开HTML内嵌图像存储位置...
  3. 视频中场的问题2009-04-03 19:38(一)
  4. CVE-2021-3156:Sudo 堆缓冲区溢出漏洞(有poc,exp待更新)
  5. Object有哪些公用方法?
  6. 疫情期间天天对你“开枪”的额温枪,你知道它的工作原理吗?| 原力计划
  7. Netapp存储控制器接管
  8. c++new时赋初值_C++ Lesson 7:new,delete amp; 类的重用
  9. 如何实现与硅谷技术零距离
  10. CorelDRAW入门教程
  11. 电子邮件链接格式html主题,html创建电子邮件链接的方法
  12. 北邮计算机考研专业课分值,北邮计算机考研分数线
  13. 时空复杂度(时间复杂度/空间复杂度)O(1)、O(n)、O(n^2)、O(log n)、O(n log n)是什么意思
  14. Spring_AOP(execution表达式)
  15. 论文 | 图理论 | 2021年斯坦福大学Jiaxuan You博士论文《用图赋能深度学习》译读 摘要和感谢
  16. 【目标检测】目标检测的评价指标(七个)
  17. AJAX之封装+跨域
  18. m35c android 4.4,索尼m35c刷机的方法
  19. acwing 2. 01背包问题
  20. 教师网络计算机研修培训总结,教师网络研修总结

热门文章

  1. 简洁好用的数据库表结构文档生成工具!
  2. 带你进入String类的易错点和底层本质分析!
  3. 某程序员求助:求职大厂时合并简历,如今面试已过,还能坦白吗?
  4. 40 张图带你搞懂 TCP 和 UDP
  5. 9月8日凌晨,字节跳动全员收到邮件!因为这件事,所有人多发半个月工资!字节沸腾!网友酸了!...
  6. 待遇46K起,这几个公众号在招人!
  7. 浅谈 MySQL 集群高可用架构
  8. 如何优雅的使用 Angular 表单验证
  9. 为什么做小程序的时候要做定制开发小程序?
  10. SQL与NoSQL区别-存储结构