【深入解析】揭秘MySQL索引底层逻辑,带你掌握干货满满的核心知识

从0到1:数据库工程师必知的SQL优化全攻略 数据库性能优化的世界里,SQL调优是每个开发者必须掌握的核心技能。你是否遇到过这样的场景:一条简单的查询语句执行时间长达数秒,甚至导致系统崩溃?又或者,面对千万级数据表时,索引设计不当让查询效率直线下降?本文将你深入SQL调优的底层逻辑,从索引策略的制定到查询优化案例的实战解析,结合Explain工具的深度使用,揭秘如何让SQL查询效率提升10倍以上的实战技巧。无论你是数据库新手还是资深工程师,这篇干货满满的文章都将为你打开性能优化的新世界! 阅读详情

一、什么是索引

在mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可,索引是帮助Mysql高效获取数据且以排好序的数据结构,直观的说,索引就类似书的目录页,没有目录(即索引)我们就要一页一页的找,有了目录(索引)我们就可以按照目录中标记的页数去相应的页数去查找。

二、为什么要用索引

ff213f4d85517c4f4d6c1a17760e1130.jpeg

例如,我们通过查询语句查询一条记录:select * from table where Col2 = 85,如果没有索引的话,那么它将从第一行[1,35]开始找,一行一行的找,直到找到[6,85]这条数据,并且数据存放的位置也不规则,拿取一行记录就需要与磁盘进行一次交互,即IO读取,如果数据多,这种效率将会很低下,只要把这种交互次数控制在一定范围之内,那他的效率将会比一行行查找要高很多,如给col2加索引,来执行select * from table where Col2 = 85,通过二叉树接口,第一次我们查到的是35,85比35大,所以查找右子节点,查到85,与条件种的85为一条数据,所以,这里就只需要两次交互就可以查到。所以索引就诞生了。

d411c3cd8c188879381d08d4c8fbf6ef.jpeg


三、索引的数据结构

1、二叉树

1.1、二叉树的特点:

  1、每个节点最多有两个子树,所以二叉树不存在度大于2的节点(结点的度:结点拥有的 子树的数目。),可以没有子树或者一个子树。
  2.左子树和右子树有顺序,次序不能任意颠倒。
  3、二叉树支持动态的插⼊和查找,保证操作在O(height)时间,这就是完成了哈希表不便完成的⼯作,动态性。但是⼆叉树有可能出现worst-case,如果             输⼊序列已经排序,则时间复杂度为O(N)。为什么不用二叉树来作为索引,就是因为二叉树的worst-case,如果输入序列是排好序的,那么二叉树的结构就会变成如下图所示的特殊状态:

68d5804da67b8c8056fe2a868dc20ba8.jpeg


所以二叉书并不适合去做索引,遇到这种极端情况,就会导致有索引和无索引效果一样。

2、平衡二叉树

AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1;AVL树查找、插入和删除在平均和最坏情况下都是O(lgn)。AVL实现平衡的关键在于旋转操作:插入和删除可能破坏二叉树的平衡,此时需要通过一次或多次树旋转来重新平衡这个树。当插入数据时,最多只需要1次旋转(单旋转或双旋转);但是当删除数据时,会导致树失衡,AVL需要维护从被删除节点到根节点这条路径上所有节点的平衡,旋转的量级为O(lgn)。由于旋转的耗时,AVL树在删除数据时效率很低;在删除操作较多时,维护平衡所需的代价可能高于其带来的好处,因此AVL实际使用并不广泛。

3、红黑树

与AVL树相比,红黑树并不追求严格的平衡,而是大致的平衡:只是确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。从实现来看,红黑树最大的特点是每个节点都属于两种颜色(红色或黑色)之一,且节点颜色的划分需要满足特定的规则。在java8中的HashMap就是使用链表+红黑树。红黑树的缺点就是太高了,如下图所示:

1ecfc4c973e6a9188870aefc0ada6e91.jpeg


当数据量特别大的时候,树的高度很高,假设你要查找的节点为当前树的叶子节点,那么要查找这个节点,至少要循环h(这棵树的高度)次,所以说,红黑树在这种情况下也并不适用。


4、B-Tree

Tree就是我们常说的B树,它是一种多路搜索树而非二叉树,使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度

在B树中,每个节点包含:

1、本结点所含关键字的个数;

2、指向父节点的指针

3、关键字

4、指向子节点的指针

对于一棵m阶B-tree,每个结点至多可以拥有m个子结点。各结点的关键字和可以拥有的子结点数都有限制,规定m阶B-tree中,根结点至少有2个子结点,除非根结点为叶子节点,相应的,根结点中关键字的个数为1~m-1;非根结点至少有[m/2]([],向上取整)个子结点,相应的,关键字个数为[m/2]-1~m-1。

B-tree有以下特性:

1、关键字集合分布在整棵树中;

2、任何一个关键字出现且只出现在一个结点中; 所有索引元素不重复

3、搜索有可能在非叶子结点结束;

4、其搜索性能等价于在关键字全集内做一次二分查找;

5、自动层次控制;

6、所有叶节点都在同一层,每个节点最多有m-1个key,并且以升序排列

叶节点具有相同的深度,叶节点的指针为空

由于限制了除根结点以外的非叶子结点,至少含有M/2个儿子,确保了结点的至少利用率,其最低搜索性能为:

其中,M为设定的非叶子结点最多子树个数,N为关键字总数;

所以B-树的性能总是等价于二分查找(与M值无关),也就没有B树平衡的问题;

由于M/2的限制,在插入结点时,如果结点已满,需要将结点分裂为两个各占M/2的结点;删除结点时,需将两个不足M/2的兄弟结点合并。

96f2889eedb35a2e9ee388a081f09519.jpeg


B树的查询:

B树是二叉排序树的扩展,二叉排序树是二路查找,B-树是多路查找。因为B-树节点内的关键字是有序的,在节点内查找的时候除了顺序查找之外,还可以用折半查找提高效率,B-树的具体查找步骤可以参照折半查找方法。

以查找42为例:

首先获取关键点的关键字进行比较,当前根节点关键字为30,42>30,所以找右子节点,拿到关键字39,45,39<42<45,所以直接找到39和45的中间的节点,拿到40,42,44,因为42=42,所以直接返回关键字和指针信息(如果树结构中没有包含所要查找的节点则返回null)


5、B+Tree(B-Tree变种)

B+树是一种树数据结构,通常用于数据库和操作系统的文件系统中。B+树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。B+树元素自底向上插入,这与二叉树恰好相反。

B+树的

非叶子节点不存储data,只存储索引(冗余),可以放更多的索引,只有叶子节点才存储数据

叶子节点包含所有索引字段

叶子节点增加了一个指向相邻子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成一个有序链表的结构,提高区间访问的性能。

79bbc98a20a7a88ce8d811a8c2790ab7.jpeg


与B树相比它的不同体现在:

(1).如果非叶子节点包含n个关键码,则这个节点有n个子树。

(2).非叶子节点仅包含关键码信息,叶子节点包含关键码以及含有这个关键码的记录的指针。所以查找时,B+树必须到达叶子节点才会命中。

(3).叶子节点包含有兄弟叶子节点的指针,而且叶子节点的关键码值是有序的,有利于遍历。

(4).所有的非叶子节点可看成是索引部分(稀疏索引)

为什么说B+树比B树更适合实际应用中作为操作系统的文件索引和数据库索引

(1)B+树的磁盘读写代价更低

非叶子节点包含的信息更少,如果把同一节点的所有信息放在一个磁盘块中,则可以比B树放入更多的关键码。一次读入内存当中(读一个块)就能读入更多的关键码,所以降低了磁盘I/O总数。

(2)查询效率更加稳定

对任何关键字的查找都必须从根节点走到叶子节点,路径长度相同,所以对每条数据的查询效率相当,在存储相等的关键字上,B+树树的高度会更低。

(3)B树在提高磁盘I/O性能的同时并没有解决元素遍历效率低下的问题。而B+树因为叶子节点有链指针存在,所以遍历叶子节点即可以实现对整棵树的遍历。而在数据库中基于范围的查询是非常频繁的,B+树就能更好的支持。

四、存储引擎索引实现

数据存储引擎是形容数据库表层面的,而不是形容数据库的,我们点击表设计,在选项中证实这一问题。

085269c69dc048d6d3f9260735a3274b.jpeg

1、MyISAM存储引擎索引实现

MYISAM基于ISAM存储引擎,并对其进行扩展。它是在web、数据仓储和其他应用环境下最常用的存储引擎之一。MYISAM拥有较高的插入、查询速度,但不支持事务和外键。所以对事务完整性没有要求或者以SELECT、INSERT为主的应用基本上都可以使用这个引擎来创建表。 数据文件和索引文件可以放置在不同的目录,平均分布 IO,获得更快的速度。要指定索引文件和数据文件的路径,需要在创建表的时候通过 DATA DIRECTORY 和 INDEX DIRECTORY 语句指定,也就是说不同 MyISAM 表的索引文件和数据文件可以放置到不同的路径下。文件路径需要是绝对路径,并且具有访问权限。

MYISAM存储引擎的索引

1)MyISAM默认使用B+Tree索引,只把索引载入内存,存储的是数据的索引

2)MyISAM数据库中的数据是按照插入的顺序保存,在每个索引节点中保存对应的数据行的地址,理论上说主键索引和其他索引是一样的。

3)MYISAM的索引文件和数据文件是分离的(非聚集)

d512539909d260e3002c14035f97405d.jpegbcfee4343b8b3fe3326560eb9ac9ae5a.jpeg

MYD文件存的是表的数据

MYI文件存的是表的索引

frm文件存的是表的结构

2、INNODB存储索引实现

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MYISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。但是由于其其他方面的优势,在5.5版本之后,MYSQL的默认引擎变成了InnoDB.

2.1InnoDB索引实现(聚集)

InnoDB表只有一个聚集索引

表数据文件本身就是按B+Tree组织的一个索引结构文件,聚集索引-叶子节点包含了完整的数据记录

b4c265b3cbd70f9d6b577b0980867f05.jpeg

InnoDB存储引擎存储数据库数据,一共有两个文件

frm文件:表的结构

ibd文件: 数据和索引存储文件。数据以主键进行聚集存储,把真正的数据保存到叶子节点中

5598e2aaf968e44c4ed7052677ad8899.jpeg


接下来我们能也从几个问题当中去了解InnoDB索引引擎

1、为什么建议InnoDB表最好建主键?

因为在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的Key是数据库的主键,因此InnoDB表数据文件本身就是主索引。综上所述,InnoDB数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MYISAM可以没有,因为数据和索引是分开的),如果没有指定,那么Mysql系统会自动选择一个所有元素均不相等的列作为主键,如果不存在这种列,则Mysql自动为InnoDB表生成一个隐含字段作为主键,这个字段长度未6个字节,类型为长整型。

2、为什么推荐使用整型的自增主键?

因为B+Tree再找数据的时候会去比较大小,整型数值比大小要相对简单和快速,且索引节点占的内存会更小。再有就是主键id是非自增的,这个时候就会导致页分裂,也会导致B+树节点分裂。

什么是页分裂:

首先来一张数据页的图

ca2d6172bf3af25e325db81176923282.jpeg

上面就是数据也的结构了,两个数据页之间会有指针指向上一个和下一个数据页,形成一个双向链表,(也就是InnoDB中B+Tree的叶子节点)在数据页中存储的就是一行行数据了,每个数据行之间会有单向指针连接,组成一个单向链表,假设你不停的往表里插数据,那么刚开始就会在一个数据页里面插入数据,比如说我们在左侧的数据页中插入数据,先插入主键id为1,3,5的数据,数据越来越多,我们就要搞另外一个数据页,这个数据页里面我们就插入了主键id为2,4,6的数据,关键点来了,当我们使用索引的时候,最基本的条件就是后面数据页中的数据行主键值要都大于前一个数据页中数据行的主键值,所以,当我们发现后一个主键id要小于前一页的主键id值,我们就要进行数据挪动,从而满足索引的基本要求,这个过程就是页分裂如下图所示:

c380669d49812d1a83d40def2a45ad8a.jpeg

1)为了索引更快找到数据所以进行页分裂有以下几个作用:

读操作:对索引来说,其实就是通过平衡二叉树不断减少要筛选的数据,而主键值就是筛选的标准,以尽快定位到我们需要的数据。

写操作:在平衡二叉树中,假设插入的数据的主键是自增长的,那么根据二叉树算法会很快的把该数据添加到某个节点下,而其他节点不用动;但是如果插入的是不规则的数据,那么每次插入都会改变二叉树之前的数据状态。从而导致了页分裂。直白一点来讲就是为了更快的找到需要的数据。

那么从B+树的角度来看也可以看出,当插入非自增的数据时,B+树也会进行分裂,详情如下个动图所示:

02c2cd4257424c332e8a5b52aa04f766.jpeg

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

64aa553b3dfea77f373766b674994e6a.jpeg

我们用col3这个列建索引,注意:InnoDB表只有一个聚集索引

04edc73391da18b30dfd204d972bd5f3.jpeg

为了节省存储空间,为了保证数据的一致性,减少他的复杂度,减少了出现行移动或者数据页分裂时二级索引的维护工作(当数据需要更新的时候,二级索引不需要修改,只需要修改聚簇索引,一个表只能有一个聚簇索引,其他的都是二级索引,这样只需要修改聚簇索引就可以了,不需要重新构建二级索引)否则,你就需要在每个索引文件中进行数据更新。

五、联合索引的底层存储结构

d2fa892e3c329103b417e53beaae1102.jpeg

然后我们建立联合索引

alter table user add index idx_name_age (name,age)


ec69eebff549280d75d32bf4e68901a8.jpeg

索引是帮助MySQL高效获取数据的排好序的数据结构,联合索引想当然的就是已经排好序的B+树结构,我们这里使用了一个三个字段的联合索引,那么他是如何存储的呢?带着这个问题我们一起取了解一下联合索引的存储结构。

1、索引最左前缀原理

通常我们在建立联合索引的时候,也就是多个字段建立索引,mysql都会让我们选择索引的顺序,比如我们想在a,b,c三个字段建立一个联合索引,我们可以选择自己想要的优先级,a、b、c,或者是b、a、c 或者是c、a、b等顺序。为什么数据库会让我们选择字段的顺序呢?不都是三个字段的联合索引么?这里就引出了数据库索引的最左前缀原理。

mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先,如:

如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引,当然在红黑树中,也是排好序来维护此索引;

a3a61e2f8efc48e8591994e2bc2026b7.jpeg

如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;

4e10c8e6e2f26b053b689f66dffcb840.jpegselect * from table where c = '1'

这个sql语句是不会走index1索引的,

select * from table where b =‘1’ and c ='2'

这个语句也不会走index1索引。

比如:索引index1:(a,b,c)有三个字段,我们在使用sql语句来查询的时候,会发现很多情况下不按照我们想象的来走索引。

什么语句会走index1索引呢?

答案是:

select * from table where a = '1'select * from table where a = '1' and b = ‘2’select * from table where a = '1' and b = ‘2’ and c='3'

我们可以发现一个共同点,就是所有走索引index1的sql语句的查询条件里面都带有a字段,那么问题来了,index1的索引的最左边的列字段是a,是不是查询条件中包含a就会走索引呢?

select * from table where a = '1' and c= ‘2’

这个sql语句呢?

这也是最左前缀原理的一部分,索引index1:(a,b,c),只会走a、a,b、a,b,c 三种类型的查询,其实这里说的有一点问题,a,c也走,但是只走a字段索引,不会走c字段。我们可以发现一个共同点,就是所有走索引index1的sql语句的查询条件里面都带有a字段,那么问题来了,index1的索引的最左边的列字段是a,是不是查询条件中包含a就会走索引呢?

那么这是为什么呢?

e5d219714062753eeec89d4fd12586ed.jpeg

如上图所示,我们给(name,age,id)三列建联合索引,你们可以发现,在name相等的情况下(篮框部分),age字段(红框部分)的数据是有序的,但是放在整张表中看去,age字段(红框部分)的数据是乱序,何为索引?索引是帮助MySQL高效获取数据的排好序的数据结构,而age字段放在整张表中已经是乱序,已经不符合索引的原理,例如我想找到age为12的数据,如果是排好序的,我就在找到他以后就不需要再继续往下找了,因为后面的都是比我大的,但是在乱序的情况下,我就需要全表扫描进行寻找,有索引和无索引效果一样的,所以

select * from table where a = '1'select * from table where a = '1' and b = ‘2’select * from table where a = '1' and b = ‘2’ and c='3'

只有上述三句会走联合索引,三个字段以此类推...

附:

1、回表:

通过非主键索引查询数据时,会先查找到主键索引,然后再到主键索引上去查找对应的数据,这个过程叫做回表

2、联合索引和覆盖索引

联合索引:指索引中包含多个列

覆盖索引:指的是从索引中可以得到所有想要查询的列

比如

select id,age from user where name = ‘a’ and age = 12

联合索引是说的是where后面的部分,即查询条件;覆盖索引是说的select后面的部分,即查询列。
假设我们有id(主键),age,adderss,name这四个字段,且age,name两列为联合索引的两个列

select id,age from user where name = ‘a’ and age = 12。

这是覆盖索引,因为不会回表查询。

因为联合索引的叶子节点就包括联合索引中包含的列(age,name)还有主键(id),所以不需要回表。

select id,address from user where name = ‘a’ and age = 12

这不是覆盖索引,因为会回表查询。address并不存在于联合索引的叶子节点之中,所以需要根据主键值进行回表查询

CSDN技术博客标题Emoji使用指南:124个可用表情与SEO优化实践 在技术博客写作中,Unicode字符的兼容性与渲染一致性是影响前端显示效果的基础问题。Emoji作为Unicode字符集的一部分,其在不同平台和字体环境下的支持程度存在差异,这直接关系到内容的可读性与用户体验。从技术原理上看,平台渲染引擎、字体支持策略和编码传输流程共同决定了Emoji的最终显示效果,这体现了前端工程中兼容性处理的重要性。对于技术社区的内容创作者而言,合理使用Emoji不仅能提升标题的视觉吸引力,还能增强信息传达的效率,是优化内容呈现的实用技巧。本文基于对CSDN平台的实证测试,筛选出124 阅读详情

相关推荐

VScode - 从入门到精通:高效开发环境搭建指南

本文是一份全面的VSCode高效开发环境搭建指南。从选择理由、安装配置、核心插件推荐到个性化设置与高效技巧,详细讲解了如何将这款轻量级编辑器武装成强大的开发工具。重点介绍了GitLens、Prettier、Live Server等必备插件,以及通过用户设置、代码片段和快捷键打造专属高效工作流的方法,帮助开发者从入门到精通。

weixin_27734811的博客 406

mysql 多列索引实例_分享一个MySQL多列索引优化实例代码

由于爬虫抓取的数据不断增多,这两天在不断对数据库以及查询语句进行优化,其中一个表结构如下:CREATE TABLE `newspaper_article` (`id` varchar(50) NOT NULL COMMENT '编号',`title` varchar(190) NOT NULL COMMENT '标题',`author` varchar(255) DEFAULT NULL COMM...

weixin_36111194的博客 184

STM32CubeIDE(CUBE-MX hal库)----RTC时钟断电保持与时间校准实战

本文详细介绍了在STM32CubeIDE中使用CUBE-MX和HAL库实现RTC时钟断电保持与时间校准的实战方法。通过硬件配置、后备寄存器(BKP)操作及软件校准策略,确保嵌入式设备在断电后仍能保持准确时间,适用于智能电表、环境监测等物联网应用场景。

weixin_29189373的博客 191

Mysql (3) 一条sqlMysql中是如何执行的以及bin-log日志对数据库数据备份和数据恢复

Mysql (3) 一条sqlMysql中是如何执行的以及bin-log日志对数据库数据备份和数据恢复MySQL的内部组件结构Server层连接器、查询缓存、分析器、优化器、执行器bin-log归档 MySQL的内部组件结构 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数 (如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存

weixin_43691942的博客 757

索引的原理

官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点的说,数据库索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引数据结构。

leshen_88的博客 960

数据库索引详解:原理 · 类型 · 使用 · 优化

索引本质上是一棵数据结构(如 B+ 树、哈希表等),它维护了表中一列或多列列值与对应数据行存储位置的映射关系。类似于书籍的目录,通过目录可以快速定位到目标章节页码;索引则让数据库引擎能更快地定位到目标行,避免全表扫描。索引是提升数据库查询性能的核心策略,但同时也来额外的写入开销和维护成本。唯有深刻理解索引原理、合理选择索引类型,并通过监控与重构不断优化,才能在性能和资源利用之间取得最佳平衡。

fans2306的博客 1900

一文搞懂mysql索引底层逻辑干货满满!

mysql中,索引是一种特殊的数据库结构,由数据表中的一列或多列组合而成,可以用来快速查询数据表中有某一特定值的记录。通过索引,查询数据时不用读完记录的所有信息,而只是查询索引列即可,索引是帮助Mysql高效获取数据且以排好序的数据结构,直观的说,索引就类似书的目录页,没有目录(即索引)我们就要一页一页的找,有了目录(索引)我们就可以按照目录中标记的页数去相应的页数去查找。

m0_73088370的博客 1140

MySQL索引原理深度解析与优化策略实战

简单来说,索引就像一本书的目录。想象你在查一本500页的技术书,想找“数据库优化”那章,没有目录你得从头翻到尾,累不说还慢。但有了目录,你一眼就能看到它在第300页,直接翻过去就行了。MySQL中的索引也是这个道理:它是一个特殊的数据结构,帮助数据库快速定位数据,减少全表扫描的行数,从而提升查询效率。正式定义:索引是存储引擎用于快速查找记录的一种数据结构,通常基于字段值构建,能显著降低查询的时间复杂度。它的核心作用是:把随机查找变成有序查找。

java_beautiful的博客 795

MySQLSQL 优化全攻略:从原理到实战

今天来跟大家好好聊聊 MySQLSQL 优化~不管是开发还是运维,写得一手高效的 SQL 都是必备技能,毕竟谁也不想让系统卡成 PPT 对吧😂 这篇文章会从 MySQL底层逻辑讲到实际优化技巧,全是干货,赶紧码住!

HENANwuyanzu66的博客 1484

3天,把MySQL索引、锁、事务、分库分表撸干净了!

最近项目增加,缺人手,面试不少,但匹配的人少的可怜。跟其他组的面试官聊,他也抱怨了一番,说候选人有点儿花拳绣腿,回答问题不落地,拿面试最常问的MySQL来说,并不只是懂“增删改查”、表关联...

程序猿DD 474

MySQL高性能:索引、锁、事务、分库分表如何撑起亿级数据

最近项目增加,缺人手,面试不少,但匹配的人少的可怜。跟其他组的面试官聊,他也抱怨了一番,说候选人有点儿花拳绣腿,回答问题不落地,拿面试最常问的MySQL来说,并不只是懂“增删改查”、表关联...

Java笔记虾 556

3天,我把 MySQL 索引、锁、事务、分库分表撸干净了!

前两天看到字节一个老哥写的帖子,提到高阶开发者必须掌握的技能,其中他明确提出了“精通MySQL”。为啥MySQL对开发人员如此重要?第一,不管你去面试哪家公司,数据库是必问项,而MySQ...

公众号:Java后端 292

MySQL太细碎了,我硬生生捋出了一条核心大主线!

前两天看到字节一个老哥写的帖子,提到高阶开发者必须掌握的技能,其中他明确提出了“精通MySQL”。为啥MySQL对开发人员如此重要?第一,不管你去面试哪家公司,数据库是必问项,而MySQ...

方志朋的博客 129

阿里二面一问MySQL就开始野了,抓着底层原理不撒手啊!

最近项目增加,缺人手,面试不少,但匹配的人少的可怜。跟其他组的面试官聊,他也抱怨了一番,说候选人有点儿花拳绣腿,回答问题不落地,拿面试最常问的MySQL来说,并不只是懂“增删改查”、表关联...

磊哥聊Java 435

2024年最全单靠MySQL进了字节,高端玩法才是王道!,程序员如何在工作中自我增值

关于面试刷题也是有方法可言的,建议最好是按照专题来进行,然后由基础到高级,由浅入深来,效果会更好。Java基础部分算法与编程数据库部分流行的框架与新技术(Spring+SpringCloud+SpringCloudAlibaba)这份面试文档当然不止这些内容,实际上像JVM、设计模式、ZK、MQ、数据结构等其他部分的面试内容均有涉及,因为文章篇幅,就不全部在这里阐述了。

2401_84691713的博客 601

AI大模型实战系列(四):向量数据库架构揭秘与 Chroma 本地实战

摘要 本文介绍了向量数据库在AI大模型实战中的关键作用,重点解析了传统数据库无法高效处理向量检索的原因,以及向量数据库通过ANN算法实现毫秒级查询的底层原理。文章对比了Pinecone、Milvus、Faiss和Chroma等主流向量数据库的优缺点,并推荐轻量级的Chroma作为中小型项目的首选。最后通过代码示例演示了Chroma的本地实战操作,包括数据持久化、集合创建、向量入库及混合过滤检索,为构建高效RAG系统提供了实用指南。

欢迎来到“不会代码IT男”的频道!这里不拼代码,只拼对AI大模型的深度认知。博客专注高质量原创干货,深耕提示词工程(Prompt)、大模型安全攻防与RAG检索增强生成技术。用通俗语言破除技术神话,带你直击AI底层逻辑,轻松构建自己的AI护城 433

maven项目的pom文件里根标签project标签上直接报红、报错 的问题解决

摘要:本文分享了一个Maven项目配置问题的解决方案:当pom.xml文件报红时,发现是IDEA中Maven仓库路径包含特殊字符"."导致。建议配置Maven时避免使用中文、空格和点等特殊字符目录名。文章还列出了作者过往的技术文章主题,涵盖哈希算法、IO模型、多线程、MySQL索引Java核心技术,致力于用大白话讲解复杂技术概念。作者倡导原创分享,欢迎读者互动支持。

曹举的个人博客 461

高效筛选编程教学视频:四大维度与实战方法论

在信息过载的时代,如何从海量编程教程中精准筛选出高质量内容,是提升学习效率的关键。本文从工程化思维、知识密度、真实演示和结构化叙事四大核心维度出发,构建了一套可复用的视频筛选方法论。通过剖析底层原理透视、现代前端工程化实战、算法通识与特定技术栈深度集成等典型视频风格,帮助开发者建立自己的优质学习路径。掌握这套方法,不仅能有效避开‘标题党’和‘碎片化’陷阱,更能将被动接收转化为主动构建知识体系,最终在技术学习中实现从‘信息过载’到‘精准提效’的转变。

weixin_33806914的博客 549

智能安全帽解决方案.docx

。。。

上一篇: Intellij IDEA高效编码小贴士,让你的代码更优雅、易读
下一篇: 【深入剖析】为何Elasticsearch选择倒排索引而非B树索引?探索背后的差异与优势
手把手教你学Java
博客等级 码龄6年 2559粉丝 · 475原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值