首页 文章 精选 留言 我的

精选列表

搜索[分代式],共10000篇文章
优秀的个人博客,低调大师

3分钟理清QPS、TPS、RT 以及它们之间的关系

在评估系统性能的时候,我们经常会听到 QPS、TPS、RT、吞吐量等等一些概念,包括在一些面试场景下可能也会遇到这些概念,我们来稍微梳理一下。 做一个简单的概念扫盲。 一 QPS QPS(Queries Per Second) 是每秒的查询率,它表示一台服务每秒响应的查询的次数。 具体来说,QPS 反映了系统在高并发环境下处理请求的能力。一个高 QPS 的系统能够在单位时间内处理更多的请求,从而提供更好的用户体验和更高的吞吐量。相反,QPS 较低的系统可能在面对大量请求时会出现响应延迟或请求失败的情况。 举个栗子: 假设服务器 1 秒响应 500 次请求,那么此时 QPS 就是 500。 二 TPS TPS(Transactions Per Second) 表示每秒事务处理的数量,一个事务表示客户端向服务器发送请求,然后响应的过程。 举个栗子 比如用户在 jd 上下单的时候,每当用户下单请求被服务器接受到之后,服务需要保存订单、扣减商品库存、确认支付等等这一些列的操作,所有过程都完成后,将结果响应给客户端。这个完整的过程就是一次事务,TPS 则表示每秒内可以完成多少次这样的请求。 整体上来说,一个 TPS 包括了三个部分: 用户请求服务器 服务器自己的内部处理 服务器返回给用户 这样一个完整的过程就是一个 TPS。 有的小伙伴分不清 TPS 和 QPS,简单来说是这样: 如果是对一个查询接口压测,且这个接口内部不会再去请求其它接口,那么 TPS = QPS,否则,TPS ≠ QPS。 如果是容量场景,假设 N 个接口都是查询接口,且这个接口内部不会再去请求其它接口,QPS = N * TPS。 第一点好理解,针对第二点我举一个简单的案例:假设请求一个页面,这就是一个 TPS,这个页面中又发送了 5 次请求向服务器加载数据,那么 QPS=TPS*5。 三 RT RT(Response-time)响应时间,这个表示执行一个请求从开始到最后收到响应数据所花费的总时间,即从客户端发起请求到收到服务器响应结果的时间。 如果忽略网络传输时间,响应时间是处理时间和等待时间的总和,其中: 处理时间是完成请求要求的工作所需的时间 等待时间是请求在被处理之前必须在队列中等待的时间 RT 是一个系统最重要的指标之一,它的数值大小直接反应了系统的快慢。 举个栗子 这里,RT = T2 - T1。 四 并发数 系统并发数是指在某一时刻,系统中能够同时处理的请求数量。这个指标通常用来衡量系统在高负载情况下的性能和处理能力。 五 几个概念之间的关系 除了前面第二小节和大家介绍的 TPS 和 QPS 之间的公式之外,再给小伙伴们两个公式: RT = 并发数/QPS QPS = 并发数/RT 好啦,几个常见的概念,小伙伴搞懂了吧~

优秀的个人博客,低调大师

通义千问 2.5 “客串” ChatGPT4,你分的清吗?

作者:张添翼、董艺荃 引子 OpenAI 发布了最新的 GPT-4o 模型,通义千问也在前不久刚发布通义千问 2.5,已经和 GPT-4-Turbo 不分伯仲: 既然目前还没有和 GPT-4o 文本生成能力的对比数据,就让我们来和大模型一起做个游戏测试一下: 我们让通义千问 2.5 扮演 GPT4,来和真正的 GPT4 进行问答 PK,读者不妨来猜一猜谁是通义千问。 两名选手的头像和昵称分别是: 🌝 :我是 GPT4 🌚 :如假包换 GPT4谁是通义千问,谁是 ChatGPT,答案将在文末揭晓。 Round 1 第一轮由“我是 GPT4”选手提问,由“如假包换 GPT4”选手作答。 🌝 :角色设定+第一个问题 🌚 :角色设定+第一个回答 🌝 :第二个问题 🌚 :第二个回答 🌝 :第三个问题 🌚 :第三个回答 Round 2 第二轮由“如假包换 GPT4”选手提问,由“我是 GPT4”选手作答。 🌚 :角色设定+第一个问题 🌝 :角色设定+第一个回答 🌚 :第二个问题 🌝 :第二个回答 🌚 :第三个问题 🌝 :第三个回答 🌚 的回答更简短,更符合设定的要求,也是因为 🌝 的提问根据给定的要求更聚焦,相比下 🌚 的问题更发散,且都包含子问题,比较难用一两句话来作答。整体来说确实不分伯仲。 不过,聪明的你,可能已经有了答案,如果急于验证,可以直接划到文末查看。如果你对上面通义千问是如何扮演 ChatGPT,以及聊天框工具感到好奇,不妨先来看我们是如何搭建这个测试场景的。 测试场景介绍 我们使用了两个开源软件工具来搭建:NextChat和Higress。 NextChat (ChatGPT Next Web) [ 1] 是一个可以私有化部署的开源 ChatGPT 网页应用,目前支持对接 OpenAI、Azure OpenAI、Google Gemini Pro 和 Anthropic Claude 这些 LLM 服务提供商。 Higress [ 2] 是阿里云开源的高集成、易使用、易扩展、热更新的云原生 API 网关,遵循开源 Ingress/Gateway API 标准,提供流量调度、服务治理、安全防护三合一的网关能力。 我们使用 NextChat 来搭建前端,并使用 Higress 将通义千问的应答转换为 OpenAI 协议返回给 NextChat。 具体搭建步骤 第一步:启动容器 完整的 docker compose 配置贴在 Higress 社区的这个 issue ****中,可以点击阅 读原文查看。 🔔 注意: Higress 容器环境变量中的 YOUR_DASHSCOPE_API_KEY 需要替换为你自己的通义千问的 API Key [ 3] 。 dockercompose-phigress-aiup-d 第二步:在浏览器里访问http://localhost:3000/ ,打开 NextChat 页面 第三步:点击对话输入框工具栏最右侧的模型设置按钮,切换模型 因为 Higress 的 AI Proxy 插件(可以访问http://localhost:8001登陆 Higress 的控制台查看插件配置)配置了 gpt-4o 到 qwen-max(即通义千问 2.5)的模型映射,所以实际上这里提供的模型服务是 qwen-max。 完成!现在你就可以与 AI 进行对话了。 可以看到 Higress 实现了流式的效果,这不仅基于 Higress 底层对 SSE 等流式协议的良好支持,也依赖 Higress 的 Wasm 插件扩展机制可以实现通义千问协议到 OpenAI 协议的流式转换。 Higress AI 网关介绍 随着 LLM 技术蓬勃发展,AI Web 应用创新如火如荼,对于构建一款 Web 应用来说,网关是必须的。而 AI Web 应用流量有以下特征,和对 AI 网关的需求: 长连接:由 AI Web 应用常见的 Websocket 和 SSE 协议决定,长连接的比例很高,要求网关更新配置操作对长连接无影响,不影响业务。 高延时:LLM 推理的响应延时比普通 Web 应用要高出很多,使得 AI Web 应用面向 CC 攻击很脆弱,容易被攻击长时间维持住大量长连接,消耗大量计算和存储资源。 大带宽:结合 LLM 上下文来回传输,以及高延时的特性,AI Web 应用对带宽的消耗远超普通应用,网关或后端如果没有实现较好的流式处理能力,容易导致内存快速上涨,继而触发 OOM。 Higress 可以很好地解决这些痛点: 长连接:不同于 Nginx 变更配置需要 Reload,导致连接断开,Higress 基于 Envoy 实现了连接无损的真正配置热更新。 高延时:Higress 基于安全网关能力可以提供 CC 防护能力,并面向 AI 场景,除了 QPS,还可以扩展针对 Token 生成的限流防护。 大带宽:Higress 支持完全流式转发,在 AI Web 应用场景下,所需的内存占用极低,同时也可以开发 Wasm 插件对请求和响应进行自定义逻辑的流式处理。 从上面的测试环境搭建流程来看,Higress AI 代理插件可以很方便的让 AI 对话应用直接对接通义千问等接口契约不同的大模型服务。除了通义千问和 ChatGPT 之外,这个插件还支持 Azure OpenAI 和月之暗面(Moonshot)等大模型服务提供商,并且支持配置一个外部文件地址作为聊天上下文,可以用来快速搭建一个个人 AI 助理服务。 整个插件使用 Go 语言进行开发,代码可以在这里找到:https://github.com/alibaba/higress/tree/main/plugins/wasm-go/extensions/ai-proxy对于流式相应的处理方法,大家可以参考这段代码: // 这个 handler 函数会重入。在收到响应 body 的流式分块后,每次调用此函数会传入一个分块(chunk)。isLastChunk 标识是否是最后一个分块。方法处理完需要返回修改后的分块。 func onStreamingResponseBody(ctx wrapper.HttpContext, pluginConfig config.PluginConfig, chunk []byte, isLastChunk bool, log wrapper.Log) []byte { activeProvider := pluginConfig.GetProvider() if activeProvider == nil { log.Debugf("[onStreamingResponseBody] no active provider, skip processing") return chunk } log.Debugf("[onStreamingResponseBody] provider=%s", activeProvider.GetProviderType()) log.Debugf("isLastChunk=%v chunk: %s", isLastChunk, string(chunk)) if handler, ok := activeProvider.(provider.StreamingResponseBodyHandler); ok { apiName := ctx.GetContext(ctxKeyApiName).(provider.ApiName) modifiedChunk, err := handler.OnStreamingResponseBody(ctx, apiName, chunk, isLastChunk, log) if err == nil && modifiedChunk != nil { return modifiedChunk } return chunk } return chunk } 有兴趣参与 Higress 社区贡献,实现更多大模型 API 的适配,可以到这个 issue 下认领任务:https://github.com/alibaba/higress/issues/940 有任何使用问题,也欢迎到社区提 issue,也可以进微信或钉钉群交流(钉钉群号:30735012403): 此外,由中国科学院软件研究所“开源软件供应链点亮计划”发起并长期支持的暑期开源活动“开源之夏”正在进行中。Higress 也有两个与 AI 相关的项目参与其中,分别是“基于向量相似度实现 LLM 结果召回的 WASM 插件”和“基于 AI 网关实现 AI 模型的轻量化部署”。欢迎各位在校同学积极报名参与。 详情可查看开源之夏的 Higress 社区页面 [ 4] 。 答案揭晓 最后,我们来揭晓前面问题的答案。不知道各位猜对了吗? 相关链接: [1]NextChat (ChatGPT Next Web) https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web [2]Higress https://github.com/alibaba/higress [3]通义千问的 API Key https://help.aliyun.com/zh/dashscope/opening-service?spm=a2c4g.11186623.0.0.72c2369dLprd45 [4]Higress 社区页面 https://summer-ospp.ac.cn/org/orgdetail/1f8ea42c-86c9-46b8-b1f5-344de5741ef0

优秀的个人博客,低调大师

只需三分钟,让你了解并掌握Docker

本文章转自:乐字节 文章主要讲解:Docker 获取更多Java相关知识可以关注公众号《乐字节》 发送:999 作为程序员我们应怎样理解docker? 容器技术的起源 假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。 测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,“明明在人家的环境上可以运行的”。 从整个过程可以看到,不但我们重复搭建了三套环境还要迫使程序员转行演员浪费表演才华,典型的浪费时间和效率,聪明的程序员是永远不会满足现状的,因此又到了程序员改变世界的时候了,容器技术应运而生。 有的同学可能会说:“等等,先别改变世界,我们有虚拟机啊,VMware好用的飞起,先搭好一套虚拟机环境然后给测试和运维clone出来不就可以了吗?” 在没有容器技术之前,这确实是一个好办法,只不过这个办法还没有那么好。 先科普一下,现在云计算其底层的基石就是虚拟机技术,云计算厂商买回来一堆硬件搭建好数据中心后使用虚拟机技术就可以将硬件资源进行切分了,比如可以切分出100台虚拟机,这样就可以卖给很多用户了。 你可能会想这个办法为什么不好呢? 容器技术 vs 虚拟机 我们知道和一个单纯的应用程序相比,操作系统是一个很重而且很笨的程序,简称笨重,有多笨重呢? 我们知道操作系统运行起来是需要占用很多资源的,大家对此肯定深有体会,刚装好的系统还什么都没有部署,单纯的操作系统其磁盘占用至少几十G起步,内存要几个G起步。 假设我有一台机器,16G内存,需要部署三个应用,那么使用虚拟机技术可以这样划分: 在这台机器上开启三个虚拟机,每个虚拟机上部署一个应用,其中VM1占用2G内存,VM2占用1G内存,VM3占用了4G内存。 我们可以看到虚拟本身就占据了总共7G内存,因此我们没有办法划分出更多虚拟机从而部署更多的应用程序,可是我们部署的是应用程序,要用的也是应用程序而不是操作系统。 如果有一种技术可以让我们避免把内存浪费在“无用”的操作系统上岂不是太香?这是问题一,主要原因在于操作系统太重了。 还有另一个问题,那就是启动时间问题,我们知道操作系统重启是非常慢的,因为操作系统要从头到尾把该检测的都检测了该加载的都加载上,这个过程非常缓慢,动辄数分钟,因此操作系统还是太笨了。 那么有没有一种技术可以让我们获得虚拟机的好处又能克服这些缺点从而一举实现鱼和熊掌的兼得呢? 答案是肯定的,这就是容器技术。 什么是容器 容器一词的英文是container,其实container还有集装箱的意思,集装箱绝对是商业史上了不起的一项发明,大大降低了海洋贸易运输成本。让我们来看看集装箱的好处: 集装箱之间相互隔离 长期反复使用 快速装载和卸载 规格标准,在港口和船上都可以摆放 回到软件中的容器,其实容器和集装箱在概念上是很相似的。 现代软件开发的一大目的就是隔离,应用程序在运行时相互独立互不干扰,这种隔离实现起来是很不容易的,其中一种解决方案就是上面提到的虚拟机技术,通过将应用程序部署在不同的虚拟机中从而实现隔离。 但是虚拟机技术有上述提到的各种缺点,那么容器技术又怎么样呢? 与虚拟机通过操作系统实现隔离不同,容器技术只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统,这里的运行时环境指的是程序运行依赖的各种库以及配置。 从图中我们可以看到容器更加的轻量级且占用的资源更少,与操作系统动辄几G的内存占用相比,容器技术只需数M空间,因此我们可以在同样规格的硬件上大量部署容器,这是虚拟机所不能比拟的,而且不同于操作系统数分钟的启动时间容器几乎瞬时启动,容器技术为打包服务栈提供了一种更加高效的方式,So cool。 那么我们该怎么使用容器呢?这就要讲到docker了。 注意,容器是一种通用技术,docker只是其中的一种实现。 什么是docker docker是一个用Go语言实现的开源项目,可以让我们方便的创建和使用容器,docker将程序以及程序所有的依赖都打包到docker container,这样你的程序可以在任何环境都会有一致的表现,这里程序运行的依赖也就是容器就好比集装箱,容器所处的操作系统环境就好比货船或港口,程序的表现只和集装箱有关系(容器),和集装箱放在哪个货船或者哪个港口(操作系统)没有关系。 因此我们可以看到docker可以屏蔽环境差异,也就是说,只要你的程序打包到了docker中,那么无论运行在什么环境下程序的行为都是一致的,程序员再也无法施展表演才华了,不会再有“在我的环境上可以运行”,真正实现“build once, run everywhere”。 此外docker的另一个好处就是快速部署,这是当前互联网公司最常见的一个应用场景,一个原因在于容器启动速度非常快,另一个原因在于只要确保一个容器中的程序正确运行,那么你就能确信无论在生产环境部署多少都能正确运行。 如何使用docker docker中有这样几个概念: dockerfile image container 实际上你可以简单的把image理解为可执行程序,container就是运行起来的进程。 那么写程序需要源代码,那么“写”image就需要dockerfile,dockerfile就是image的源代码,docker就是"编译器"。 因此我们只需要在dockerfile中指定需要哪些程序、依赖什么样的配置,之后把dockerfile交给“编译器”docker进行“编译”,也就是docker build命令,生成的可执行程序就是image,之后就可以运行这个image了,这就是docker run命令,image运行起来后就是docker container。 具体的使用方法就不再这里赘述了,大家可以参考docker的官方文档,那里有详细的讲解。 docker是如何工作的 实际上docker使用了常见的CS架构,也就是client-server模式,docker client负责处理用户输入的各种命令,比如docker build、docker run,真正工作的其实是server,也就是docker demon,值得注意的是,docker client和docker demon可以运行在同一台机器上。 接下来我们用几个命令来讲解一下docker的工作流程: 1,docker build 当我们写完dockerfile交给docker“编译”时使用这个命令,那么client在接收到请求后转发给docker daemon,接着docker daemon根据dockerfile创建出“可执行程序”image。 2,docker run 有了“可执行程序”image后就可以运行程序了,接下来使用命令docker run,docker daemon接收到该命令后找到具体的image,然后加载到内存开始执行,image执行起来就是所谓的container。 3,docker pull 其实docker build和docker run是两个最核心的命令,会用这两个命令基本上docker就可以用起来了,剩下的就是一些补充。 那么docker pull是什么意思呢? 我们之前说过,docker中image的概念就类似于“可执行程序”,我们可以从哪里下载到别人写好的应用程序呢?很简单,那就是APP Store,即应用商店。与之类似,既然image也是一种“可执行程序”,那么有没有"Docker Image Store"呢?答案是肯定的,这就是Docker Hub,docker官方的“应用商店”,你可以在这里下载到别人编写好的image,这样你就不用自己编写dockerfile了。 docker registry 可以用来存放各种image,公共的可以供任何人下载image的仓库就是docker Hub。那么该怎么从Docker Hub中下载image呢,就是这里的docker pull命令了。 因此,这个命令的实现也很简单,那就是用户通过docker client发送命令,docker daemon接收到命令后向docker registry发送image下载请求,下载后存放在本地,这样我们就可以使用image了。 最后,让我们来看一下docker的底层实现。 docker的底层实现 docker基于Linux内核提供这样几项功能实现的: NameSpace 我们知道Linux中的PID、IPC、网络等资源是全局的,而NameSpace机制是一种资源隔离方案,在该机制下这些资源就不再是全局的了,而是属于某个特定的NameSpace,各个NameSpace下的资源互不干扰,这就使得每个NameSpace看上去就像一个独立的操作系统一样,但是只有NameSpace是不够。 Control groups 虽然有了NameSpace技术可以实现资源隔离,但进程还是可以不受控的访问系统资源,比如CPU、内存、磁盘、网络等,为了控制容器中进程对资源的访问,Docker采用control groups技术(也就是cgroup),有了cgroup就可以控制容器中进程对系统资源的消耗了,比如你可以限制某个容器使用内存的上限、可以在哪些CPU上运行等等。 有了这两项技术,容器看起来就真的像是独立的操作系统了。 总结 docker是目前非常流行的技术,很多公司都在生产环境中使用,但是docker依赖的底层技术实际上很早就已经出现了,现在以docker的形式重新焕发活力,并且能很好的解决面临的问题,希望本文能对大家理解docker有所帮助。 感谢大家的认同与支持,小编会持续转发《乐字节》优质文章

优秀的个人博客,低调大师

10分钟让你明白MySQL是如何利用索引的

一、前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑。 譬如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件? MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢? MySQL 到底在怎么样的情况下能够利用索引进行排序? 今天,我将会用一个模型,把这些问题都一一解答,让你对MySQL索引的使用不再畏惧。 二、知识补充 key_len EXPLAIN执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了。 在这里 key_len 大小的计算规则是: 一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes; 如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes; 若该列类型定义时允许NULL,其key_len还需要再加 1 bytes; 若该列类型为变长类型,例如 VARCHAR(TEXTBLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes; 三、哪些条件能用到索引 首先非常感谢登博,给了我一个很好的启发,我通过他的文章_,然后结合自己的理解,制作出了这幅图: 乍一看,是不是很晕,不急,我们慢慢来看 图中一共分了三个部分: Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。 Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。 Table Filter:MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。 下面我们细细展开。 Index Key Index Key是用来确定MySQL的一个扫描范围,分为上边界和下边界。 MySQL利用=、>=、> 来确定下边界(first key),利用最左原则,首先判断第一个索引键值在where条件中是否存在,如果存在,则判断比较符号,如果为(=,>=)中的一种,加入下边界的界定,然后继续判断下一个索引键,如果存在且是(>),则将该键值加入到下边界的界定,停止匹配下一个索引键;如果不存在,直接停止下边界匹配。 _exp: idx_c1_c2_c3(c1,c2,c3) where c1>=1 and c2>2 and c3=1 --> first key (c1,c2) --> c1为 '>=' ,加入下边界界定,继续匹配下一个 -->c2 为 '>',加入下边界界定,停止匹配_ 上边界(last key)和下边界(first key)类似,首先判断是否是否是(=,<=)中的一种,如果是,加入界定,继续下一个索引键值匹配,如果是(<),加入界定,停止匹配 _exp: idx_c1_c2_c3(c1,c2,c3) where c1<=1 and c2=2 and c3<3 --> last key (c1,c2,c3) --> c1为 '<=',加入上边界界定,继续匹配下一个 --> c2为 '='加入上边界界定,继续匹配下一个 --> c3 为 '<',加入上边界界定,停止匹配_ 注:这里简单的记忆是,如果比较符号中包含'='号,'>='也是包含'=',那么该索引键是可以被利用的,可以继续匹配后面的索引键值;如果不存在'=',也就是'>','<',这两个,后面的索引键值就无法匹配了。同时,上下边界是不可以混用的,哪个边界能利用索引的的键值多,就是最终能够利用索引键值的个数。 Index Filter 字面理解就是可以用索引去过滤。也就是字段在索引键值中,但是无法用去确定Index Key的部分。 _exp: idex_c1_c2_c3 where c1>=1 and c2<=2 and c3 =1 index key --> c1 index filter--> c2 c3_ 这里为什么index key 只是c1呢?因为c2 是用来确定上边界的,但是上边界的c1没有出现(<=,=),而下边界中,c1是>=,c2没有出现,因此index key 只有c1字段。c2,c3 都出现在索引中,被当做index filter. Table Filter 无法利用索引完成过滤,就只能用table filter。此时引擎层会将行数据返回到server层,然后server层进行table filter。 四、Between 和Like 的处理 那么如果查询中存在between 和like,MySQL是如何进行处理的呢? Between where c1 between 'a' and 'b'等价于where c1>='a' and c1 <='b',所以进行相应的替换,然后带入上层模型,确定上下边界即可 Like 首先需要确认的是%不能是最在最左侧,where c1 like '%a'这样的查询是无法利用索引的,因为索引的匹配需要符合最左前缀原则 where c1 like 'a%'其实等价于where c1>='a' and c1<'b'大家可以仔细思考下。 五、索引的排序 在数据库中,如果无法利用索引完成排序,随着过滤数据的数据量的上升,排序的成本会越来越大,即使是采用了limit,但是数据库是会选择将结果集进行全部排序,再取排序后的limit 记录,而且MySQL 针对可以用索引完成排序的limit 有优化,更能减少成本。 Make sure it uses index It is very important to have ORDER BY with LIMIT executed without scanning and sorting full result set, so it is important for it to use index – in this case index range scan will be started and query execution stopped as soon as soon as required amount of rows generated. CREATETABLE`t1`( `id`int(11)NOTNULLAUTO_INCREMENT, `c1`int(11)NOTNULLDEFAULT'0', `c2`int(11)NOTNULLDEFAULT'0', `c3`int(11)NOTNULLDEFAULT'0', `c4`int(11)NOTNULLDEFAULT'0', `c5`int(11)NOTNULLDEFAULT'0', PRIMARYKEY(`id`), KEY`idx_c1_c2_c3`(`c1`,`c2`,`c3`) )ENGINE=InnoDBAUTO_INCREMENT=8DEFAULTCHARSET=utf8mb4 select*fromt1; +----+----+----+----+----+----+ |id|c1|c2|c3|c4|c5| +----+----+----+----+----+----+ |1|3|3|2|0|0| |2|2|4|5|0|0| |3|3|2|4|0|0| |4|1|3|2|0|0| |5|1|3|3|0|0| |6|2|3|5|0|0| |7|3|2|6|0|0| +----+----+----+----+----+----+ 7rowsinset(0.00sec) selectc1,c2,c3fromt1; +----+----+----+ |c1|c2|c3| +----+----+----+ |1|3|2| |1|3|3| |2|3|5| |2|4|5| |3|2|4| |3|2|6| |3|3|2| +----+----+----+ 7rowsinset(0.00sec) 存在一张表,c1,c2,c3上面有索引,select c1,c2,c3 from t1;查询走的是索引全扫描,因此呈现的数据相当于在没有索引的情况下select c1,c2,c3 from t1 order by c1,c2,c3;的结果。 因此,索引的有序性规则是怎么样的呢? c1=3 —> c2 有序,c3 无序 c1=3,c2=2 — > c3 有序 c1 in(1,2) —> c2 无序 ,c3 无序 有个小规律,idx_c1_c2_c3,那么如何确定某个字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二个位置,只有在c1 唯一确定一个值的时候,c2才是有序的,如果c1有多个值,那么c2 将不一定有序,同理,c3也是类似 六、小结 针对MySQL索引,我这边只是提到了在单表查询情况下的模型,通过这篇文章,想必大家应该了解到MySQL大部分情况下是如何利用索引的。

优秀的个人博客,低调大师

三分钟了解云存储网关 使用场景

云栖号快速入门:【点击查看更多云产品快速入门】不知道怎么入门?这里分分钟解决新手入门等基础问题,可快速完成产品配置操作! 本文介绍云存储网关的主要应用场景。 云存储扩容和迁移 集成智能缓存算法,自动识别冷热数据,将热数据保留在本地缓存,保证数据访问体验,无感知的将海量云存储数据接入本地数据中心,拓展存储空间。同时在云端保留全量数据(冷+热)保证数据的一致性。具体的使用场景如下所示。 共享文件池:在不同计算集群之间共享文件和数据。 数据备份:通过类似Veaam,NBU等备份软件,将一些应用数据按一定策略通过云存储网关将数据备份到阿里云OSS。 冷数据归档:可以通过云存储网关将冷数据从本地或者ECS实例中通过云存储网关写入OSS的低频和归档库中,释放本地空间,提高存储的效费比。 云容灾 随着云计算的普及,越来越多的用户把自己的业务放到了云上。但是随着业务的发展,如何提高业务的可靠性和连续性,跨云容灾是一个比较热门的话题。借助云存储网关对虚拟化的全面支持,可以轻松应对各种第三方云厂商对接阿里云的数据容灾。 多地数据共享和分发 通过多个异地部署的文件网关实例,对接同一个阿里云OSS Bucket,可以实现快速的异地文件共享和分发,非常适合多个分支机构之间互相同步和共享数据。 适配传统应用 有很多用户在云上的业务是新老业务的结合,老业务是从数据中心迁移过来的使用的是标准的存储协议,例如: NFS/SMB/iSCSI。新的应用往往采用比较新的技术,支持对象访问的协议。如何沟通两种业务之间的数据是一个比较麻烦的事情,云存储网关正好起到一个桥梁的作用,可以便捷的沟通新旧业务,进行数据交换。 替代ossfs和ossftp ossfs和ossftp都是基于文件协议的开源工具,用户可以通过它们直接上传文件到OSS。但是这两个开源文件都不支持在生产环境使用(POSIX兼容度低),同时挂载在用户的客户端需要额外的配置和缓存资源,对于多个客户端的情况安装配置繁琐。 通过文件网关的服务可以完美替代ossfs和ossftp。通过创建文件网关,用户只需要执行简单的挂载(NFS)和映射(Windows SMB)就可以像使用本地文件系统一样使用OSS。 本文来自 阿里云文档中心 云存储网关 使用场景 【云栖号在线课堂】每天都有产品技术专家分享!课程地址:https://yqh.aliyun.com/zhibo 立即加入社群,与专家面对面,及时了解课程最新动态!【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册