聊聊索引失效的10种场景,太坑了

前言

今天我接着上一期数据库的话题,更进一步聊聊索引的相关问题,因为索引是大家都比较关心的公共话题,确实有很多坑。

不知道你在实际工作中,有没有遇到过下面的这两种情况:

  • 明明在某个字段上加了索引,但实际上并没有生效。

  • 索引有时候生效了,有时候没有生效。

今天就跟大家一起聊聊,mysql数据库索引失效的10种场景,给曾经踩过坑,或者即将要踩坑的朋友们一个参考。5b9763a2bac854413735b197ab99f021.png

1. 准备工作

所谓空口无凭,如果我直接把索引失效的这些场景丢出来,可能没有任何说服力。

所以,我决定建表和造数据,给大家一步步演示效果,尽量做到有理有据。

我相信,如果大家耐心的看完这篇文章,一定会有很多收获的。

1.1 创建user表

创建一张user表,表中包含:idcodeagenameheight字段。

CREATE TABLE `user` (`id` int NOT NULL AUTO_INCREMENT,`code` varchar(20) COLLATE utf8mb4_bin DEFAULT NULL,`age` int DEFAULT '0',`name` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,`height` int DEFAULT '0',`address` varchar(30) COLLATE utf8mb4_bin DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_code_age_name` (`code`,`age`,`name`),KEY `idx_height` (`height`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

此外,还创建了三个索引:

  • id:数据库的主键

  • idx_code_age_name:由code、age和name三个字段组成的联合索引。

  • idx_height:普通索引

1.2 插入数据

为了方便给大家做演示,我特意向user表中插入了3条数据:

INSERT INTO sue.user (id, code, age, name, height) VALUES (1, '101', 21, '周星驰', 175,'香港');
INSERT INTO sue.user (id, code, age, name, height) VALUES (2, '102', 18, '周杰伦', 173,'台湾');
INSERT INTO sue.user (id, code, age, name, height) VALUES (3, '103', 23, '苏三', 174,'成都');

周星驰和周杰伦是我偶像,在这里自恋了一次,把他们和我放到一起了。哈哈哈。

1.3 查看数据库版本

为了防止以后出现不必要的误会,在这里有必要查一下当前数据库的版本。不说版本就直接给结论,是耍流氓,哈哈哈。

select version();

查出当前的mysql版本号为:8.0.21

1.4 查看执行计划

在mysql中,如果你想查看某条sql语句是否使用了索引,或者已建好的索引是否失效,可以通过explain关键字,查看该sql语句的执行计划,来判断索引使用情况。

例如:

explain select * from user where id=1;

执行结果:47d697e207d61ba688be54d509d10d42.png从图中可以看出,由于id字段是主键,该sql语句用到了主键索引

当然,如果你想更深入的了解explain关键字的用法,可以看看我的另一篇文章《explain | 索引优化的这把绝世好剑,你真的会用吗?》,里面更为详细的介绍。

2. 不满足最左匹配原则

之前我已经给code、age和name这3个字段建好联合索引:idx_code_age_name。

该索引字段的顺序是:

  • code

  • age

  • name

如果在使用联合索引时,没注意最左前缀原则,很有可能导致索引失效喔,不信我们一起往下看。

2.1 哪些情况索引有效?

先看看哪些情况下,能走索引。

explain select * from user
where code='101';
explain select * from user
where code='101' and age=21
explain select * from user
where code='101' and age=21 and name='周星驰';

执行结果:d875390179a02929e5e04ad4797a723f.png上面三种情况,sql都能正常走索引。

其实还有一种比较特殊的场景:

explain select * from user
where code = '101'  and name='周星驰';

执行结果:88af5d60c6e2384559ca213aef9d144a.png查询条件原本的顺序是:code、age、name,但这里只有code和name中间断层了,掉了age字段,这种情况也能走code字段上的索引。

看到这里,不知道聪明的你,有没有发现这样一个规律:这4条sql中都有code字段,它是索引字段中的第一个字段,也就是最左边的字段。只要有这个字段在,该sql已经就能走索引。

这就是我们所说的最左匹配原则

2.2 哪些情况索引失效?

前面我已经介绍过,建立了联合索引后,在查询条件中有哪些情况索引是有效的。

接下来,我们重点看看哪些情况下索引会失效。

explain select * from user
where age=21;
explain select * from user
where name='周星驰';
explain select * from user
where age=21 and name='周星驰';

执行结果:1e70a4a235dc30d4f74a3f9ed9c17745.png从图中看出这3种情况下索引确实失效了。

说明以上3种情况不满足最左匹配原则,说白了是因为查询条件中,没有包含给定字段最左边的索引字段,即字段code。

3. 使用了select *

在《阿里巴巴开发手册》中明确说过,查询sql中禁止使用select *

那么,你知道为什么吗?

废话不多说,按照国际惯例先上一条sql:

explain 
select * from user where name='苏三';

执行结果:2c6bf678fe24e44cceae72c78b4354ad.png在该sql中用了select *,从执行结果看,走了全表扫描,没有用到任何索引,查询效率是非常低的。

如果查询的时候,只查我们真正需要的列,而不查所有列,结果会怎么样?

非常快速的将上面的sql改成只查了code和name列,太easy了:

explain 
select code,name from user 
where name='苏三';

执行结果:9c93e2d9544552de6c2aec6ee51ddb7a.png从图中执行结果不难看出,该sql语句这次走了全索引扫描,比全表扫描效率更高。

其实这里用到了:覆盖索引

如果select语句中的查询列,都是索引列,那么这些列被称为覆盖索引。这种情况下,查询的相关字段都能走索引,索引查询效率相对来说更高一些。

而使用select *查询所有列的数据,大概率会查询非索引列的数据,非索引列不会走索引,查询效率非常低。

4. 索引列上有计算

介绍本章节内容前,先跟大家一起回顾一下,根据id查询数据的sql语句:

explain select * from user where id=1;

执行结果:e3478bcce3d5589fa8f113c56a32ebd4.png从图中可以看出,由于id字段是主键,该sql语句用到了主键索引

但如果id列上面有计算,比如:

explain select * from user where id+1=2;

执行结果:96c54903aa6614f3bd4e2603f9585d9e.png从上图中的执行结果,能够非常清楚的看出,该id字段的主键索引,在有计算的情况下失效了。

5. 索引列用了函数

有时候我们在某条sql语句的查询条件中,需要使用函数,比如:截取某个字段的长度。

假如现在有个需求:想查出所有身高是17开头的人,如果sql语句写成这样:

explain select * from user  where height=17;

该sql语句确实用到了普通索引:b94f8cfc4c044fddc492a342b77deca4.png但该sql语句肯定是有问题的,因为它只能查出身高正好等于17的,但对于174这种情况,它没办法查出来。

为了满足上面的要求,我们需要把sql语句稍稍改造了一下:

explain select * from user  where SUBSTR(height,1,2)=17;

这时需要用到SUBSTR函数,用它截取了height字段的前面两位字符,从第一个字符开始。

执行结果:ab2e27196c42e038891d861216df13db.png你有没有发现,在使用该函数之后,该sql语句竟然走了全表扫描,索引失效了。

6. 字段类型不同

在sql语句中因为字段类型不同,而导致索引失效的问题,很容易遇到,可能是我们日常工作中最容易忽略的问题。

到底怎么回事呢?

请大家注意观察一下t_user表中的code字段,它是varchar字符类型的。

在sql语句中查询数据时,查询条件我们可以写成这样:

explain 
select * from user where code="101";

执行结果:6610e4e455f26d23469a3a8ce10570b7.png从上图中看到,该code字段走了索引。

温馨提醒一下,查询字符字段时,用双引号和单引号'都可以。

但如果你在写sql时,不小心把引号弄掉了,把sql语句变成了:

explain 
select * from user where code=101;

执行结果:78d1c7d2990d2fea4819c59d32e970f0.png你会惊奇的发现,该sql语句竟然变成了全表扫描。因为少写了引号,这种小小的失误,竟然让code字段上的索引失效了。

这时你心里可能有一万个为什么,其中有一个肯定是:为什么索引会失效呢?

答:因为code字段的类型是varchar,而传参的类型是int,两种类型不同。

此外,还有一个有趣的现象,如果int类型的height字段,在查询时加了引号条件,却还可以走索引:

explain select * from user 
where height='175';

执行结果:8afb2dea7edb33bf280951c57aa33600.png从图中看出该sql语句确实走了索引。int类型的参数,不管在查询时加没加引号,都能走索引。

这是变魔术吗?这不科学呀。

答:mysql发现如果是int类型字段作为查询条件时,它会自动将该字段的传参进行隐式转换,把字符串转换成int类型。

mysql会把上面列子中的字符串175,转换成数字175,所以仍然能走索引。

接下来,看一个更有趣的sql语句:

select 1 + '1';

它的执行结果是2,还是11呢?

好吧,不卖关子了,直接公布答案执行结果是2。

mysql自动把字符串1,转换成了int类型的1,然后变成了:1+1=2。

但如果你确实想拼接字符串该怎么办?

答:可以使用concat关键字。

具体拼接sql如下:

select concat(1,'1');

接下来,关键问题来了:为什么字符串类型的字段,传入了int类型的参数时索引会失效呢?

答:根据mysql官网上解释,字符串'1'、' 1 '、'1a'都能转换成int类型的1,也就是说可能会出现多个字符串,对应一个int类型参数的情况。那么,mysql怎么知道该把int类型的1转换成哪种字符串,用哪个索引快速查值?

感兴趣的小伙伴可以再看看官方文档:https://dev.mysql.com/doc/refman/8.0/en/type-conversion.html

7. like左边包含%

模糊查询,在我们日常的工作中,使用频率还是比较高的。

比如现在有个需求:想查询姓李的同学有哪些?

使用like语句可以很快的实现:

select * from user where name like '李%';

但如果like用的不好,就可能会出现性能问题,因为有时候它的索引会失效。

不信,我们一起往下看。

目前like查询主要有三种情况:

  • like '%a'

  • like 'a%'

  • like '%a%'

假如现在有个需求:想查出所有code是10开头的用户。

这个需求太简单了吧,sql语句如下:

explain select * from user
where code like '10%';

执行结果:7ea85eff690d1dba50cae951387c0702.png图中看出这种%10右边时走了索引。

而如果把需求改了:想出现出所有code是1结尾的用户。

查询sql语句改为:

explain select * from user
where code like '%1';

执行结果:2a4085de7208a256d5e10276e27acb86.png从图中看出这种%1左边时,code字段上索引失效了,该sql变成了全表扫描。

此外,如果出现以下sql:

explain select * from user
where code like '%1%';

该sql语句的索引也会失效。

下面用一句话总结一下规律:当like语句中的%,出现在查询条件的右边时,索引会失效。

那么,为什么会出现这种现象呢?

答:其实很好理解,索引就像字典中的目录。一般目录是按字母或者拼音从小到大,从左到右排序,是有顺序的。

我们在查目录时,通常会先从左边第一个字母进行匹对,如果相同,再匹对左边第二个字母,如果再相同匹对其他的字母,以此类推。

通过这种方式我们能快速锁定一个具体的目录,或者缩小目录的范围。

但如果你硬要跟目录的设计反着来,先从字典目录右边匹配第一个字母,这画面你可以自行脑补一下,你眼中可能只剩下绝望了,哈哈。

8. 列对比

上面的内容都是常规需求,接下来,来点不一样的。

假如我们现在有这样一个需求:过滤出表中某两列值相同的记录。比如user表中id字段和height字段,查询出这两个字段中值相同的记录。

这个需求很简单,sql可以这样写:

explain select * from user 
where id=height

执行结果:36f1a2b8b1341ba084253bce224c6b5a.png意不意外,惊不惊喜?索引失效了。

为什么会出现这种结果?

id字段本身是有主键索引的,同时height字段也建了普通索引的,并且两个字段都是int类型,类型是一样的。

但如果把两个单独建了索引的列,用来做列对比时索引会失效。

感兴趣的朋友可以找我私聊。

9. 使用or关键字

我们平时在写查询sql时,使用or关键字的场景非常多,但如果你稍不注意,就可能让已有的索引失效。

不信一起往下面看。

某天你遇到这样一个需求:想查一下id=1或者height=175的用户。

你三下五除二就把sql写好了:

explain select * from user 
where id=1 or height='175';

执行结果:56ac57b11ff9f925341b36fc3b0e762d.png没错,这次确实走了索引,恭喜被你蒙对了,因为刚好id和height字段都建了索引。

但接下来的一个夜黑风高的晚上,需求改了:除了前面的查询条件之后,还想加一个address='成都'。

这还不简单,sql走起:

explain select * from user 
where id=1 or height='175' or address='成都';

执行结果:fedbed94e68f0876f5a29fd86a431017.png结果悲剧了,之前的索引都失效了。

你可能一脸懵逼,为什么?我做了什么?

答:因为你最后加的address字段没有加索引,从而导致其他字段的索引都失效了。

注意:如果使用了or关键字,那么它前面和后面的字段都要加索引,不然所有的索引都会失效,这是一个大坑。

10. not in和not exists

在我们日常工作中用得也比较多的,还有范围查询,常见的有:

  • in

  • exists

  • not in

  • not exists

  • between and

今天重点聊聊前面四种。

10.1 in关键字

假如我们想查出height在某些范围之内的用户,这时sql语句可以这样写:

explain select * from user
where height in (173,174,175,176);

执行结果:4d4499796735aae4213eefdb283a90d5.png从图中可以看出,sql语句中用in关键字是走了索引的。

10.2 exists关键字

有时候使用in关键字时性能不好,这时就能用exists关键字优化sql了,该关键字能达到in关键字相同的效果:

explain select * from user  t1
where  exists (select 1 from user t2 where t2.height=173 and t1.id=t2.id)

执行结果:5cd734ffb96abe5683ec4e2533c8a6a5.png从图中可以看出,用exists关键字同样走了索引。

10.3 not in关键字

上面演示的两个例子是正向的范围,即在某些范围之内。

那么反向的范围,即不在某些范围之内,能走索引不?

话不多说,先看看使用not in的情况:

explain select * from user
where height not in (173,174,175,176);

执行结果:31886c6e08874b1abb53d1d5193d7c01.png你没看错,索引失效了。

看如果现在需求改了:想查一下id不等于1、2、3的用户有哪些,这时sql语句可以改成这样:

explain select * from user
where id  not in (173,174,175,176);

执行结果:ee5a396da74b498485a6065c73c2d47e.png你可能会惊奇的发现,主键字段中使用not in关键字查询数据范围,任然可以走索引。而普通索引字段使用了not in关键字查询数据范围,索引会失效。

10.4 not exists关键字

除此之外,如果sql语句中使用not exists时,索引也会失效。具体sql语句如下:

explain select * from user  t1
where  not exists (select 1 from user t2 where t2.height=173 and t1.id=t2.id)

执行结果:76a7bb332f5d672245785c0bb6e4b78f.png从图中看出sql语句中使用not exists关键后,t1表走了全表扫描,并没有走索引。

11. order by的坑

在sql语句中,对查询结果进行排序是非常常见的需求,一般情况下我们用关键字:order by就能搞定。

但我始终觉得order by挺难用的,它跟where或者limit关键字有很多千丝万缕的联系,一不小心就会出问题。

Let go

11.1 哪些情况走索引?

首先当然要温柔一点,一起看看order by的哪些情况可以走索引。

我之前说过,在code、age和name这3个字段上,已经建了联合索引:idx_code_age_name。

11.1.1 满足最左匹配原则

order by后面的条件,也要遵循联合索引的最左匹配原则。具体有以下sql:

explain select * from user
order by code limit 100;explain select * from user
order by code,age limit 100;explain select * from user
order by code,age,name limit 100;

执行结果:956030b5cf20402442cdae169b2d713b.png从图中看出这3条sql都能够正常走索引。

除了遵循最左匹配原则之外,有个非常关键的地方是,后面还是加了limit关键字,如果不加它索引会失效。

11.1.2 配合where一起使用

order by还能配合where一起遵循最左匹配原则。

explain select * from user
where code='101'
order by age;

执行结果:4ae6b49783bbb8c7e7a56f40d8a7ff49.pngcode是联合索引的第一个字段,在where中使用了,而age是联合索引的第二个字段,在order by中接着使用。

假如中间断层了,sql语句变成这样,执行结果会是什么呢?

explain select * from user
where code='101'
order by name;

执行结果:6f136b5c713d5f1bb87adaa019026d14.png虽说name是联合索引的第三个字段,但根据最左匹配原则,该sql语句依然能走索引,因为最左边的第一个字段code,在where中使用了。只不过order by的时候,排序效率比较低,需要走一次filesort排序罢了。

11.1.3 相同的排序

order by后面如果包含了联合索引的多个排序字段,只要它们的排序规律是相同的(要么同时升序,要么同时降序),也可以走索引。

具体sql如下:

explain select * from user
order by code desc,age desc limit 100;

执行结果:0cf9edfb4e61b8a6276498ba2eba3be2.png该示例中order by后面的code和age字段都用了降序,所以依然走了索引。

11.1.4 两者都有

如果某个联合索引字段,在where和order by中都有,结果会怎么样?

explain select * from user
where code='101'
order by code, name;

执行结果:96659c91d1a703d5851cfdedc139dd9c.pngcode字段在where和order by中都有,对于这种情况,从图中的结果看出,还是能走了索引的。

11.2 哪些情况不走索引?

前面介绍的都是正面的用法,是为了让大家更容易接受下面反面的用法。

好了,接下来,重点聊聊order by的哪些情况下不走索引?

11.2.1 没加where或limit

如果order by语句中没有加where或limit关键字,该sql语句将不会走索引。

explain select * from user
order by code, name;

执行结果:4df3c96a6633d3934db0af24eaccdb59.png从图中看出索引真的失效了。

11.2.2 对不同的索引做order by

前面介绍的基本都是联合索引,这一个索引的情况。但如果对多个索引进行order by,结果会怎么样呢?

explain select * from user
order by code, height limit 100;

执行结果:f1561478ebbc21a8bb6d19e10eae944d.png从图中看出索引也失效了。

11.2.3 不满足最左匹配原则

前面已经介绍过,order by如果满足最左匹配原则,还是会走索引。下面看看,不满足最左匹配原则的情况:

explain select * from user
order by name limit 100;

执行结果:3d1ab743cda830af01586696c9f01b88.pngname字段是联合索引的第三个字段,从图中看出如果order by不满足最左匹配原则,确实不会走索引。

11.2.4 不同的排序

前面已经介绍过,如果order by后面有一个联合索引的多个字段,它们具有相同排序规则,那么会走索引。

但如果它们有不同的排序规则呢?

explain select * from user
order by code asc,age desc limit 100;

执行结果:e368ef7b5c3b76c67ad33ebb4a406952.png从图中看出,尽管order by后面的code和age字段遵循了最左匹配原则,但由于一个字段是用的升序,另一个字段用的降序,最终会导致索引失效。

好了今天分享的内容就先到这里,我们下期再见。

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

f2c5b64e267203319ca42f7d7188f008.gif

往期推荐

a92a0887d60b908d5cce9401b0fd02ed.png

保姆级教程,终于搞懂脏读、幻读和不可重复读了!(经典回顾)


3da8a87ee34a29c117ee94589ad21d2c.png

查询MySQL字段注释的 5 种方法!


a767dcada296623da432f76a75a49bf4.png

面试官:this和super有什么区别?this能调用到父类吗?


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的main方法

2019独角兽企业重金招聘Python工程师标准>>> 在一个Java应用程序中,通常程序的入口是一个main方法,它被声明为公有静态方法,参数是一个字符串数组,返回值为Void类型。这个方法有许多值得研究的地方,今天就来…

约瑟夫环问题(C++)

问题描述 首先,说明一下这个问题是研究生期间c课的综合作业,本来有好多选择但最后还是选择了约瑟夫环问题。下面是约瑟夫环的问题描述以及设计要求: 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人&…

实战!工作中常用到哪些设计模式

前言 大家好,我是捡田螺的小男孩。平时我们写代码呢,多数情况都是流水线式写代码,基本就可以实现业务逻辑了。如何在写代码中找到乐趣呢,我觉得,最好的方式就是:使用设计模式优化自己的业务代码。今天跟大家…

什么是bcd码数据传输通讯_传输障碍| 数据通讯

什么是bcd码数据传输通讯传输障碍 (Transmission Impairment) In the data communication system, analog and digital signals go through the transmission medium. Transmission media are not ideal. There are some imperfections in transmission mediums. So, the signa…

Spring boot项目(问答网站)之timeline的推拉两种模式

Timeline介绍 所谓timeline就是当用户打开主页看到的随着时间轴发生的一系列时间的整合,主要包含: 关注用户的最新动态热门推荐广告推荐整合等等. 推、拉模式 推模式: 当一个用户关注了或者评论了一个问题或用户,触发事件&…

Bean放入Spring容器,你知道几种方式?

作者:三尺微命 一介书生来源:blog.csdn.net/weixin_43741092/article/details/120176466我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢&#xff…

Spring boot项目(问答网站)之Python学习基础篇

简介 当问答网站基本框架搭建完毕之后需要一些初始的数据来进行填充,因此选用Python爬虫的方式,从网上截取一些资料信息(当然是自己做项目使用,非商用)放入到项目网站上面。这篇主要是关于Python基础知识的学习笔记。…

Spring Boot Admin,贼好使!

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Spring Boot Admin(SBA)是一个开源的社区项目,用于管理和监控 Spring Boot 应用程序。应…

JAVA基础之容器基础内容

Java Collections框架 Java Collections框架中包含了大量的集合接口以及这些接口的实现类和操作它们的方法,具体包含了Set(集合)、List(列表)、Map(键值对)、Queue(队列)、Stack(栈)等,其中List、Set、Queue、Stack都继承了Collection接口。…

更快的Maven构建工具mvnd和Gradle哪个性能更好?

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)Maven 作为经典的项目构建工具相信很多人已经用很久了,但如果体验过 Gradle,那感觉只有两个字“真香…

SpringBoot + ShardingSphere 秒级分库分表!

Spring Boot 作为主流微服务框架,拥有成熟的社区生态。市场应用广泛,为了方便大家,整理了一个基于spring boot的常用中间件快速集成入门系列手册,涉及RPC、缓存、消息队列、分库分表、注册中心、分布式配置等常用开源组件&#xf…

git reset, git checkout, git revert 区别 (译)

博客原文地址: http://blog.mexiqq.com/index.php/archives/3/题记:团队中大多数成员使用 sourceTree 和 github 两款 git 工具,然而大家对于图形化工具提供的 reset,checkout,revert 功能点并不是很了解,甚至于混淆,然后凭借猜测去使用。功夫…

Redis笔记之基本数据结构 动态字符串SDS

简单动态字符串 传统上的C语言的字符串表示是以空字符结尾的字符数组(C字符串),redis自己实现一个动态字符串(SDS),两者之间的区别以及使用SDS的好处有: 结构不同。C字符串以空字符结尾的字符…

扯一把 Spring 的三种注入方式,到底哪种注入方式最佳?

1. 实例的注入方式首先来看看 Spring 中的实例该如何注入,总结起来,无非三种:属性注入set 方法注入构造方法注入我们分别来看下。1.1 属性注入属性注入是大家最为常见也是使用最多的一种注入方式了,代码如下:Service p…

Redis笔记之基本数据结构 链表

链表 链表具有空间存储不连续,增删节点快的优点,因此redis在列表键、发布与订阅、慢查询、监视器等使用了链表作为底层实现。由于C语言中没有内置的链表实现,因此redis自己进行了实现。 双向链表。每个listtNode都有perv和next指针&#x…

SpringCloud组件:Ribbon负载均衡策略及执行原理!

大家好,我是磊哥。今天我们来看下微服务中非常重要的一个组件:Ribbon。它作为负载均衡器在分布式网络中扮演着非常重要的角色。本篇主要内容如下:在介绍 Ribbon 之前,不得不说下负载均衡这个比较偏僻的名词。为什么说它偏僻了&…

Redis笔记之基本数据结构 字典

字典 符号表、关联数组或者映射,有点类似于java中的map,用于保存键值对key-value。字典中的键key是独一无二的。底层实现为哈希表。下面进行简述: 哈希表。哈希表主要包含table数组、size、sizemask以及used。table用于保存哈希表节点&…

【零基础学习iOS开发】【02-C语言】02-第一个C语言程序

本文目录 前言一、编写第一个C语言程序-Hello World二、编译程序三、链接程序四、运行程序五、总结六、学习建议七、clang指令汇总回到顶部前言 前面已经唠叨了这么多理论知识,从这讲开始,就要通过接触代码来学习C语言的语法。学习任何一门语言&#xff…

安卓平板体验Java开发,还能白嫖一年阿里无影云,真香!(内含白嫖方法,人人可领)...

作者 | 磊哥来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)阿里无影云早有耳闻,前两天看朋友发体验照片,可能是程序员天生爱折腾的特性又发挥作用了&#xff0c…

你知道group by的工作原理和优化思路吗?

前言 日常开发中,我们经常会使用到group by。亲爱的小伙伴,你是否知道group by的工作原理呢?group by和having有什么区别呢?group by的优化思路是怎样的呢?使用group by有哪些需要注意的问题呢?本文将跟大家…