实习生疑问:为什么要在需要排序的字段上加索引呢?

hello,大家好,我是张张,「架构精进之路」公号作者。

487c4dc19179d74bbd4d57b28522f9ea.jpeg

众所周知,为了避免全表扫描,条件句中增加了索引,性能上对比一目了然。

组内实习生同学不禁疑问:为什么要在排序的字段上添加索引呢?

排序有好多种算法来实现,在 MySQL 中经常会带上一个 limit,表示从排序后的结果集中取前 100 条,或者取第 n 条到第 m 条。

要实现排序,我们需要先根据查询条件获取结果集,然后在内存中对这个结果集进行排序,如果结果集数量特别大,还需要将结果集写入到多个文件里,然后单独对每个文件里的数据进行排序,然后在文件之间进行归并,排序完成后在进行 limit 操作。

没错,这个就是 MySQL 实现排序的方式,前提是排序的字段没有索引。

建表操作

CREATE TABLE `person` (`id` int(11) NOT NULL,`city` varchar(16) NOT NULL,`name` varchar(16) NOT NULL,`age` int(11) NOT NULL,`addr` varchar(128) DEFAULT NULL,PRIMARY KEY (`id`),KEY `city` (`city`)) ENGINE=InnoDB;

查询示例

select city,name,age from person where city='南京' order by name limit 100  ;

使用 explain 发现该语句会使用 city 索引,并且会有 filesort。 

2e9f46d3a2fc38842924724175f58130.jpeg

我们分析下该语句的执行流程:

  • 1.初始化 sortbuffer,用来存放结果集;

  • 2.找到 city 索引,定位到 city 等于南京的第一条记录,获取主键索引ID;

  • 3.根据 ID 去主键索引上找到对应记录,取出 city,name,age 字段放入 sortbuffer;

  • 4.在 city 索引取下一个 city 等于南京的记录的主键ID;

  • 5.重复上面的步骤,直到所有 city 等于南京的记录都放入 sortbuffer;

  • 6.对 sortbuffer 里的数据根据 name 做快速排序;

  • 7.根据排序结果取前面 1000 条返回。

这里是查询 city,name,age 3个字段,比较少,如果查询的字段较多,则多个列如果都放入 sortbuffer 将占有大量内存空间。另一个方案是只区出待排序的字段和主键放入 sortbuffer 这里是 name 和 id,排序完成后在根据 id 取出需要查询的字段返回,其实就是时间换取空间的做法,这里通过 max_length_for_sort_data 参数控制,是否采用后面的方案进行排序。

另外如果 sortbuffer 里的条数很多,同样会占有大量的内存空间,可以通过参数 sort_buffer_size 来控制是否需要借助文件进行排序,这里会把 sortbuffer 里的数据放入多个文件里,用归并排序的思路最终输出一个大的文件。

关于sortbuffer,官方文档:dev.mysql.com/doc/refman/…

3b77912ec894797f67023e8822b365bd.jpeg

以上方案主要是 name 字段没有加上索引,如果 name 字段上有索引,由于索引在构建的时候已经是有序的了,所以就不需要进行额外的排序流程只需要在查询的时候查出指定的条数就可以了,这将大大提升查询速度。我们现在加一个 city 和 name 的联合索引。

alter table person add index city_user(city, name);

使用 explain 发现该语句会使用 city_user 索引,并且没有了 filesort。

9456b3b549d100e95315e8586f559edf.jpeg

这样查询过程如下:

  • 1.根据 city,name 联合索引定位到 city 等于武汉的第一条记录,获取主键索引ID

  • 2.根据 ID 去主键索引上找到对应记录,取出 city,name,age 字段作为结果集返回

  • 3.继续重复以上步骤直到 city 不等于武汉,或者条数大于 1000

由于联合所以在构建索引的时候,在 city 等于武汉的索引节点中的数据已经是根据 name 进行排序了的,所以这里只需要直接查询就可,另外这里如果加上 city, name, age 的联合索引,则可以用到索引覆盖,不行到主键索引上进行回表。

其实,Order By有两种排序方法:

  • Backward index scan:使用索引扫描。索引本身就是有序的,所以不需要再次进行排序 

  • using filessort:在内存中排序,占用CPU资源。如果查询结果太大还会产生临时文件,到磁盘中进行排序,这时候会进行大量IO操作性能较差 

其实这个SQL是分三步来执行的: 

  •  where得到数据;

  • 排序处理数据首先看执行计划是不是用到索引,如果用到了就可以直接获得索引的顺序,从而避免再次排序,如果没用到就做排序(using filessort);

  • 返回数据。

总结

最后,简单总结一下:

  • Order By语句跟WHERE语句中都用了索引字段,Order By中的索引才会生效

  • Order By中使用索引可避免重新排序导致CPU资源浪费

我们在有排序操作的时候,最好能够让排序字段上建有索引,另外由于查询第一百万条开始的一百条记录,需要过滤掉前面一百万条记录,即使用到索引也很慢,所以可以根据 ID 来进行区分,分页遍历的时候每次缓存上一次查询结果最后一条记录的 id , 下一次查询加上 id > xxxx limit 0,1000 这样可以避免前期扫描到的结果被过滤掉的情况。


 

1. 还傻傻分不清MySQL回表查询与索引覆盖?

2. 一文看懂:近期不断 “狂飙” 的 ChatGPT
3. 代码多版改造,应用责任链设计模式
4. 电商并发减库存设计,如何做到不超卖

关注公众号,免费领学习资料

如果您觉得还不错,欢迎关注和转发~     

6c8a46bbcce324ebc9946ce46f890efa.png

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

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

相关文章

面向Java开发者的ChatGPT提示词工程(7)

在如今信息爆炸的时代,我们面临着海量的文字信息,很难抽出足够的时间去阅读所有感兴趣的内容。然而,大语言模型为我们提供了一种有效的解决方案:通过自动文本摘要,帮助我们快速获取文章的核心内容。这种技术已经被广泛…

400页PPT,讲清ChatGPT前世今生与1200+个AI工具大全

点击上方“Python与机器智能”,选择“星标”公众号 第一时间获取价值内容 一:目前网络上最全的免费公开 ChatGPT 资料,作者是香港中文大学博士,目前是南京航空航天大学教授。分享是在济南山东人工智能协会 (SDAAI) 邀请的有关大型…

三菱系统解锁 z65超过使用期限解除

三菱系统【⒈7⒈548⒊⒊762】◀◀◀◀電➤➤➤ChatGPT火热势头不减,[各行各业的用户都在使用它来尝试能否代替业务原始工作内容。AI将会取代某些职业的言论也是层出不穷。有的人观望,有的人恐慌,有的人不在乎,有的人已经开始研究出…

下一代的新操作系统就是ChatGPT!

什么是CHatgpt? ChatGPT是人工智能研究实验室OpenAI在2022年11月30日推出的聊天机器人模型,它使用Transformer神经网络架构,训练数据来自包括维基百科,以及真实对话在内的庞大语料库。2023年1月30日消息称,中国搜索巨…

464页PPT!南航李丕绩教授的《ChatGPT的前世今生》

今天分享南京航空航天大学——李丕绩教授做的464页PPT《ChatGPT的前世今生》。从人工智能发展史,AI十年回顾,自然语言处理,ChatGPT诞生,模型分析,大模型应用,ChatGPT 可以做什么,以及未来发展等…

活动报名丨ChatGPT的鲁棒性探究:对抗性和分布外泛化的视角

2023年3月2日(星期四)14:00-15:00,智源社区主办的「智源LIVE 第32期线上分享活动:由香港城市大学数据科学学院博士生胡曦煦和微软亚洲互联网工程院应用科学家侯汶昕,共同讲解《ChatGPT的鲁棒性探究——对抗性和分布外泛…

【哈士奇赠书活动 - 29期】- 〖人工智能与ChatGPT〗

文章目录 ⭐️ 赠书 - 《人工智能与ChatGPT》⭐️ 内容简介⭐️ 作者简介⭐️ 编辑推荐⭐️ 赠书活动 → 获奖名单 ⭐️ 赠书 - 《人工智能与ChatGPT》 ⭐️ 内容简介 人们相信人工智能可以为这个时代的技术带来突破,而ChatGPT则使这种希望成为现实。现在&#xff0…

ChatGPT的前世今生(400多页的ppt)

南京航空航天大学的李丕绩做的400多页的ppt。从向量空间模型讲起,从语言模型讲起,从rnn讲起。如果需要补课,是很好的一份材料。AI 相关的知识内容,免费的质量高于付费,建议大家不要花冤枉钱。 原始ppt比较大&#xff0…

ChatGPT前世今生,当下最系统全面人工智能介绍

好东西!南京航空航天大学李丕绩做的400多页的PPT—— ChatGPT的前世今生:从AI这十年发展回顾说起,聊到如今大火的 ChatGPT、Stable Diffusion、Midjourney(源起),从自然语言处理到语言模型、神经网络、机器…

律师使用ChatGPT 进行法律文献检索提交了错误信息;李开复表示,威力强大的大模型将彻底变革人工智能

🚀 一名律师使用ChatGPT 进行法律文献检索提交了错误信息 近日,一名律师在法庭案件中使用聊天机器人 ChatGPT 进行法律文献检索,结果提交了错误信息, 揭示了人工智能在法律领域的潜在风险,包括误传错误信息。 该事件…

律师用ChatGPT打官司,结果被骗引用不存在案例。

DoNews5月29日消息,近日,一名美国律师在一起法庭案件中,依赖聊天机器人 ChatGPT 进行法律文献检索(legal research),导致提交了错误的信息。这一事件揭示了人工智能在法律领域的潜在风险,包括误…

Stable Diffusion被起诉!结果人类律师水平拉胯,网友:还不如ChatGPT帮他写

羿阁 发自 凹非寺量子位 | 公众号 QbitAI 对绘画AI不满已久的艺术家们,终于动真格了! 这次,艺术家们联合对Stability Al、DeviantArt和Midjourney发起集体诉讼,指控其训练数据侵害了广大艺术家的版权。 消息传出后可以说一石激起千…

Python藏头诗在线生成器:适合表白的藏头诗情话,想不成功都难~

导语 我寻竹马旅尘埃,喜见梅花独自开。 欢得东风无限好,你似故人有缘来。 ——顾木子吖 你看懂了嘛?💨💨 哈喽大家好,我是木木子,上一期的唐诗宋词元曲鉴赏中华古诗词之美已经发出来给大家品…

藏头诗(c语言)

藏头诗 题目答案 题目 答案 #include<stdio.h> #include<string.h> #include<math.h> int main() {char str[4][50],temp[10];int i,j0;for(i0;i<4;i){gets(str[i]);temp[j]str[i][0];temp[j]str[i][1];}temp[j]\0;puts(temp); }

藏头诗生成接口

藏头诗&#xff0c;藏头&#xff0c;藏尾&#xff0c;七言&#xff0c;五言 一、接口介绍 想写情书文采不够怎么办,藏头诗生帮助你一键生成。通过输入关键字如人名、地名、公司名等&#xff0c;来生成藏头、藏尾、五言、七言诗句。生成时可&#xff0c;选择选词优先、押韵优先…

用C语言写藏头诗或藏尾诗

#include<stdio.h> #include<string.h> main() { char p[16]; char s[4][20]; int i,len,a; printf("藏头诗(1)或者藏尾诗(2)&#xff1f;"); scanf("%d",&a); if(a1) { for(i0;i<4;i) scanf("%s",s[i]); lenstrlen(s[0]); …

AI大集合,人工智能的百家争鸣。

好久不见&#xff0c;亲爱的忠实fans&#xff01;小编因工作原因隐身了一段时间&#xff0c;已算是人生一段修炼历程吧&#xff01;花开两朵&#xff0c;各表一枝。回到今晚的theme-AI大集合&#xff0c;人工智能的百家争鸣时期。继国外ChatGPT诞生之后&#xff0c;特别是GPT4大…

专访图灵人工智能研究院CEO李强:未来合规与数据安全将是国产AI大模型行业应用核心竞争力...

金句集锦 1 毫不夸张的说&#xff0c;在未来&#xff0c;谁在合规方面做的最好&#xff0c;谁就最具有核心竞争力。 2 ChatGPT的诞生无疑为人工智能发展史上添上了浓墨重彩的一笔&#xff0c;它的出现让“人工智能是第四次工业革命”的论断变成了无人可以否认的愿景。 3 由于大…

港联证券|万亿级AIGC赛道或迎有序监管

近段时间&#xff0c;连续有国内外科技巨子涌入万亿级AIGC&#xff08;生成式AI&#xff09;赛道&#xff0c;A股商场上AIGC、ChatGPT等人工智能相关概念也是继续火热。但与此同时&#xff0c;安全隐患也如冰山一角逐渐露出。多国政府正在考虑加强对其监管&#xff0c;AIGC在全…

清华大学发布《2023年GPT赋能通信行业应用白皮书》(132页)

加gzh 回复“gpt” 获取《2023年AIGC(GPT-4)赋能通信行业应用白皮书》完整版 摘要&#xff1a;在ChatGPT/GPT-4席卷全球的热潮中&#xff0c;人们已经深刻认识到人工智能作为经济社会发展中一项变革性技术与关键性力量&#xff0c;将为全球产业带来的巨大飞跃和突破式发展&a…