你真的理解MySQL索引吗?一文带你从数据结构层面解析mysql索引原理

MySQL索引全面解析:从原理到实战,一文掌握高效查询的终极秘籍 MySQL索引的优化是一门平衡的艺术,需要结合业务场景、数据分布和查询模式综合决策。掌握本文的核心原理与实战技巧后,建议通过以下步骤实践:使用EXPLAIN分析关键查询。监控慢查询日志,定位性能瓶颈。遵循“最左前缀”、“覆盖索引”等原则设计索引。扩展阅读《高性能MySQL》MySQL 8.0官方文档 - Optimization。 阅读详情

索引数据结构

数据页基本结构 :

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

从上图可以推断出,查询某条记录关键步骤只有2个:

  1. 定位到数据页
  2. 定位到记录

如果没有索引,查询某条记录只能先依次遍历数据页,确定记录所在的数据页之后;再从数据页中通过 页目录 定位到具体的记录,这样做效率肯定是很低的。

为了方便说明,先建一张示例表:

mysql> CREATE TABLE index_demo(
    ->     c1 INT,    ->     c2 INT,    ->     c3 CHAR(1),
    ->     PRIMARY KEY(c1)    -> ) ROW_FORMAT = Compact;Query OK, 0 rows affected (0.03 sec)

为了展示便方便,行格式中只展示 record_type 、 next_record 和 实际各列的值 。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

把一些记录放到页里边的示意图就是:

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

上面提到过, 数据页中的记录是按主键正序排列的 。实际上就是为了能够使用 二分查找法 快速定位一条记录。同理,要想快速定位一个数据页,也得保证各个数据页是按顺序排序的。排序的规则就是 后一个数据页的最小主键必须大于当前数据页的最大主键 。这样实际上就保证了,所有记录的主键都是正序排列的了。

页分裂

假设每个数据页最多只能存放3条记录。现在 index_demo 插入了3条记录 (1, 4, 'u'), (3, 9, 'd'), (5, 3, 'y') 。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

然后,再向 index_demo 插入一条记录 (4, 4, 'a') 。由于每个数据页最多只能存放3条记录,并且还要保证所有记录主键是按主键正序排列的。mysql会新建一个页面(假设是页28),然后将主键值为5的记录移动到页28中,最后再把主键值为4的记录插入到页10中。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

简单来说, 当向一个已经存满记录的数据页插入新记录时,mysql会以新插入记录的位置为界,把当前页面分裂为2个页面,最后再将新记录插入进去 。

mysql索引实现

假设 index_demo 已经存在多条记录,数据页结构如下所示:

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

为了能够使用 二分法 快速查找数据页,我们可以给每个数据页建一个目录项,每个目录项主要包含两部分数据:

key
page_no

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

在mysql中,这些目录项其实就是另一类型的数据记录,称为 目录项数据记录 (record_type=1), 目录项数据记录 也是存储在 页 中的,同一页中的 目录项数据记录 也可以通过 页目录 快速定位。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

虽然 目录项记录 基本 只存储了主键值和页号 。但是当表中的数据很多时,一个 数据页 肯定是无法保存所有的 目录项记录 的。因此存储 目录项记录 的 数据页 实际上可能有很多个。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

这个时候,我们就需要快速定位存储 目录项记录 的 数据页 了。实际上,我们只需要生成 更高级的目录即可,同时保证最高一级的 目录项记录 的 数据页 只有一个 。这样就能根据主键从上到下快速定位到一条记录了。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

实际上,上面的结构就是一颗B+树。 实际的用户记录其实都存放在B+树的 叶子节点 上,而 非叶子节点 存放的是目录项 。

聚簇索引

上面介绍的索引实际上就是聚簇索引,它有两个特点:

  1. 使用主键值的大小进行记录和页的排序,这包括三个方面的含义:页内的记录是按照主键的大小顺序排成一个单向链表。各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表。存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表。
  2. B+树的叶子节点存储的是完整的用户记录。

InnoDB存储引擎会自动根据主键创建聚簇索引。同时,聚簇索引就是InnoDB存储引擎中数据的存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的 索引即数据,数据即索引 。

二级索引

在实际场景中,我们更多的是为某个列建立二级索引。实际上,二级索引和聚簇索引实现的原理一样的。主要的区别只有2个:

索引列的值

如图是以 c2 列建立的二级索引:

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

由于B+树的叶子节点存储的是对应记录的主键值。如果我们要查询完成记录的话,在拿到主键之后,再需要再到 聚簇索引 中查出用户记录,这个过程也叫 回表 。

联合索引

在实际场景中,经常也出现为多个列建立一个索引的情况,这种索引也称为 联合索引 。 联合索引 本质上也是二级索引,区别仅仅在于由一个列变为多个列而已。简单来说就是 同时以多个列的大小作为排序规则,也就是同时为多个列建立索引 。比如我们为 c2 和 c3 列建立联合索引:

  1. 先把各个记录和页按照c2列进行排序。
  2. 在记录的c2列相同的情况下,采用c3列进行排序。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

InnoDB的B+树索引的注意事项

根节点不变性

上面介绍B+树的时候,为了理解方便,采用自下而上的方式介绍。实际上,B+树的形成过程如下:

B+
页分裂

可以看出, 一个B+树索引的根节点自诞生之日起,便不会再移动 。

内节点中目录项记录的唯一性

我们知道B+树索引的内节点中目录项记录的内容是索引列+页号的搭配,但是这个搭配对于二级索引来说有点儿不严谨。为了保证内节点目录项记录的唯一性,目录项还需要存储主键值数据。也就是说,目录项记录的内容包含 索引列的值 、 主键值 和 页号 。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

MyISAM中的索引方案简单介绍

我们知道 InnoDB中索引即数据,也就是聚簇索引的那棵B+树的叶子节点中已经把所有完整的用户记录都包含了 ,而MyISAM的索引方案虽然也使用树形结构,但是却将 索引和数据分开存储 :

  • MyISAM存储引擎 把记录按照记录的插入顺序单独存储在 数据文件 中。这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少记录就成了。我们可以通过行号而快速访问到一条记录。
  • MyISAM存储引擎 会把索引信息另外存储到 索引文件 中。 MyISAM 会单独为表的主键创建一个索引,只不过在 索引的叶子节点中存储的不是完整的用户记录,而是主键值+行号的组合 。也就是先通过索引找到对应的行号,再通过行号去找对应的记录!
    这一点和 InnoDB 是完全不相同的,在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录。而在MyISAM中却需要进行一次回表操作,意味着 MyISAM中建立的索引相当于全部都是二级索引 !
  • 如果有需要的话,我们也可以对其它的列分别建立索引或者建立联合索引,原理和InnoDB中的索引差不多,不过在叶子节点处存储的是相应的列+行号。这些索引也全部都是二级索引。

索引的使用

上面介绍了B+索引的原理,接下来介绍如何更好的使用索引。大家都知道索引不是建的越多越好,因为创建索引在空间上和时间上都会付出代价。

  1. 空间上的代价
    每创建一个索引,本质上就是要建立一个B+树,创建索引肯定会占用一部分存储空间。
  2. 时间上的代价
    每次对表中的数据进行增删改操作时,都需要去修改各个B+树索引,而B+树索引的记录又是按照 索引列的值 排序的。每次增删改操作时,不可避免的会破坏原有记录的顺序,所以存储引擎需要额外的时间来进行记录移位、页面分裂等操作来维护记录的顺序。

简单来说, 一张表的索引越多,占用的存储空间也会越多,增删改的性能会更差 。

B+树索引适用的条件

首先创建一张示例表 person_info ,用来存储人的一些基本信息。

CREATE TABLE person_info(
    id INT NOT NULL auto_increment,
    name VARCHAR(100) NOT NULL,
    birthday DATE NOT NULL,
    phone_number CHAR(11) NOT NULL,
    country varchar(100) NOT NULL,
    PRIMARY KEY (id),
    KEY idx_name_birthday_phone_number (name, birthday, phone_number)
);

简要说明一下:

  1. id 列为主键,自动递增。InnoDB会自动为id列建立聚簇索引。
  2. 为 name , birthday , phone_number 建立了一个联合索引。所以这个二级索引的叶子节点包含了 name , birthday , phone_number 和 id 列的值。

下面,简要画一下 idx_name_birthday_phone_number 联合索引的示意图。

你真的理解索引吗?从数据结构层面解析mysql索引原理

 

从图中可以看出,这个 idx_name_birthday_phone_number 索引对应的B+树中页面和记录的排序方式就是这样的:

  1. 先按照 name 列的值进行排序。
  2. 如果 name 列的值相同,则按照 birthday 列的值进行排序。
  3. 如果 birthday 列的值也相同,则按照 phone_number 的值进行排序。

全值匹配

全值匹配指的是 搜索条件中的列和索引列一致 。比如:

SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday = '1990-09-27' AND phone_number = '18562539312';

在 idx_name_birthday_phone_number 联合索引上进行全值匹配的查询过程如下:

  1. 因为B+树的数据页和记录先是按照 name 列的值进行排序的,所以先可以很快定位name列的值是 Ashburn 的记录位置。
  2. 在 name 列相同的记录里又是按照 birthday 列的值进行排序的,所以在 name 列的值是 Ashburn 的记录里又可以快速定位 birthday 列的值是'1990-09-27'的记录。
  3. 如果 name 和 birthday 列的值都是相同的,那记录是按照phone_number列的值排序的, 所以联合索引中的三个列都可能被用到 。

联合索引最左匹配

其实在搜索语句中不用包含全部联合索引的列,只包含左边的列也能够使用索引,这就是联合索引的 最左匹配原则 。比如:

SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday = '1990-09-27';

如果我们想使用联合索引中尽可能多的列,搜索条件中的各个列必须是联合索引中从最左边连续的列。

前缀匹配

对于字符串类型的索引列来说,我们只匹配它的前缀也是可以快速定位记录的。因为字符串比较本质上按一个一个字符比较得出的,也就是说这些字符串的前n个字符,也就是前缀都是排好序的。比如:

SELECT * FROM person_info WHERE name LIKE 'As%';

但是如果只给出后缀或者中间的某个字符串,是无法使用索引的,比如这样: %As 或者 %As% 。如果实际场景中碰到要以字符串后缀查询数据的话,可以考虑 逆序存储 ,将后缀匹配转化为前缀匹配。

范围匹配

因为索引B+树是按照索引列大小排序的,因此按索引列范围查询可以快速查询出数据记录。比如:

SELECT * FROM person_info WHERE name > 'Asa' AND name < 'Barlow';

由于B+树中的数据页和记录是先按 name 列排序的,所以我们上边的查询过程其实是这样的:

Asa
Barlow

精确匹配某一列并范围匹配另外一列

对于同一个联合索引来说,虽然对多个列都进行范围查找时只能用到最左边那个索引列,但是如果左边的列是精确查找,则右边的列可以进行范围查找,这种场景下依然会使用索引。

SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday > '1980-01-01' AND birthday < '2000-12-31' AND phone_number > '15100000000';

整个查询过程大致如下:

  1. name = 'Ashburn' ,对 name 列进行精确查找,当然可以使用B+树索引了。
  2. birthday > '1980-01-01' AND birthday < '2000-12-31' ,由于 name 列是精确查找,所以通过 name = 'Ashburn' 条件查找后得到的结果的name值都是相同的,它们会再按照 birthday 的值进行排序。所以此时对 birthday 列进行范围查找是可以用到B+树索引的。
  3. phone_number > '15100000000' ,通过 birthday 的范围查找的记录的 birthday 的值可能不同,所以这个条件无法再利用B+树索引了,只能遍历上一步查询得到的记录。

用于排序

在实际业务场景中,经常需要对查询出来的结果进行排序。一般情况下,只能将记录全部加载到内存中(结果集太大可能使用磁盘存放中间结果),再使用排序算法排序。这种 在内存中或者磁盘上的排序方式统称为文件排序 filesort ,性能较差 。但是如果 order by 子句使用到了索引列,就可能避免 filesort 。比如下面这个查询语句:

SELECT * FROM person_info ORDER BY name, birthday, phone_number LIMIT 10;

这个查询结果依次按 name 、 birthday 和 phone_number 排序,而 idx_name_birthday_phone_number B+索引树也刚好是按上述规则排好序的,因此只需要直接从索引中提取数据,然后回表即可。

需要注意的是,对于联合索引来说, ORDER BY 的子句后边的列的顺序也必须跟索引列的顺序一致,否则排序的时候就无法使用索引了。

用于分组

有时候我们为了方便统计表中的一些信息,会把表中的记录按照某些列进行分组。比如下边这个分组查询:

SELECT name, birthday, phone_number, COUNT(*) FROM person_info GROUP BY name, birthday, phone_number

和使用B+树索引进行排序是一个道理,分组列的顺序也需要和索引列的顺序一致,也可以只使用索引列中左边的列进行分组。

覆盖索引

上面提到到,所谓回表就是在二级索引中获取到主键id集合之后,再分别到聚簇索引查询出完整记录,简单来说就是 一次二级索引查询,多次聚簇索引回表 。这意味着 二级索引命中的主键记录越多,需要回表的记录也会也多,整体的性能就会越低 。因此某些查询,宁可使用全表扫描也不使用二级索引。

为了更好的使用 二级索引+回表 的方式进行查询,一般推荐使用 limit 限制要查询的记录,这样 回表 的次数也能得到控制。

为了彻底告别回表操作带来的性能损耗,建议: 在查询列表里只包含索引列 ,比如这样:

SELECT name, birthday, phone_number FROM person_info WHERE name > 'Asa' AND name < 'Barlow'

因为只查询 name , birthday , phone_number 这三个索引列的值,所以就没必要进行回表操作了。我们把这种 只需要用到索引的查询方式称为覆盖索引 。

如何挑选索引

上面主要介绍了索引的适用场景,接下来我们介绍下建立索引时或者编写查询语句时就应该注意的一些事项。

只为用于搜索、排序或分组的列创建索引

只为出现在 WHERE 子句中的列、连接子句中的连接列,或者出现在ORDER BY或GROUP BY子句中的列创建索引。而出现在查询列表中的列就没必要建立索引了。

考虑列的基数

列的基数 指的是某一列中不重复数据的个数。,在记录行数一定的情况下, 列的基数越大,该列中的值越分散,列的基数越小,该列中的值越集中 。因此推荐的方式是 为那些列的基数大的列建立索引 ,为基数太小列的建立索引效果可能不好。

索引列的类型尽量小

在表示的整数范围允许的情况下,尽量让索引列使用较小的类型。原因如下:

  1. 数据类型越小,在查询时进行的比较操作越快
  2. 数据类型越小,索引占用的存储空间就越少,在一个数据页内就可以放下更多的记录,从而减少磁盘I/O带来的性能损耗,也就意味着可以把更多的数据页缓存在内存中,从而加快读写效率。

使用前缀索引

当字段值比较长的时候,建立索引会消耗很多的空间,搜索起来也会很慢。我们可以通过 截取字段的前面一部分内容建立索引 ,这个就叫前缀索引。

例如:创建一张商户表,因为地址字段比较长,在地址字段上建立前缀索引:

create table shop(address varchar(120) not null);

问题是,截取多少呢?截取得多了,达不到节省索引存储空间的目的,截取得少了, 重复内容太多,字段的基数会降低。实际场景中,可以通过不同长度的基数与总记录数据基数的比值,选择一个较为合理的截取长度。

select count(distinct left(address,10))/count(*) as sub10,
count(distinct left(address,11))/count(*) as sub11,
count(distinct left(address,12))/count(*) as sub12,
count(distinct left(address,13))/count(*) as sub13
from shop;

避免索引列字段参与计算

如果索引列在比较表达式中不是以单独列的形式出现,而是以某个表达式,或者函数调用形式出现的话,是用不到索引的。

比如有一个整数列 my_col , WHERE my_col * 2 < 4 查询是不会使用索引的,而 WHERE my_col < 4/2 能正常使用索引。

主键插入顺序

我们知道,对于InnoDB来说,数据实际上是按主键大小正序存储在聚簇索引的叶子节点上的。所以如果我们插入的记录的主键值是依次增大的话,那我们每插满一个数据页就换到下一个数据页继续插入。而如果我们插入的主键值忽大忽小的话,就会造成频繁的 页分裂 ,严重影响性能。因此,为了保证性能,需要保证主键是递增的。

无法使用索引的几种情况

  1. ORDER BY 的子句后边的列的顺序也必须跟索引列的顺序不一致。
  2. ASC 、 DESC 混用
  3. 排序列包含非同一个索引的列
  4. 排序列使用了复杂的表达式
  5. 索引列上使用函数 (replace\SUBSTR\CONCAT\sum count avg)、表达式、 计算(+ - * /)
  6. like 条件中前面带%
  7. 字符串不加引号,出现隐式转换

以上就是小编整理的MySQL索引结构,有哪里不准确的地方,还请各位大佬多多交流,小编和大家共同进步!!!

GBASE南大通用GBase 8s数据库-从零开始的手动安装与实例配置指南 本文详细介绍了GBASE南大通用GBase 8s数据库的手动安装与实例配置全过程,包括环境准备、用户创建、安装包准备、实例创建、环境变量配置等关键步骤。通过实战经验分享和常见问题解决方案,帮助用户快速掌握GBase 8s数据库的安装与配置技巧,确保数据库稳定运行。 阅读详情

相关推荐

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 379

Mysql基础(21):建立二级索引数据库索引

目录 1、索引本质 2、索引数据结构 3、索引是怎么支撑千万级表的快速查找? 4、如何基于索引b+树精准简历高性能索引? 5、联合索引底层数据结构是怎么样的? 1、索引本质 索引是帮助Mysql高效获取数据的排好序的数据结构 2、索引数据结构 二叉树、红黑树、Hash表、B-Tree Mysql从第一行将数据从磁盘load到内存与sql对比,每一次load叫做一次IO。 此时给Col2添加索引,Col2作为一个二叉树,二叉树也存储在磁盘上。每个节点保存为一个map&...

mingyuli的博客 1569

【Konva】解决图形加入group后无法获取到绝对坐标,以及group内绘制新图形坐标偏移的问题

解决konva绘图开发时“图形加入group后坐标不会变动,无法获取到绝对坐标”的问题

近10年前端开发工作经验,为你分享日常经验所得 1500

聚簇索引与非聚簇索引(也叫二级索引)

聚簇索引与非聚簇索引(也叫二级索引) 通俗点讲 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内存中,...

249

从‘平行’到‘鱼骨’:手把手拆解AlGaN/GaN HEMT多栅指结构的布局优化实战

本文深入探讨了AlGaN/GaN HEMT多栅指结构的布局优化,从传统的平行栅结构到创新的鱼骨栅结构,详细解析了如何通过优化信号路径和热管理提升功率器件的性能。文章结合实测数据和EDA工具,展示了鱼骨栅结构在相位一致性、热阻和版图利用率方面的显著改进,为射频功率放大器设计提供了实用指导。

weixin_27061475的博客 443

集成学习之GBDT

GBDT

joejoeqian的博客 1259

【MySQL】索引的数据结构

索引(Index)是帮助MySQL高效获取数据的数据结构。索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找算法。

kuangd_1992的博客 1228

别再手动抄表了!用PaddleOCR超轻量模型5分钟搞定数字仪表识别(附完整Python代码)

本文介绍如何利用PaddleOCR超轻量模型快速实现工业仪表数字识别自动化。通过5行核心代码和关键预处理步骤,显著提升识别准确率至98.2%,解决传统OCR在工业场景中的体积大、抗干扰弱等问题,并提供完整Python代码和边缘部署优化方案。

weixin_31062533的博客 351

mysql 二级索引原理_MySQL索引的原理,B+树、聚集索引和二级索引的结构分析

索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,如果想在一本书中找到某个主题,一般会先找到对应页码。在mysql中,存储引擎用类似的方法使用索引,先在索引中找到对应值,然后根据匹配的索引记录找到对应的行。我们首先了解一下索引的几种类型和索引的结构。索引类型B树大多数存储引擎都支持B树索引。b树通常意味着所有的值都是按顺序存储的,左边子节点比父节点小,右边子节点比父节点大,并且每一...

weixin_32770423的博客 645

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

SKILL实现电路virtuoso原理图schematic中引脚pin的net自动打上pin label

qq_41510657的博客 2617

YOLOv11的QAT(训练感知量化)实战

本文总结了YOLO模型量化感知训练(QAT)的实践要点:QAT通过模拟量化噪声训练模型,比训练后量化(PTQ)更适合密集预测任务。关键实现包括:1)配置对称/非对称量化器;2)排除检测头量化;3)调整学习率策略并添加量化正则;4)选择困难样本校准;5)转换前稳定BN统计量。调试时需检查量化范围、数值分布和逐层突变,并注意SPP等敏感层。建议小模型使用QAT,大模型可能适得其反,且TensorRT的FP16模式可能优于INT8-QAT。量化应以功能正确为前提,避免过度优化。

as1225120794的博客 510

MySQL 索引详解(B+数、二级索引)

MySQL 索引详解 1.概述 1.1 简介 MySQL 官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法。 1.2 优缺点 1.2.1 优点 类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的IO成本(1),这也是创建索引最主要的原因 通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性

BaiKnow的博客 2603

ETAS工具导入DBC生成Com协议栈

ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项不管是导入DBC还是arxml,本质上都是为了生成对应的com协议栈,目的是为了减少重复的工作量,所以,前期定义好收发的矩阵很重要,一般导入一次之后,后面就可以按变更点手动更改了。

赞的博客 1714

MySQL索引有哪些分类,你真的清楚吗?

MySQL索引都有哪些分类? 按数据结构分类可分为:B+tree索引、Hash索引、Full-text索引。 按物理存储分类可分为:聚簇索引、二级索引(辅助索引)。 按字段特性分类可分为:主键索引、普通索引、前缀索引。 按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引)。

在路上的博客 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【MySQL基础】MySQL索引全面解析:从原理到实践

【MySQL基础】MySQL索引全面解析,从底层实现到熟练上手!!

2301_80220607的博客 2465

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

你真的理解索引吗?从数据结构层面解析mysql索引原理

从《mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构》中,我们已经知道了数据页内各个记录是按主键正序排列并组成了一个单向链表的,并且各个数据页之间形成了双向链表。在数据页内,通过页目录,根据主键可以快速定位到一条记录。这一章中,我们深入理解一下mysql索引实现。 本文主要内容是根据掘金小册《从根儿上理解 MySQL》整理而来。如想详细了解,建议购买掘金小册阅读。 索引数据结构 先回顾一下上一章节中数据页基本结构: 从上图可以推断出,查询某条记录关键步骤只有2个: 定位到数据页

伍六七 524

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

一文彻底理解 MySQL 的索引机制

MySQL索引是数据库性能优化的关键,其核心在于减少磁盘I/O操作和避免全表扫描。索引采用B+Tree结构,相比二叉树、平衡树和B树,B+Tree能有效控制树的高度,减少查询时的磁盘访问次数,并且支持高效的范围查询。创建高性能索引需遵循最左前缀匹配原则,优先选择区分度高的列作为索引,并针对大字段使用前缀索引优化。理解索引的工作原理和数据结构选择,能够显著提升数据库查询效率,减少系统资源消耗。

数据知道的博客 1万+

MySQL索引深入解析:从原理到实践

索引是数据库表中一列或多列的值进行排序的一种数据结构,使用索引可以快速访问数据库表中的特定信息。简单来说,索引就像是书籍的目录,能够帮助我们快速定位到需要的内容,而不必逐页翻阅。索引是MySQL性能优化的核心,合理使用索引可以提升查询性能几个数量级。但索引并非越多越好,需要根据实际查询模式、数据分布和写负载来精心设计。理解索引的底层原理有助于做出更好的设计决策,避免常见的性能陷阱。记住,索引设计是一门艺术,需要在查询性能与写开销之间找到平衡点。

weixin_51786043的博客 2834

MySQL索引的理解学习,面试不问索引原理就是事务原理

MySQL索引的理解学习,面试不问索引原理就是事务原理

小杰312的博客 2801

一文搞懂MySQL索引数据结构

前言 当我们在查询数据慢的情况下第一个想到的会是添加索引,索引在数据库的实际应用场景中十分常见,数据库的优化也离不开对索引的优化。而且索引相关的知识也是面试频率非常高的点之一,因此,本文将从基础理论出发,介绍MySQL按照逻辑角度的索引分类和实现。通过索引数据结构的实现原理阐述不同结构对建立索引带来的优劣势,希望通过这篇文章能给大家带来收获。 SQL执行慢的原因分析 磁盘空间不足、内存不足、I/O吞吐量小或者网络差等原因。 表没有创建索引或者索引已经失效。 分库分表也会带来SQL慢的原因 服务器调优及各.

养歌的博客 5900

mysql 二级索引原理_你真的理解索引吗?从数据结构层面解析mysql索引原理

索引数据结构数据页基本结构 :从上图可以推断出,查询某条记录关键步骤只有2个:定位到数据页定位到记录如果没有索引,查询某条记录只能先依次遍历数据页,确定记录所在的数据页之后;再从数据页中通过 页目录 定位到具体的记录,这样做效率肯定是很低的。为了方便说明,先建一张示例表:mysql> CREATE TABLE index_demo(-> c1 INT,-> c2 ...

weixin_35765226的博客 842

MySQL索引深度解析:从原理到实践

在单表数据不断被插入的情况下, MySQL 会在容量不足的时候,自动开辟新的Page来保存新的数据,然后通过指针的方式,将所有的Page组织起来。需要注意,上面的图,是理想结构,大家也知道,目前要保证整体有序,那么新插入的数据,不一定会在新Page上面,这里仅仅做演示。正式因为有序,在查找的时候,从头到后都是有效查找,没有任何一个查找是浪费的,而且,如果运气好,是可以提前结束查找过程的。页内部存放数据的模块,实质上也是一个链表的结构,链表的特点也就是增删快,查询修改慢,所以优化查询的效率是必须的。

可涵的博客 6063

MySQL索引的数据结构以及算法原理

写在前面的话        在编程领域有一句人尽皆知的法则“程序 = 数据结构 + 算法”,我个人是不太赞同这句话(因为我觉得程序不仅仅是数据结构加算法),但是在日常的学习和工作中我确认深深感受到数据结构和算法的重要性,很多东西,如果你愿意稍稍往深处挖一点,那么扑面而来的一定是各种数据结构和算法知识。例如几乎每个程序员都要打交道的数据库,如果仅仅是用来存个数据、建建表、建建索引、做做增删改查,那么...

Zeus_龙的博客 2万+

mysql索引原理算法_你真的理解索引吗?从数据结构层面解析mysql索引原理

由上图和实践经验可以推断出,要查询某条记录只有2个关键步骤:定位到数据页定位到记录要查询数据,如果没有建立索引那么就只能依次遍历数据页,确定了而记录所处的数据页之后,再通过页目录从数据页中定位到具体的数据记录,毫无疑问这样做效率肯定是很低的。在此我们先建一张表,方便下文说明:为了方便展示,行格式中只展示record_type、next_record和实际各列的值。下图展示了把一些记录放到页里边:数...

weixin_42513296的博客 104

深入解析MySQL索引原理

一. 什么是索引、为什么要建立索引? 关于索引的理解,个人更加喜欢将其比喻为字典里面的目录,根据字典来进行查询的速度远大于每一页逐个逐个字排查的速度。 索引主要用于快速找出在某个列中有特定值的行,倘若不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多。如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据,而不必查找所有数据,那么将会节省很大一部分时间。 索引分类 索引一般可以分为四类 单列索引:单列索引指的是只包含

memory的博客 2641

mysql数据结构_你真的理解索引吗?从数据结构层面解析mysql索引原理

索引数据结构数据页基本结构 :从上图可以推断出,查询某条记录关键步骤只有2个:定位到数据页定位到记录如果没有索引,查询某条记录只能先依次遍历数据页,确定记录所在的数据页之后;再从数据页中通过 页目录 定位到具体的记录,这样做效率肯定是很低的。为了方便说明,先建一张示例表:mysql> CREATE TABLE index_demo( -> c1 INT, -&g...

weixin_39689870的博客 114
上一篇: 三面头条失利,但收获满满,面试凉经分享,与君共勉
下一篇: 阿里P8重点推荐的火爆全网MySQL路线笔记,啃完吃透保你涨薪5K
Java领域指导者
博客等级 码龄7年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值