摘要:此篇文章分别从sql执行过程、执行计划、索引数据结构、索引查询提速原理、聚焦索引、左前缀优化原则、自增主键索引这些角度谈一谈我们对数据库优化的理解。
本文分享自华为云社区《工程应用中数据库性能优化经验小结》,作者: 叶工 。
现阶段交付的算法产品,绝大多数涉及到数据库的使用。它承载的内容包括:用户权限管理、数据集信息、异步推论的结果、个性化配置等等。
在OCR场景下,数据集体量通常较大(一个数据集几十万张图片),而数据库往往部署在客户共享数据库中(同时运行大量其他业务),甚至只能和算法镜像共享同一台服务器,因此在后台研发中尤其要关心数据库性能瓶颈。
此篇文章分别从 sql执行过程、执行计划、索引数据结构、索引查询提速原理、聚焦索引、左前缀优化原则、自增主键索引这些角度谈一谈我们对数据库优化的理解。
1. 线上环境可以通过连接池进行慢SQL拦截,并发出告警通知
2. 测试阶段,因为使用预编译语句或ORM框架,无法获取完整SQL时可以使用数据库日志方式获取
set global general_log=on; show variables where Variable_name="general_log_file";
分析器:分析SQL,需要使用哪些表,使用哪些条件(知道要干什么)
优化器: 对各种执行过程做性能评估,挑选代价最小的执行过程,代价只是优化器认为的,不一定正确 (怎么样做最快)
执行器:调用引擎接口,返回数据,引擎是插件式,类似编程时多态,在创建表时可以选择相应的存储 引擎
SQL前加explain关键词可以得到SQL的执行计划,根据执行计划可以判断执行过程是否符合预期
explain SELECT db_dataset.uuid AS db_dataset_uuid, db_dataset.NAME AS db_dataset_name, db_dataset.updated_at AS db_dataset_updated_at, db_dataset.created_at AS db_dataset_created_at, db_dataset.volume_dir AS db_dataset_volume_dir, db_dataset.max_data_count AS db_dataset_max_data_count, db_dataset.description AS db_dataset_description FROM db_dataset LEFT OUTER JOIN db_manifest ON db_manifest.dataset_id = db_dataset.id AND db_manifest.dataset_version = 'annotation_v0' LEFT OUTER JOIN db_ai_data ON db_manifest.id = db_ai_data.manifest_id AND db_ai_data.deleted = '0' WHERE db_dataset.deleted = 0 GROUP BY db_dataset.id
执行计划反馈列的解释:
select_type详解:
type详解:
查询使用了何种类型,它在 SQL优化中是一个非常重要的指标,以下性能从好到坏依次是: system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
system :当表仅有一行记录时(系统表),数据量很少,往往不需要进行磁盘 IO,速度非常 快。
const :表示查询时命中 primary key 主键或者 unique 唯一索引,或者被连接的部分是一个常量 (const)值。这类扫描效率极高,返回数据量少,速度非常快。
eq_ref :查询时命中主键 primary key 或者 unique key 索引, type 就是 eq_ref。
ref :区别于 eq_ref,ref 表示使用非唯一性索引,会找到很多个符合条件的行。
ref_or_null :这种连接类型类似于 ref,区别在于 MySQL 会额外搜索包含 NULL 值的行。
index_merge :使用了索引合并优化方法,一个查询使用了两个以上的索引。
EXPLAIN SELECT * FROM user_robot_relate WHERE id > 1 AND user_id = 2;
unique_subquery :替换下面的 IN 子查询,子查询返回不重复的集合。
value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery :区别于 unique_subquery,用于非唯一索引,可以返回重复值。
value IN (SELECT key_column FROM single_table WHERE some_expr)
range :使用索引选择行,仅检索给定范围内的行。简单点说就是针对一个有索引的字段,给定 范围检索数据。在 where 语句中使用 bettween...and、<、>、<=、in 等条件查询 type 都是 range。 从结果中看到只有对设置了索引的字段,做范围检索 type 才是 range。
EXPLAIN SELECT * FROM user_robot_relate WHERE id BETWEEN 2 AND 3;
index :Index 与 ALL 其实都是读全表,区别在于 index 是遍历索引树读取,而 ALL 是从硬盘中 读取。
ALL :将遍历全表以找到匹配的行,性能最差。
Extra :不适合在其他列中显示的信息,Explain 中的很多额外的信息会在 Extra 字段显示。
Using index:我们在相应的 select 操作中使用了覆盖索引,通俗一点讲就是查询的列被索引覆盖,使 用到覆盖索引查询速度会非常快,SQL 优化中理想的状态。
Using where:查询时未找到可用的索引,进而通过 where 条件过滤获取所需数据,但要注意的是并不 是所有带 where 语句的查询都会显示 Using where。
Using temporary:表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。
Using filesort:表示无法利用索引完成的排序操作,也就是 ORDER BY 的字段没有索引,通常这样的 SQL 都是需要优化的。
Using join buffer:在我们联表查询的时候,如果表的连接条件没有用到索引,需要有一个连接缓冲区 来存储中间结果。
索引时帮助MySQL高效获取数据的排好序的数据结构
索引数据结构:
二叉树
红黑树
HashTable
B-Tree
一般不用二叉树的原因:有序数据将退化成链表,深度不可控,如下图所示
通常也不能用红黑树的原因:虽然压缩了深度,但深度还是不可控,海量数据查找复杂度极高
Hash表:仅支持IN查新,不支持RANGE查询。使用hash算法将内容进行hash处理 hash(aaaa) = 2 hash(bbbb) = 2 hash(cccc) = 4
B+ 树:主流的索引结构
查找过程:
1. 读取根节点所有元素,因为是有序的,可以利用二分查找,高效查找到指定区间
2. 根据指定区间文件地址找到二级节点,读取所有元素。
3. 找到叶子节点中指定元素位置。
以B+树索引为例,
如果要查找数据项目29
1、首先进入1号块,1号块数据加载如内存,发生一次I/O
2、在内存中进行二分查找,发现29在17和35之前,于是锁定P2指针,将3号块数据加载到内存,又发生一次I/O
3、同理在3号块中走P2指针锁定8号数据块,将8号数据块加载到内存,最后发生一次I/O
4、遍历8号块的数据就能找到29号数据
如果没有索引,最坏的情况是整个表格的数据块都需要加载到内存,然后遍历出结果,将产生大量的I/O开销和对整表数据的遍历。
聚焦索引尤其适合需要进行RANGE查找的列,这是因为他的叶子节点存放的是有序的数据行。在查询过程中可以根据WHERE的条件定位到两端叶子节点,然后将他们之间的整个链表结构取出。
工程应用中经常有一些核心表需要按照多种形式查询,如果为每一种查询方式都建一个索引会影响表插入和更新的性能。
考虑到联合索引在创建时每个子列都是排好序的,比如数据表A上有一个联合缩影(a, b, c) , 那么查询where a = xxx ; where a = xxx and b = xxx都将命中缩影,因此可以利用这种特性按照业务需求设置少量联合索引覆盖多种查询需求。
假设有表A, 有如下3种高频查询
select xx from A where a = xxx; select xx from A where b = xxx; select xx from A where a = xxx and b = xxx;
最简单的办法是 分别给a b (a, b) 建索引,但这就过于啰嗦。按照左前缀原则,最合理的索引建法应该是 b 和 (a, b)。
1、InnoDB所有数据都是基于B+Tree存储的,如果没有主键mysql会在所有列中选择可能唯一的列用作索 引id,如果查找不到会默认增加rowid列。
2、索引查找过程中会有大量数据比对的场景,如果使用uuid会逐位比对,效率会非常低,占用空间也会非 常大,占用过多ssd空间,存储费用增大。
3、b+tree是有序树,自增索引数据可以一直向后插入性能高,如果使用非自增索引,可能导致插入过程中 带来树分裂及平衡问题,带来额外的性能损失。
1、检查SQL,查看执行计划,是否命中索引?是否存在大量大表关联?查询的每个字段都是必须的?...
2、加索引
3、分区
4、分表
5、改表结构,减少查询种的关联,增加冗余字段
6、加服务器,弹性主机加U加内存换SSD...
点击关注,第一时间了解华为云新鲜技术~
大家好,又见面了,我是你们的朋友全栈君。问题: 一: SELECTtablespace_name,SUM(bytes)free FROMdba_free_space 不是单组分组函数 原因: 1、如果程序中使用了分组函数,则有两种情况可以使用: 程序中存在 groupby ,并指定了分组条件,这样可以将分组条件一起查询出来 改为: SELECTtablespace_name,SUM(bytes)free FROMdba_free_space GROUPBYtablespace_name ; 如果不使用分组的活,则只能单独使用分组函数 改为: SELECTSUM(bytes)free FROMdba_free_space ; 2、在使用分组函数的时候,不能出现分组条件之外的字段 总结:在 select 需要查询的语句中选中的字段,必须出现在 groupby 子句中发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147376.html原文链接:https://javaforall.cn
Themodelsthataremostfrequentlycustomizedarecurrentlyplacedin@spartacus/core.Thefollowingisanexampleofmoduleaugmentationon theConsentTemplatemodel:假设我想扩展Spartacuscore里的标准interface:ConsentTemplate首先从Spartacuscore里导入:import{ActiveCartService,CartAddEntrySuccessEvent,CmsConfig,Config,ConfigModule,ConsentTemplate,EventService}from'@spartacus/core';复制然后使用如下语法扩展一个新的字段documentUrl:declaremodule'@spartacus/core'{ interfaceConsentTemplate{ documentUrl?:string; } }复制最后的效果:而关于SAPSpartacus
做为一个过来人,我谈谈我自己的看法,欢迎大家补充:首先肯定的一点是:不要一上来就看内核代码,基本上你会很快被挫败感打败。内核正在变得越来越庞大,学习曲线越来越陡峭,当你一无所知的时候冒然进入linuxkernel,你会发现处处都是障碍,处处都是大坑,你根本走不下去。最好的方法是把对内核源代码的热情先放在心里,从基本功开始。我认为的基本功包括两个方面: 1、linux的基本操作。内核中的很多设计都是源于应用,你不理解用户空间的操作,也就不会知道内核空间在干什么。这时候,你需要做的就是在自己的计算机上安装一个GNU/linux操作系统,Debian、Ubuntu什么的都OK,最好去掉其他的OS,这可以强迫你在linux下进行学习,工作,生活。在这个过程中,你可能需要google检索一些信息,安装一些软件,学习使用这些软件,理解一些基本的linux的背景知识......如果你想要从事底层的软件开发,那么尽量在终端下工作,这样会让你和linuxkernel更接近一些,从而提供更多关于内核的基础知识。2、第二个方面是软件相关的基础知识。你最好学习一些软件的逻辑思维,学习掌握一门语言,当然最好是c
问题现象测试环境1.Redhat7.42.CDH6.2.03.CDSW1.5.0Fayson在前面的文章《后台查找CDSW中用户的审计日志》,讲述了如何通过访问CDSW的PG数据库查找用户的审计日志,今天Fayson在1.5.0版本的CDSW中,通过之前的方式无法正常的登录PG数据库,报错信息“psql:FATAL:role"postgres"doesnotexist”异常分析通过上述异常分析,Fayson猜测可能是由于CDSW升级后考虑到PG数据库的安全问题,从而将postgres用户的role删除了。像前面通过访问后台数据库查看CDSW用户审计日志一样就属于非法操作,可能就是为了防止Fayson这种不合常规的操作。既然不能够通过切换到postgres用户直接登录PG数据库,那Fayson就通过账号密码的方式访问CDSW的数据库。通过分析发现CDSW的服务是由多个docker容器提供的服务组成(这里表达可能不够专业),Fayson找到提供Web访问界面的docker容器,Web界面显示的大部分信息都存储在数据,那同样可以通过在Web服务中找到访问CDSW数据库的方
版权声明:本文为博主原创文章,未经博主允许不得转载。https://louluan.blog.csdn.net/article/details/199749991.简述:JavaSocket编程时对于TCP/IP协议层的通信进行封装,简化了相关的一些操作。//待续2.Socket通信时序图 3.Socket数据流的交互4.单客户端和服务器通信的简单例子:服务器端代码:packagecom.lou.socket; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.PrintWriter; importjava.net.InetSocketAddress; importjava.net.ServerSocket; importjava.net.Socket; publicclassTestServer{ publicstaticvoidmain(String[]args)throwsIOException{ //1.创建一个S
转自:程序人生(coder_life)有人说,程序员的门槛正在逐渐消失,因为计算机相关专业毕业生一年比一年多;IT培训班出来的学生一年比一年多;网络上各种编程课程,也正在帮助无数人零基础转型软件开发……而程序员的工资,动辄两三万,三五万,远高于其他行业大部分技术岗位,似乎充满了泡沫。未来程序员越来越多,供过于求,肯定会是白菜价,并说这是普遍的经济规律。当我们讨论供需关系时,往往都需要一个基础条件:产品业务必须是标准的。我们这代人生活在『工业时代』往『信息智能时代』的转变阶段。所以我们常常用工业时代的经验来推测假定信息智能时代的趋势,这种推测本身就是落伍的。下面,我们就从多个角度来看看,程序员的收入在未来十年后,可能会怎么样。①行业趋势一到两年内,你工作有没有晋升、薪水能不能增加,个人努力起很大作用。而五年、八年、十年或者更久,趋势的作用会远远大于个人努力,甚至会将个人的努力淹没。当你进入正确的河道,哪怕你毫不用力,湍急的水流也会推着你飞速前进。这就是趋势的力量。那么,现在的趋势是什么?哪些行业才是正确的河道?先看一张图:本图来源见水印 上图,是美国200年来行业增速变迁图,描述了从18
作者:GeorgeLeopold大数据翻译:袁君洋关键词:大数据,交通规划转载请保留交通规划者们正越来越信奉大数据分析,因为整个国家的高速公路愈发拥堵,而数据科学在某些情况下替代了昂贵的道路建设工程。最新的例子来源于专门为交通部门提供预测分析的蔻比克交通系统公司(CubicTransportationSystems)旗下的一个子公司,城市洞察联营公司(UrbanInsightsAssociate)。城市洞察在6月末开展了旨在帮助交通机构更有效的调配城市交通网络资源的咨询业务。“如今,全球交通产业所面临的最大挑战之一是巨大而丰富的数据正在被收集却没有得到城市交通企业的充分利用,”WadeRosado,城市洞察的分析主管在一份宣布新的数据业务的声明中说到。该公司表示其预测分析工具将以可视化数据的形式来展示交通信息,以此帮助交通主管部门了解如何最大化交通网络容量以及司机们是如何做选择的。“当我们能确定交通网络的应力点时,我们就能协助交通机构来制定可以解决这些情况的措施,”Rosado声称。交通行业正在兴起为一个由车辆传感器和数据采集点(比如收费站)生成的主要数据来源。城市洞察坚持认为现有的数
这位本科还没毕业,就已进入谷歌大脑,与Google资深研究员LukaszKaiser共同发表了最近的一篇热门论文----"OneModelToLearnThemAll",成功证明,一个神经网络是能同时处理多项任务的。 这小子到底是谁?是什么大学这么牛逼,造就了他?关于这篇论文,这位本科生脑子里到底怎么思考的?作者|UofT,Google译者|failbetter编辑|AI100这位传奇人物就是AidanGomez,而他目前就读的大学为多伦多大学。在多伦多大学,Gomez主修计算机科学和数学。刚过去的那一学期,他选择了休学,前往硅谷的GoogleBrain团队实习。尚未毕业,尚未毕业,尚未毕业...(小编邪恶抛问:请问你大学在做什么?)But,在Google资深研究员LukaszKaiser的指导下,他们共同发表了最近的一篇热门论文,主题是用一个神经网络进行多任务学习。这篇论文一经推出,迅速火遍了全网。论文地址:https://arxiv.org/abs/1706.05137来看现状。当前,大多数神经网络都是单任务的,只能专注于鉴别图片内的物品、理解自然语言或语音识别
一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。 在数据量和访问量不大的情况下,mysql访问是非常快的,是否加索引对访问影响不大。但是当数据量和访问量剧增的时候,就会发现mysql变慢,甚至down掉,这就必须要考虑优化sql了,给数据库建立正确合理的索引,是mysql优化的一个重要手段。 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。除了词典,生活中随处可见索引的例子,如火车站的车次表、图书的目录等。它们的原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。 在创建索引时,需要考虑哪些列会用于SQL查询,然后为这些列创建一个或多个索引。事实上,索引也是一种表,
大数据文摘出品9月18日,英伟达在官方频道上传了“GeForceBeyond”视频,主讲人不出意外还是我们熟悉的“黄教主”,视频预定于20日23点首发。由于是录制视频,显然所以产品型号、规格和价格看来已经最终敲定,只待浮出水面。早在官方预热中,英伟达几乎已经明示了要发基于AdaLovelace架构的首款RTX40系显卡,所以今天的整个发布会相对来说,悬念不大。当然,除了RTX40系列显卡,黄教主还带来了新一代自动驾驶芯片THOR,算力之高直接卷死友商。我们一起来看看吧~全球最快的游戏GPU,售价12999起,10月份上市首先最亮眼的还是RTX4090,号称全球最快的游戏GPU,具有760亿个晶体管、16384个CUDA核心和24GBGDDR6X显存,在4K分辨率的游戏中持续以超过100FPS运行。英伟达称在完整的光线追踪游戏中,与上一代采用DLSS2的RTX3090Ti相比,采用DLSS3的RTX4090的性能提升可达4倍。在现代游戏中,在保持了相同450W功耗的情况下,RTX4090的性能提升高达2倍。黄教主表示,40系显示芯片将采用全新的AdaLovelace架构,该架构以女数学家
参考:https://gitee.com/help/articles/4232 在windows下,打开gitbash(注意:用windowscmd是不行的):输入如下命令: gitfilter-branch--tree-filter'rm-fpath/to/large/files'--tag-name-filtercat----all gitpushorigin--tags--force gitpushorigin--all--force 在ubuntu下,打开terminal,输入如下命令: gitfilter-branch--tree-filter'rm-fpath/to/large/files'--tag-name-filtercat----all gitpushoriginmaster--tags--force gitpushorigin--all--force TBC
首先一幅Matplotlib的图像组成部分介绍。 在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个或者多个Axes对象。每个Axes(ax)对象都是一个拥有自己坐标系统的绘图区域。所属关系如下: 下面以一个直线图来详解图像内部各个组件内容: 其中:title为图像标题,Axis为坐标轴,Label为坐标轴标注,Tick为刻度线,TickLabel为刻度注释。各个对象关系可以梳理成以下内容: 图像中所有对象均来自于Artist的基类。 上面基本介绍清楚了图像中各个部分的基本关系,下面着重讲一下几个部分的详细的设置。 一个"Figure"意味着用户交互的整个窗口。在这个figure中容纳着"subplots"。 当我们调用plot时,matplotlib会调用gca()获取当前的axes绘图区域,而且gca反过来调用gcf()来获得当前的figure。如果figure为空,它会自动调用figure()生成一个figure,严格的讲,是生成subplots(111)。 Figures Subplots plt.subplot(221)#第一行
xss前端代码注入三种:html,css,js。 用户输入的数据被当作前端代码执行 1,什么是XSS? XSS:HTML代码注入。 HTML代码注入: 用户的输入会被当做HTML等前端代码执行。 并不止是HTML代码,是前端的所有语言,如:JS、HTML、CSS。 两个关键条件: 1.用户能够控制输入。 2.原本程序要执行的代码,拼接了用户输入的数据。 2,XSS主要拼接的是什么? SQL注入拼接的是操作数据库的SQL语句。 SQL注入用户的输入会被当做SQL语句执行。 XSS拼接的是网页HTML代码。 XSS主要就是调用js。 3,XSS判断是否存在方法: 业内一般把弹窗函数作为一个存在XSS的认定。 最经典的判断方法:<script>alert(1)</script> 一般证明XSS存在,就是在正常页面传参,然后构建函数让它弹窗,就是存在XSS了。 弹窗证明具有XSS,不弹窗也不能证明不具有XSS,只是一种判断方法。 为什么通过弹窗判断XSS? 因为XSS攻击如果需要达到真正的利用,需要调用JS。 4,XSS能够做什么?盗取COOKIE(使用最频
之前发现直接编译mongo源码中的驱动,静态库的驱动会很大,在链接使用的时候会报很多链接错误。 转而直接编译单独提供驱动源码,同样vc2008的版本也要做我的另一篇博文中修改,在这不多说,具体参见: http://www.cnblogs.com/tangdoudou/p/3364015.html 1.首先说明一点,这边是编译的vc2008的版本,因为Mongo现在提供代码只有vs2010的工程,代码里面有C11的东东,故直接移植到vs2008上是不行的,如果是编译2010请跳过。 在做命令行执行任何命令之前,请执行vcvars32.bat,这个文件在你的vs2008的sdk目录下面。切忌! 2.下载2.4.6的Mongodb C++Driver 3.按照http://www.cnblogs.com/tangdoudou/p/3364015.html中对驱动做适应性的修改,主要修改为C11和WIN32的问题。 4.编译boost(1.4.90),我编译的release版本,debug版本在链接的时候会报错: BuildingYourself Downloadt
子查询就是查询中又嵌套的查询,表连接都可以用子查询,但不是所有子查询都能用表连接替换,子查询比较灵活,方便,形式多样,适合用于作为查询的筛选条件,而表连接更适合与查看多表的数据。 子查询不一定需要两个表有关联字段,而连接查询必须有字段关联(所谓的主外键关系) 表关联的效率要高于子查询,因为子查询走的是笛卡尔积 表关联可能有多条记录,子查询只有一条记录,如果需要唯一的列,最好走子查询 对于数据量多的肯定是用连接查询快些,原因:因为子查询会多次遍历所有的数据(视你的子查询的层次而定),而连接查询只会遍历一次。 但是数据量少的话也就无所谓是连接查询还是子查询,视自己的习惯而定。一般情况下还是用子查询来的好,容易控制 为什么子查询比连接查询(LEFTJOIN)效率低 MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然很灵活,但是执行效率并不高。那么问题来了,什么是子查询?为什么它的效率不高?子查询:把内层查询结果当作外层查询的比较条件 示例: selectgoods_i
DNS服务器的配置参数和概念 IP地址是在网络上分配给每台计算机或网络设备的32位数字标识。在Internet上,每台计算机或网络设备的IP地址是全世界唯一的。IP地址的格式是xxx.xxx.xxx.xxx,其中xxx是0到255之间的任意整数。例如,科迈网站主机的IP地址是210.22.12.54。 什么是固定IP地址? 固定IP地址是长期分配给一台计算机或网络设备使用的IP地址。一般来说,采用专线上网的计算机才拥有固定的InternetIP地址。 什么是动态IP地址? 通过Modem、ISDN、ADSL、有线宽频、小区宽频等方式上网的计算机,每次上网所分配到的IP地址都不相同,这就是动态IP地址。因为IP地址资源很宝贵,大部分用户都是通过动态IP地址上网的。 什么是内网、什么是公网、什么是NAT? 公网、内网是两种Internet的接入方式。内网接入方式:上网的计算机得到的IP地址是Inetnet上的保留地址,保留地址有如下3种形式:10.x.x.x172.16.x.x至172.31.x.x192.168.x.x内网的计算机以NAT(网络地址转换)协议,通过一个公共的网关访问In
一、初始递归 递归函数:在一个函数里调用这个函数本身 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是Python为了杜绝此类现象,强制得将递归层数控制在了997 拿什么来证明这个“998理论”呢?这里我们可以做一个实验: deffoo(n): print(n) n+=1 foo(n) foo(1)复制 由此我们可以看出,未报错之前能看到的最大数字就是998。当然了,997是Python为了我们程序的内存优化所设定的一个默认值,我们当然还可以通过一些手段去修改它: importsys print(sys.setrecursionlimit(100000))复制 ViewCode 我们可以通过这种方式来修改递归的最大深度,刚刚我们将Python允许的递归深度设置为了10w,至于实际可用到达的深度就取决于计算机的性能了。不过我们还是不推荐修改这个默认的递归深度,因为如果用997层递归都没有解决的问
搭建好k8s集群之后,需要在集群内部运行一些业务程序,并可以访问,这样的集群才有意义。之前只是自己学习如何搭建集群,如何创建资源对象,更多的是在学习和练习层面,并没有实际用处,对k8s实际业务上线流程也不是很了解,所以最近学习了下k8s集群的部署流程,简单整理记录如下。 1.传统部署 整体流程为: 开发人员将写好的代码提交到代码仓库(如Gitlab),运维人员通过CI/CD工具(如Jenkins)将代码拉取下来,并执行相应的命令或脚本进行构建,对于多节点集群来说,还需要使用自动化工具(如Ansible)将代码分发到各个节点,并启动程序,另外还需要配置负载均衡器实现请求转发和负载均衡。 2.k8s部署 整体流程为: 开发人员将写好的代码提交到代码仓库(如Gitlab),运维人员通过CI/CD工具(如Jenkins)将代码拉取下来,然后使用新版本代码构建新版本镜像并上传到镜像仓库。如果是新上线的业务,需要基于新镜像创建pod等,如果是系统升级,则直接修改已有pod的镜像版本即可,k8s会自动完成滚动升级。当然还需要创建相应的service和ingress以使我们的业务程序可
近年来ORM(Object-RelationalMapping)对象关系映射,即实体对象和数据库表的映射)技术市场人声音鼎沸,异常热闹,Sun在充分吸收现有的优秀ORM框架设计思想的基础上,制定了新的JPA(JavaPersistenceAPI)规范。JPAJavaPersistenceAPI,是JavaEE5的标准ORM接口,也是ejb3规范的一部分。 那么什么是JPA呢?JPA是通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期实体对象持久化到数据库中去。 Hibernate与JPA的关系及其实现机制 JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。那么Hibernate是如何实现与JPA的这种关系的呢。Hibernate主要是通过三个组件来实现的,及hibernate-annotation、hibernate-entitymanager和hibernate-core。 hibernate-annotation是Hibernate支持annotation方式配置的基础,它包括了标准的JPAannotat