精华内容
下载资源
问答
  • 对于索引的基本原理
    2022-01-23 20:08:23

    索引用来快速的寻找那些具有特定值的记录,如果没有索引,一般来说执行查询语句时要便利一整张表

    索引原理

    就是把无序的数据变成有序地查询

            1.创建了索引的列的内容进行排序

            2.对排序结果生成倒排表(对于hash来说倒排表里面的数据是hashcode?)

            3.在倒排表内容上拼上数据地址链 (类似于对hash中的数据中保存实际地址的索引)

            4.在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到数据

    参考文章

    膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili

    更多相关内容
  • 普通索引:是最基本索引,它没有任何限制, 唯一索引:列值唯一(可以有null) 主键索引: 列值唯一(不可以有null)并且 表中只有一个 联合索引:多列组成一个索引 全文索引:对文本的内容进行分词,进行搜索 聚簇...
  • 索引基本原理

    2021-03-23 18:52:39
    其实在日常生活中对于所以我们一点都不陌生,比如小时候刚刚学认字是所用的字典的目录,相对于字典本身就是字典的索引,所以索引是需要有对象的,这里我们不谈所以的对象,仅仅对索引基本原理做一个了解。...

    随便说说

    其实在日常生活中对于索引我们一点都不陌生,比如小时候刚刚学认字是所用的字典的目录,相对于字典本身就是字典的索引,所以索引是需要有对象的,这里我们不谈所以的对象,仅仅对索引的基本原理做一个了解。

    有点东西

    **索引用来快速寻找那些具有特定的记录。**如果没有索引,一般来说执行查询时是需要遍历整个表的
    索引的原理:把无序数据变成有序的查询
    流程如下:

    在这里插入图片描述

    展开全文
  • MySQL官方对索引的定义为:索引...最基本的查询算法当然是顺序查找(linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如二分查找(binary
  • 当我们面对大量的数据查询时,为了提高查询效率,我们在数据库中总要使用到索引。那么索引究竟是怎么样的东西呢? 索引本质 索引其实就是一种数据结构,他将数据库中的数据以一定的数据结构算法进行存储,能够帮助...

    当我们面对大量的数据查询时,为了提高查询效率,我们在数据库中总要使用到索引。那么索引究竟是怎么样的东西呢?

    索引本质

    索引其实就是一种数据结构,他将数据库中的数据以一定的数据结构算法进行存储,能够帮助我们快速的检索数据库中的数据。

    何时使用索引

    1.当某些列的查询概率比较高或经常作为where条件的列。

    2.在作为主键的列上。

    3.在经常用在表连接的列上。

    在这些时候,我们就要考虑使用此列作为一个索引

    索引类型

    1.在Mysql数据库的索引中,主要包括Hash索引和B+ Tree索引,我们常用的InnoDB引擎,默认的是B+树。

    2.Hash索引和B+ Tree索引的区别:

        1)Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询(大于、小于的范围查询)是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ Tree是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描。

        2)哈希索引没办法利用索引完成排序(例如order by);

        3)哈希索引不支持多列联合索引的最左匹配规则。(多列索引(联合索引)有最左前缀的原则:即最左优先。
    如果我们建立了一个2列的联合索引(col1,col2),实际上已经建立了两个联合索引(col1)、(col1,col2);
    如果有一个3列索引(col1,col2,col3),实际上已经建立了三个联合索引(col1)、(col1,col2)、(col1,col2,col3),查询时,会先查最左的第一个索引col1。)

        4)如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。

    3.在B+ Tree索引下还分为了聚簇索引和非聚簇索引。在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引。聚簇索引查询会更快,因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再回表进行一次查询。

    4.深入探索问题——什么情况下会发生明明创建了索引,但是执行的时候并没有通过索引呢?

    答:当查询优化器未选择到该索引的执行计划查询优化器: 一条SQL语句的查询,可以有不同的执行方案,至于最终选择哪种方案,需要通过优化器进行选择,选择执行成本最低的方案。 在一条单表查询语句真正执行之前,MySQL的查询优化器会找出执行该语句所有可能使用的方案,对比之后找出成本最低的方案。这个成本最低的方案就是所谓的执行计划。 优化过程大致如下: 1、根据搜索条件,找出所有可能使用的索引 2、计算全表扫描的代价 3、计算使用不同索引执行查询的代价 4、对比各种执行方案的代价,找出成本最低的那一个)

    索引的缺点

    1.创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    2.索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
    3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

    索引是否生效

    1.在数据库新建一个查询,使用 explain 关键字进行查询。

    例如 explain select * from user WHERE company_id=410 

    此时在查询结果中就会发现

    possible_keys列下面的值就是你创建的索引名称,如果为空,则说明你的索引未被使用到。

    展开全文
  • mysql索引原理

    千次阅读 2021-01-23 11:47:25
    mysql索引原理 首先介绍一款可以帮助理解数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 一、数据结构 索引是一种特殊的数据结构。可以帮助我们快速查询到数据。 (1)...

    mysql索引原理

    首先介绍一款可以帮助理解数据结构的网站:Data Structure Visualization

    一、数据结构

    索引是一种特殊的数据结构。可以帮助我们快速查询到数据。

    (1)二叉树

    二叉树是一种特殊的树,每个节点最多有两个子节点,值从左到右依次递增。

    例如:当想查询值为11的数据时,如果没有索引要按顺序查找多次,有索引只查三次,加速了查询数据。

    问:为什么索引的数据结构不用二叉树?

    因为当值依次递增插入时,二叉树会退化成链表,对加快查询没有任何作用。

    时间复杂度(代码执行的次数):O(N)

    (2)红黑树(自平衡二叉查找树

    特点:

    1. 每个节点只能是红色或黑色。
    2. 跟节点必须是黑色。
    3. 红色的节点,它的叶节点只能是黑色。
    4. 从任一节点到其叶子节点的所有路径都包含相同数目的黑色节点。

    当数据插入时,红黑树通过旋转和变色来达到平衡。这样就弥补了二叉树退化成链表的尴尬

    问:为什么索引的数据结构不用红黑树?

    因为当值依次递增插入时树的高度会变得特别高。就例如上图查询0007只用3次,那查询70000呢?几乎要用30000次。效率会变得特别低。

    时间复杂度为:O(log2N)

    (3)B树(多路平衡搜索树)

    特点:

    1. 一个节点可以有多个元素
    2. 叶节点具有相同的深度,叶节点的指针为空
    3. 所有索引元素不重复
    4. 节点中的数据索引从左到右递增排列

    问:为什么索引的数据结构不用B树?

    虽然B树相对于红黑树,树的高度降低了,但是随着数据量的增多,树的高度还是会变得很高,效率会变得特别低。而且对范围查找也不方便。

    (4)B+树

    特点:

    1. 非叶子节点不存储data,只存储索引(冗余),可以放多个索引。
    2. 叶子节点包含所有的索引字段
    3. 叶子节点用指针连接,提高区间访问性能(注意是单向指针。)

    (5)mysql B+树

    mysql使用的是B+树,但是不完全是。对原B+树做了一些改造,例如:

    1. 叶子节点改成双向指针,提高范围查询效率。
    2. 忘了

    (5)hash

    可以通过对某一值做hash运算,可以快速确定数据存放地址,查询到数据。但是缺点也很明显,不支持范围查询<>。几乎不用

    问:为什么innodb表必须有主键?

    因为innodb表的索引结构是B+树,而B+树是基于索引来存储数据的。所有的数据全部保存在B+树的叶子节点上。

    问:如果没有主键会怎么样?

    innodb引擎会查找并选择第一个没有null值的列,作为主键索引。如果没有,则会使用隐藏列作为主键。

    问:为什么推荐使用整形自增主键而不用uuid?

    优点

    1. 节约空间
    2. 插入效率高(由于B+树遵循左小右大,所以自增插入数据总是在最右侧插入。而uuid则不一定,如果页16k已经写满了,那只能把页中的数据向后移,在空位中插入。频繁的移动分页会造成碎片,后续需要使用OPTIMIZE TABLE来进行碎片整理)

    问:为什么非主键索引结构叶子节点存储的是主键值?

    非主键索引存储主键值,是为了当数据变动时,不需要修改各非主键索引的值,只需修改主键索引叶子结点的数据即可。减少了重复操作,即提高性能。

    二、Innodb页底层结构

    分成三个部分

    1. 页头:包含前后页的指针
    2. 页目录:包含数据区(分组)的最小id值,方便通过指针查询到数据
    3. 数据区:用于存放数据,指针依次向下。

    为什么要引入页目录?

    比如:我要查询id为4的数据,需要从上到下查询4次。把数据区的数据分组,页目录存储每组数据最小的id值。那么我只需要通过目录3,查询2次即可。提高了查询效率。

    当一页存满之后,数据会存放到下一页,通过双向指针连接,如图:

    当数据越存越多,最终多个页组成了链表。例如:我要查询1000,如果从第1页开始查询,一页一页遍历效率就太慢了(这就是全表扫描)

    那怎么办?当然还是用类似页目录的方式了:如图:

    到这里就可以大致看出来了,这个结构就是上面说的B+树。每一页即B+树的一个节点

    三、主键索引底层结构

    问:索引文件对应系统位置在哪?

    在mysql目录的data目录下某个数据库名的文件夹下

    myisam引擎:包含frm(结构文件)、MYD(data数据文件)、MYI(index索引文件)

    innodb引擎包含frm(结构文件)、idb(索引+数据文件)

    innodb索引文件和数据文件在一起的(聚集索引)

    此处可以看出innodb比myisam引擎少一次磁盘io操作(不需要再去MYD文件取数据),可以说性能好一些。

    四、组合索引结构

    explain

    索引失效

    最左匹配原则

    五、Innodb共享表和独享表

    共享表:在mysql目录的data目录下ibdata1文件,如图:

    • 优点:所有数据及索引全部存放在ibdata1文件中
    • 缺点:在表中做了大量删除操作,ibdata文件不会变小,表空间中会产生大量空隙。对于经常删除操作的这类应用不适合共享表

    独享表:在mysql目录的data目录下的某个数据库名的文件夹下,如图:

    • 优点:
    1. 可以实现单表在不同的数据库中移动
    2. 空间可以回收(drop/truncate table方式操作表空间不能自动回收)
    3. 不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理
    • 缺点:单表增加比共享空间方式更大。

    修改成独享表方法:查看mysql参数

    my.cnf设置添加参数

    • innodb_file_per_table=1 为使用独占表空间
    • innodb_file_per_table=0 为使用共享表空间

    myisam表需要先转换成innodb:alter table table_name engine=innodb;

    索引回表和全表扫描

    展开全文
  • 基本索引原理PPT学习教案.pptx
  • oracle 基本索引原理

    2012-10-14 20:23:40
    oracle 基本索引原理,oracle 学习真必不可少的资料。
  • mysql 索引原理详解

    千次阅读 2021-01-24 13:06:58
    在mysql的性能优化中,索引优化可以算是篇幅最大的了,这是因为mysql底层的Innodb结构在对于索引的优化上面做了大量的优化和改进,如何合理的使用索引,加速查询性能,是一个值得研究的问题 Innodb索引 为什么要建立...
  • SQL索引工作原理

    千次阅读 2019-04-26 22:17:06
    在谈到索引基本概念的时候,我们就提到了这种方式: 图书馆的前台有很多索引卡片柜,里面分了若干的类别,诸如按照书名笔画或拼音顺序、作者笔画或拼音顺序等等,但不同之处有二:① 索引卡片上记录了每本书摆放...
  • 索引实现原理

    2021-07-22 23:47:02
    普通索引:最基本索引没有任何限制 唯一索引:与普通索引类似,索引列的值必须唯一,允许null,如果是组合索引则列值的组合必须唯一 主键索引:特殊的唯一索引,不允许有null,作为一张表唯一的标识是表中的某一条记录 ...
  • 数据库索引原理

    千次阅读 2019-03-20 11:13:59
    了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变...
  • Mysql索引:图文并茂,深入探究索引原理和使用

    万次阅读 多人点赞 2020-11-25 16:43:44
    关于Mysql索引的走心总结,建议收藏,反复阅读。
  • 倒排索引原理

    千次阅读 2020-01-08 17:03:41
    倒排索引原理: 有倒排索引肯定有正向索引,先说一下什么是正向索引: ​ 通俗的来说:正向索引就是通过文档去找关键词,倒排索引就是通过关键词去找文档; 正向索引: ​ 假设有5个文件,每个文件都对应一...
  • 本文实例讲述了mysql索引原理与用法。分享给大家供大家参考,具体如下: 本文内容: 什么是索引 创建索引 普通索引 唯一索引 全文索引 单列索引 多列索引 查看索引 删除索引 首发日期:2018-04-14 什么是...
  • MySQL 索引原理

    千次阅读 2022-04-24 16:29:44
    MySQL索引深入剖析
  • 深入解析MySQL索引原理

    千次阅读 2020-06-16 11:03:10
    什么是索引、为什么要建立索引? 关于索引的理解,个人更加喜欢将其比喻为字典里面的目录,根据字典来进行查询的速度远大于每一页逐个逐个字排查的速度。 索引主要用于快速找出在某个列中有特定值的行,倘若不...
  • ES倒排索引原理

    千次阅读 2021-03-18 14:57:32
    ES倒排索引原理 先简单了解一下什么是倒排索引,假设我们向某个索引里写入了下面两条document: document 某字段内容 doc1 I really liked my small dogs, and I think my mom also liked them. doc2 He ...
  • 索引原理学习

    千次阅读 多人点赞 2018-08-14 22:47:47
    一、介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是...索引对于良好的性能 非常关键,尤其...
  • 深入浅出数据库索引原理

    千次阅读 2020-10-08 20:52:10
    首先,我们将从索引基础开始介绍一下什么是索引,分析索引的几种类型,并探讨一下如何创建索引以及索引设计的基本原则。 创建一张用于测试的user表结构如下: 建表语句如下: CREATE TABLE `user` ( `id` int...
  • 这两种索引的运行原理 查询过程 对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录。 对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录...
  • mongo数据库索引原理

    万次阅读 2017-08-05 00:40:19
    索引的本质 索引(Index)是帮助数据库高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 现在的数据库(mongo,mysql等)索引多采用B-Tree数据结构
  • 倒排索引的英文原名是Inverted index,大概因为Invert有颠倒的意思,所以就被翻译成了倒排,然后我们就会在字面上出现误解:很容易让人理解为从A-Z颠倒成Z-A。...索引的数据结构基本上采用倒排索引的结构,luce
  • 所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。 ...
  • 全文检索一般是查询包含某一或某些关键字记录,所以通过文档整体值建立的索引对提高查询速度是没有任何帮助的。为了解决这个问题,人们创建了一种新索引方法,这种索引方法就是倒排索引
  • MongoDb(六)索引原理和命令

    千次阅读 2020-03-31 18:53:54
    (一)索引基本介绍    索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值...
  • 【数据库】数据库索引原理

    千次阅读 2019-06-04 08:45:40
    3.索引原理B+ tree4.B+ tree 在两大引擎中的体现5.索引的原则 1.索引是什么? 索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。 2.为什么? 索引能极大的减少存储引擎需要扫描的数据量 索引可以...
  • 数据库索引实现原理

    万次阅读 2018-07-17 22:18:59
    这篇文章是介绍MySQL数据库中的索引是如何根据需求一步步演变...Oracle和DB2数据库索引的实现基本上也是大同小异的。文章写得很通俗易懂,就转在这了。关于B+树和索引内部结构可以参考:《B 树、B- 树、B+ 树和B*...
  • 索引的实现原理

    万次阅读 多人点赞 2017-09-17 21:47:38
    Oracle和DB2数据库索引的实现基本上也是大同小异的。文章写得很通俗易懂,就转在这了。关于B+树和索引内部结构可以参考:《B 树、B- 树、B+ 树和B* 树》和《深入理解DB2索引(Index)》。 00 – 背景知识...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 257,545
精华内容 103,018
热门标签
关键字:

对于索引的基本原理