首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql 索引原理

文章目录 1、索引的本质 2、索引的分类 2.1、Hash 索引 2.2、二叉树 2.4、B树(二三树) 2.5、B+树 3、主键目录 4、索引页 5、索引页的分层 6、非主键索引 7.回表 1、索引的本质...索引的本质是一种排好序的数据结构。...2、索引的分类 在数据库中,索引是分很多种类的(千万不要狭隘的认为索引只有 B+ 树,那是因为我们平时使用的基本都是 MySQL)。而不同的种类很显然是为了应付不同的场合,那索引到底有那些种类呢?...2.1、Hash 索引 Hash 索引是比较常见的一种索引,他的单条记录查询的效率很高,时间复杂度为1。...但是,Hash索引并不是最常用的数据库索引类型,尤其是我们常用的Mysql Innodb引擎就是不支持hash索引的。主要有以下原因: Hash索引适合精确查找,但是范围查找不适合

30140
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL索引原理

    其实大多数情况下并不会,因为计算机中存在局部性原理,即该数据被用到那么与它相邻的数据也大概率会被用到。...7、建立共识 在了解磁盘存储数据的原理以及 MySQL 与磁盘的关系后,我们可以建立如下共识: MySQL 中的数据文件,是以page为单位保存在磁盘当中的。...---- 二、索引原理 1、引出索引 为了引出索引,我们建立一个 user表,并在表中插入一些无序的数据: create table if not exists user ( id int primary...我们可以参考现实生活中书的目录: 可以看到,对于数据库原理这本书,如果我们要找 “范式” 这一小节,一共有两种做法: 从头逐页的向后翻,直到找到目标内容。...即使创建表时没有指明主键,MySQL 索引也是按照 B+树的结构来组织的,这是因为如果没有主键索引 MySQL 会自动添加一列隐藏列来作为主键。

    25420

    MySQL索引原理

    MySQL索引原理 MySQL索引 概述 索引是数据库中一个排序的数据结构,用来协助快速查询和更新数据库表中的数据;数据是以文件的形式存放在磁盘上的,每一行数据都有它的磁盘地址;当没有索引时,比如从...只有文本类型字段才可以创建全文索引(**cahr、varchar、text**)。在 **MySQL** 中的 **InnoDB & MyISAM** 存储引擎都支持全文索引。...InnoDB 存储引擎的逻辑存储结构 **MySQL** 的存储结构分为:表空间、段、簇、页以及行 ?...联合索引的最左匹配 前面是针对单列创建的索引,但需要多条件查询时就要建立联合索引;单例索引也可以看成是特殊的联合索引。...开启 **ICP** 后把 **first_name Like '%zi'** 条件下推给存储引擎后只会返回读取所需的 **1** 条记录,该功能是 **MySQL 5.6** 后完善的功能,只是适用于二级所用

    44330

    Mysql索引原理(三)」Mysql中的Hash索引原理

    varchar(50) DEFAULT NULL, KEY `fname` (`fname`) USING HASH ) ENGINE=MEMORY; 为什么用MEMORY存储引擎,因为mysql...看如下查询: select lname from testhash where fname ='Peter' Mysql首先计算Peter的哈希值是8784,然后到哈希索引中找到对应的行指针...2、mysql同时提供了SHA1()、MD5()两个加密函数,不要使用这两个函数做哈希函数,他们是强加密函数,设计目标是最大限度消除冲突,但计算的哈希值很长,浪费空间且有时更慢。...和B+Tree索引不同,这类索引无需前缀查询。空间索引从所有维度索引数据。查询时,可以有效地使用任意维度来组合查询。必须使用Mysql的GIS相关函数如MBRCONTAINS()等来维护数据。...Mysql 的GIS并不完善,大部分人不会使用到这个特性。开源关系数据库中对GIS的解决方案做得比较好的是PostgreSQL的PostGIS。

    8.7K11

    Mysql索引原理(四)」单列索引

    前缀索引索引选择性 ? 索引的选择性:不重复的索引值(也称为基数)和数据表的记录总数(#T)的比值,范围从1/T到1之间。...选择性越高则查询效率越高,因为选择性高的索引可以让Mysql在查找时过滤掉更多的行。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。...对于BLOB、TEXT或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度。 前缀的“基数”应该接近于完整列的“基数”。 如何选取适合的前缀长度?...如何创建前缀索引 alter table city_demo add key (city(3)); 前缀索引是一种能使索引更小、更快的有效办法,但另一方面也有缺点:mysql无法使用前缀索引做order...应用场景 存储网站会话时,需要在一个很长的十六进制字符串上创建索引。此时如果采用长度为8的前缀索引通常能显著地提升性能,且对上层应用完全透明。 后缀索引 字符串反转后做前缀索引

    77520

    Mysql索引原理(七)」覆盖索引

    覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引都不存储索引列的值,所以MySQL只能使用B+Tree索引所覆盖索引。...不过理论上mysql有一个捷径可以利用:where条件中的列是由索引可以覆盖的,因此Mysql可以使用该索引找到对应的last_name并检查是否first_name是否匹配,过滤之后再读取所需要的数据行...MySQL不能在索引中执行like操作。这是底层存储引擎API的限制。MySQL5.5和更早的版本只允许在索引中做简单的比较操作(等于、不等于及大于)。...这种情况下,MySQL服务器只能提取数据行的值而不是索引值来做比较。 1....在查询第一个阶段MySQL可以使用覆盖索引,因为索引包含了主键id的值,不需要做二次查找。

    1.8K12

    MySQL索引原理探索

    MySQL索引原理探索 索引的本质其实就是各种各样的数据结构,在增删改查的各种操作有不通的时间复杂度和空间复杂度 索引的类型 Hash索引: 参考java中的hash结构,因为其结构,查找单条数据的效率特别高...但Mysql的Innodb引擎就是不支持hash索引 Hash索引适合精确查找,但是范围查找不适合。...是不是就算是二分法查找,其效率也依旧是很低的,所以为了解决这种问题 MySQL又设计出了一种新的存储结构—索引索引页是什么?自己理解就是MySQL在套娃,在数据页外再套一层。...正式因为如此,所以一个表最多只能有一个聚簇索引。 聚簇索引MySQL 基于主键索引结构创建的 非主键索引 对于非主键索引MySQL也会帮忙维护一张B+树。你有多少索引,就会维护多少B+树。...插入的原理就是这样子的。此时每个数据页中的记录存放的实际是索引字段和主键字段,而其他字段是不存的(为什么不存放?

    24430

    MySQL——索引实现原理

    MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。...答案是否定的,和一级索引(主键索引)没有什么区别。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。...MyISAM的索引方式索引和数据存放是分开的,非聚集”的,所以也叫做非聚集索引。 InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。...InnoDB的二级索引的叶子节点存储的不是行号(行指针),而是主键列。这种策略的缺点是二级索引需要两次索引查找,第一次在二级索引中查找主键,第二次在聚簇索引中通过主键查找需要的数据行。...数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每个节点只需要一次磁盘I/O就可以完全载入。

    68021

    Mysql索引原理(六)」聚簇索引

    聚簇索引不是一种单独的数据类型,而是一种数据存储方式。 InnoDB的聚簇索引实际上在同一结构中保存了B+Tree索引和数据,当表有聚簇索引时,它的数据行实际上存放在索引的叶子节点中。...因为无法同时把数据行放在两个不同的地方,所以一个表只能有一个聚簇索引(覆盖索引可模拟多个聚簇索引的情况,后面会介绍) 因为是存储引擎负责实现索引,因此不是所有的存储引擎都支持聚簇索引。...本节课主要关注InnoDB,但是这里讨论的原理对于任何支持聚簇索引的存储引擎都是适用的。 聚簇索引中的记录是如何存放的? ? 叶子节点包含了全部数据,其他节点只包含索引列。...聚簇索引索引和数据保存在同一个B+Tree中,因此从聚簇索引中获取数据通常比在非聚簇索引中查找要快。 使用覆盖索引扫描的查询可以直接使用页节点中的主键值。...当对MySQL进行大量的增删改操作的时候,很容易产生一些碎片,这些碎片占据着空间,所以可能会出现删除很多数据后,数据文件大小变化不大的现象。当然新插入的数据仍然会利用这些碎片。

    2.9K40

    Mysql索引原理(九)」前缀压缩索引

    MyISAM使用前缀压缩来减少索引的大小,从而可以让更多的索引可以放入内存中,这在某些情况下能极大地提高性能。默认只压缩字符串,但通过参数设置也可以对整数做压缩。...MyISAM压缩每个索引块的方法是,完全保存索引块中的第一个值。然后将其他值和第一个值进行比较得到相同前缀的字节数和剩余的不同后缀部分,把这部分存储起来即可。...所有在块中查找某一行的操作平均都需要扫描半个索引快。 对于CPU密集型应用,因为扫描需要随机查找,压缩索引使得MyISAM在索引查找上要慢好几倍。压缩索引的倒序扫描就更慢了。...压缩索引需要在CPU内存资源与磁盘之间做平衡。压缩索引可能只需要十分之一大小的磁盘空间,如果是I/O密集型应用,对某些查询带来的好处会比成本多很多。...可以在create table语句中指定pack_keys参数来控制索引压缩的方式。

    1.1K30

    Mysql索引原理(十一)」索引和锁

    如果索引无法过滤掉无效的行,那么在InnoDB检索到数据并返回给服务器层以后,MySQL服务器才能应用where子句。这时已经无法避免锁定行了,InnoDB已经锁住了这些行,到适当的时候才释放。...在MySQL5.1及以后版本中,InnoDB可以在服务器端过滤掉行后就释放锁,但是在早起版本中,InnoDB只有在事务提交后才能释放锁。...InnoDB会锁住第一行,这是因为Mysql为该查询选择的执行计划是索引范围扫描: explain select id from people where id1 for update...就像这个例子显示的,即使使用了索引,InnoDB也可能锁住一些不需要的数据。如果不能使用索引查找和锁定行的话问题可能会更糟糕,MySQL会做全表扫描并锁住所有的行,而不管是不是需要。...关于InnoDB、索引和锁有一些很少有人知道的细节:InnoDB在二级索引上使用共享锁。

    76320

    MySQL索引底层(二)--索引底层原理

    聚集索引 上次我们讲到了主键的索引,我们可以执行一下sql语句 explain select * from t_user where a = 1 我们可以看到这条sql走的是主键的索引,而在mysql的...InnoDB中,主键索引则是聚集索引,数据的物理顺序与键值的逻辑(索引)顺序相同,其实就是说主键索引跟其他列的数据是存在一起的。...那么创建索引的本质又是什么呢,其实就是创建要给B+树的数据结构,跟我们前面所讲的主键索引是一样的, 创建主键索引,其实就是按主键排序,然后做一个B+树的数据结构,那么现在将字段b,c,e创建了索引,其实就是给...那么当我们要查找a=3,b=1,e=b的时候,我们就可以直接定位到第一页的数据的第二条,但是我们可以看到当前这里只存储了4个字段的值,而我们要找的是全部字段的值,当然mysql不可能把所有列的值都存在叶子节点中...当我们执行上面的sql语句的时候,我们都知道这条sql不会走索引,从key_len字段中也可以看出,那么为什么没有走索引呢,因为我们创建索引的时候是指定了b,c,e三个字段创建了索引,现在我们执行这条sql

    59921

    MySQL索引底层(一)索引底层原理

    MySQL索引底层原理 局部性与页 在操作系统中,我们执行一个指令去磁盘取数据,那么他会从磁盘取出4KB数据,这个4KB就是一个局部单位,而这4KB数据就是你的指令中取出的数据周围的数据,因为操作系统认为你下一次的数据会从这条数据的周围中取...那么在Mysql的操作当中,也有这么一个原理。 ?...,则mysql会从磁盘取出第一条数据到内存中,然后比对a字段的值,一直比对到第三条才是正确的,那么会产生3次IO磁盘操作,有了局部性跟页后,那么mysql会从磁盘中进行局部性的取出一页数据,这里一页数据是...页数据原理 ?...当我们使用insert插入上面的语句的时候,其实可以看到插入的过程中,这4条数据已经按主键的顺序插入到MySQL中,那么在这个插入的过程是怎么样的,我们来研究一下InnoDB存储的过程。

    73231

    MySQL索引实现原理分析

    MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。...下图是MyISAM索引原理图:image.png这里设表一共有三列,假设我 在 MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论 MyISAM...下图是 MyISAM 索引原理图: 这里设表一共有三列,假设我们以 Col1 为主键,则图 8 是一个 MyISAM 表的主索引(Primary key)示意。...,则MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,类型为长整形。...(A,B,C)—会使用索引 (,B,C)—不会使用索引 (,,C)—不会使用索引 *最后来一个问题:mysql假设一行数据大小为1k,则一颗层高为3的b+树可以存放多少条数据?

    47320

    MySQL索引实现原理分析

    MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论 MyISAM 和 InnoDB 两个存储引擎的索引实现方式。...MyISAM 索引实现 MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录 的地址。下图是 MyISAM 索引原理图: ?...因为 InnoDB 的数据文件本身要按主键聚集, 1 .InnoDB 要求表必须有主键(MyISAM 可以没有),如果没有显式指定,则 MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列...,则MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,类型为长整形。...因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。

    64530

    MySQL索引原理及设计

    引擎的 MySQL 索引的相关概念,以及如何针对 InnoDB 进行索引的设计和使用,以及三星索引的概念,会从我所了解到的知识去解释为什么需要这样,如果有错误的地方还请指出。...对于此种情况,MySQL 5.6 版本增加了 Index Condition Pushdown 技术,如果查询中 where 语句可以使用索引中已有的字段(比如这里就是 name,age, gender...),在遍历索引时对这些字段先做判断直接过滤掉不满足条件的值,减少引擎层访问表的次数和 MySQL Server 层访问存储引擎的次数。...三星索引 在《高性能 MySQL》书中提到了一本书叫《Relational Database index design and the optimizers》,书中有一个概念是“三星索引”,它是这样定义的...作者:About iCell 原文:https://icell.io/how-mysql-index-works/?utm_source=tuicool&utm_medium=referral ?

    70830

    4.MySQL索引原理

    目录 一 初识索引索引原理索引的数据结构 四 聚集索引与辅助索引MySQL索引管理 六 测试索引 七 正确使用索引 八 联合索引与覆盖索引 九 查询优化神器-explain 十 慢查询优化的基本步骤...可见索引的添加也是非常有技术含量的。 二 索引原理索引原理 索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。...PS: 1. mysql先去索引表里根据b+树的搜索原理很快搜索到id等于333333333的记录不存在,IO大大降低,因而速度明显提升 2....对于连续多个and:mysql会按照联合索引,从左到右的顺序找一个区分度高的索引字段(这样便可以快速锁定很小的范围),加速查询,即按照d—>a->b->c的顺序 #3、or的工作原理 条件:...a = 10 or b = 'xxx' or c > 3 or d =4 索引: 制作联合索引(d,a,b,c) 工作原理:

    61210

    MySQL 索引原理 图文讲解

    一个系统的性能好坏,系统架构和代码逻辑是一方面,还有一个点就是SQL语句和表索引的优化了,那首先得弄清楚索引原理,才能进行写出更好的SQL以及优化,下面主要通过MYSQL索引进行讲解。...B+树的结构如下图所示: 004.png Mysql聚簇索引 我们知道,Mysql的InnoDB使用的是B+树存储数据,除了主键索引为聚簇索引,其它索引均为非聚簇索引。...Mysql的InnoDB底层使用的就是这种数据页加索引页的结构来存储数据的。...Mysql非聚簇索引 我们已经了解到主键索引(聚簇索引)的底层原理了。那我们平常建立的索引除了主键索引,肯定会还有其他非聚簇索引,例如基于name+age建立的索引。它又是怎么构建索引结构的呢?...其实原理同主键索引差不多,主键索引是根据主键来维护一个B+树,非主键索引就是根据索引列来维护一个B+树。不同的索引对应一个B+树,索引也占用存储空间,这也就是不能建太多索引的原因。

    83720
    领券