一、开发需求 最近有一个开发需求,大致需要先使用主表,或主表和几张子表关联查询出ID(主键)及一些主表字段,然后再用这些ID查找最多10张表中对应的记录,主表记录数大约2000万,每张子表的记录数均为百万以上...现在开发使用的逻辑是: 1.使用条件查询主表或主表和几张子表(不同场景)符合条件的主表记录ID值及其他一些主表字段项。...(1.2) 使用union all的方式关联子表,作为VIEW,然后和主表做关联,这是罗大师推荐的方式,例如: SELECT A.ID, A.NAME FROM T_ZHUBIAO A, (SELECT...2.将(1)的结果集存入一张临时表(temporary table,不是应用自行处理的普通表),相当于临时结果集,每次子表都是和这张临时表做两表关联查询,这么做可以避免因为IN值太多导致的低效检索,同时由于两表关联字段均为主键或外键...3.(1)不变,只是(2)中每次子表查询,由应用控制,例如每30个IN值执行一条SQL语句,将一次子表查询拆分为若干次查询,好处是每次可以使用外键索引扫描检索结果集,坏处就是无形中又多了N次SQL语句的执行
如果表有任何可能包含大量值的列,则也可能存在一个与该表相关的TOAST文件,用于存储不适合舒适地放入主表中的宽值。如果存在TOAST表,则会有一个有效的索引。此外,主表也可能有关联的索引。...通过查询pg_class和pg_index表可以查看TOAST表和索引的磁盘使用情况。 使用上述查询可以轻松识别哪些表和索引占用最多的磁盘空间。...如果你无法通过删除其他文件来释放磁盘上的额外空间,你可以通过使用表空间将一些数据库文件移动到其他文件系统中。 小贴士 一些文件系统在其接近满时性能会变差,因此不要等到磁盘完全满时才采取行动。...清理临时文件:删除临时文件夹中的文件,如`/tmp`或`/var/tmp`。 清理数据库缓存:如果数据库缓存过大,可以考虑重启PostgreSQL服务以清除缓存。...使用表空间:可以考虑使用表空间来将数据文件移动到其他磁盘分区或机器上。
解决方案:将表达式或其部分的结果放在独立的变量中,这些变量是自解释的。 内联临时变量 问题:你有一个临时变量,它被分配了一个简单表达式的结果,仅此而已。 解决方案:用表达式本身替换对变量的引用。...用查询替换临时变量 问题:将表达式的结果放在局部变量中,以便以后在代码中使用。 解决方案:将整个表达式移动到一个单独的方法,并从中返回结果。查询方法,而不是使用变量。...在它们中,创建一个共享方法,并将代码从条件的相应分支移动到它。然后用相关的方法调用替换条件。结果是,根据对象类,可以通过多态实现正确的实现。...用方法调用替换参数 问题:调用一个查询方法并将其结果作为参数传递给另一个方法,而该方法可以直接调用该查询。 解决方案:不要通过参数传递值,而是尝试在方法体中放置一个查询调用。...上移字段 问题:两个类具有相同的字段。 解决方案:从子类中删除字段,并将其移动到超类。 上移方法 问题:你的子类具有执行类似工作的方法。 解决方案:使方法相同,然后将它们移动到相关的超类。
1.EXISTS子查询 语法: select .......from 表名 where exists(子查询) 子查询有返回结果: EXISTS子查询结果为TRUE,则执行外层查询 子查询无返回结果:...EXISTS子查询结果为FALSE,外层查询不执行 当数据量大的时候使用exists,如数据量于一万以上使用,数据量少时可以使用in 示例: /*1.检查‘logic java’ 课程最近一次考试成绩*...student中数据逐条匹配表result中的数据 1.匹配,返回到结果集 2.无匹配,NULL值返回到结果集 示例: /*左外连接 left join 前面的表为主表,以主表里的字段为依据,把从表里的数据填充给主表...学生成绩, s.studentNo as 学生编号 from result as r right join student as s on r.studentNo = s.studentNo; 9.使用临时表保存查询结果...create temporary table表名(查询语句) 提示: 临时表只在当前连接可见,连接关闭自动删除,修改临时表数据不影响原表数据 10.MySQL 如何把varchar类型转换为int类型
4.循环后移,每次将最大的元素移动到最后一个。...array.length 次 for (int i = 0; i < array.length; i++) { // 每次遍历,最后的元素已经是最大了,因此可以忽略,只需要遍历 0 到...2.将临时元素与数组后面的元素进行比较,如果后面的元素小于临时元素,后面的元素前移。 3.如果后面的元素大于临时元素,或者已经移动到数组末尾,则将临时元素插入当前的空隙中。...//元素前移,因为临时元素已经提出来了,可以直接前移而不是交换 array[j - 1] = array[j]; } else { // 如果大于...,则直接将临时元素插入,然后退出循环。
此篇主要讲解表字段的Data type的每种类型以及多表关联下的SOQL查询,由于多表关联涉及到Data type中的look up或者master-detail,所以先讲一下Data type类型。...__c,则PRIVELEGEID__r则相当于PRIVELEGE__c表的一个引用,通过PRIVELEGEID__r则可以访问PRIVELEGE__c表中的数据,为了更加明确的了解,将数据表查询结果通过...通过查询输出的json结果可以看出,PRIVELEGEID__r他的类型为PRIVELEGE__c,并且把此条记录中的PRIVELEGE__c需要的字段信息查出,ROLEID__r类型为ROLE__c,...查询操作代码将与删除操作代码在下方一起显示。 因为表之间存在关联关系,所以进行增加操作时,应先处理主表,然后再处理从表;进行删除操作时,应先删除从表,在删除主表。...,主表添加以后,ID便自动赋值,然后再取出ID操作从表。
2.3、(1-J3)添加外部列 如果使用了外连接(LEFT,RIGHT,FULL),主表(保留表)中的不符合ON条件的列也会被加入到VT1-J2中,作为外部行,生成虚拟表VT1-J3。 ?...2、WHERE 对VT1过程中生成的临时表进行过滤,满足WHERE子句的列被插入到VT2表中。...; 应用: 对主表的过滤应该放在WHERE; 对于关联表,先条件查询后连接则用ON,先连接后条件查询则用WHERE; ?...注意: offset和rows的正负带来的影响; 当偏移量很大时效率是很低的,可以这么做: 采用子查询的方式优化,在子查询里先从索引获取到最大id,然后倒序排,再取N行结果集 采用INNER JOIN优化...,JOIN子句里也优先从索引获取ID列表,然后直接关联查询获得最终结果 ?
,那它没有必要再回表查询了,这就叫覆盖索引 例如对于如下查询: select name from test where city='上海' 复制代码 我们将被查询的字段建立到联合索引中,这样查询结果就可以直接从索引中获取...,比如or或and查询对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,因此就不会导致索引失效的问题了 如果从Explain执行计划的type列的值是index_merge可以看出MySQL使用索引合并的方式来执行对表的查询...优化子查询 尽量使用 Join 语句来替代子查询,因为子查询是嵌套查询,而嵌套查询会新创建一张临时表,而临时表的创建与销毁会占用一定的系统资源以及花费一定的时间,同时对于返回结果集比较大的子查询,其对查询性能的影响更大...UNION优化 MySQL处理union的策略是先创建临时表,然后将各个查询结果填充到临时表中最后再来做查询,很多优化策略在union查询中都会失效,因为它无法利用索引 最好手工将where、limit...,这会导致对整个临时表做唯一性检查,代价很高 慢查询日志 出现慢查询通常的排查手段是先使用慢查询日志功能,查询出比较慢的 SQL 语句,然后再通过 Explain 来查询 SQL 语句的执行计划,最后分析并定位出问题的根源
从表外键类型,必须与主表主键类型一致。 建立外键的表必须是InnDB型,不能是临时表。 外键名不能用引号。FK_ID错误。应为FK_ID。、 添加数据时:从表的外键,只能添加主表主键中存在的数据。...查询结果为所有数据的集合。...满足其中任意一个条件,就将查询结果返回。...,可以作为查询的条件,也就是查询出来的结果是一个id。...也就是把查询的结果作为另一张表使用;
tmpResult.pop_back(); } } } 第一个if语句即是递归的结束条件,当待排序数组只剩一个元素时,直接插入到临时结果数组中,然后将临时结果添加到结果数组中。...使用循环取出当前数组的每一个元素,添加到临时结果数组中: 每次递归调用只修改原数组中的一个数据,在调用完perm()后需要将数组恢复到迭代前的状态。...结果数组与原数组共用内存空间,通过指针位置调整边界。...提示:可将圆盘临时置于 B 杆,也可将从 A 杆移出的圆盘重新移回 A 杆,但都必须遵循上述两条规则。 问:如何移?最少要移动多少次? ---- 题目分析 梵塔问题只能用递归算法来解决。...按照之前分析的步骤,先将A针上的N-1个圆盘借助C针移动到B针上,然后将A底部的圆盘移到C针上,最后将B针上的N-1个圆盘借助A针移动到C针上。
扩展功能,字段值自增等 数据表高级操作 克隆表,将数据表的数据记录生成到新的表中 删除记录后主键记录重头开始自增 创建临时表 创建外键约束,保证数据的完整性和一致性 MySQL 六种约束 ----...查看创建表的命令 SHOW CREATE TABLE 表名 5.查询结果行转列查看 \G SELECT * FROM USER_INFO\G; 6....,复制 AREA_INFO 表结构生成 AREA_CLONE1 表 INSERT INTO AREA_CLONE1 SELECT * FROM AREA_INFO; 如果两张表结构一样,可将一张表的查询结果集返回给...另一张表 INSERT INTO 表1 SELECT * FROM 表2 方法二:直接克隆 #直接将源表的查询结果给创建的新表 CREATE TABLE 克隆表名(SELECT * FROM...#相当于直接格式化表 创建临时表 临时表是在当前连接中生效的表。 临时表创建成功之后,使用 SHOW TABLES 命令是看不到创建的临时表的; 临时表会在连接退出后被销毁。
(作为条件判断) SELECT 列名 FROM 表名 Where 条件 (子查询结果) 2.12.1 查询工资大于Bruce 的员工信息 #1.先查询到 Bruce 的工资(一行一列) SELECT...再查询临时表中前5行员工信息 select employee_id , first_name , salary from (临时表) limit 0,5; #SQL:合并 select employee_id...注意:子查询作为临时表,为其赋予一个临时表名 2.15 合并查询(了解) SELECT * FROM 表名 1UNION SELECT * FROM 表名 2 SELECT * FROM 表名 1UNION...视图的数据变化会影响到基表,基表的数据变化也会影响到视图 1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。...2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
查找时,先到索引表中通过索引记录大致判断要查找的记录在主表的哪个区域,然后定位到主表的相应区域中,仅搜索这一个区块即可。 ?...因为索引表本身是有序的,所以查找索引表时,可先用前面提到的二分查找判断大致位置,然后定位到主表中,用顺序查找。...比如:要查找值为78的记录,先到索引表中二分查找,能知道该记录,应该在主表索引13至18 之间(即第4段),然后定位到主表中的第4段顺序查找,如果找不到,则返回-1,反之则返回下标。...思路:将本节点的左子树上移,挂到父节点下的LChild,然后删除自身即可 c.待删除的节点,只有右子树 ?...思路:这个要复杂一些,先找出自身节点右子树中的左分支的最后一个节点(最小左节点),然后将它跟自身对调,同时将“最小左节点”下的分支上移。
: 将函数从子类移动到父类中; -- From Template Method(塑造模板函数) : 不同子类中某些函数执行相似操作, 细节上不同, 可以将这些操作放入独立函数中, 这些函数名相同, 将函数上移父类中...过长函数(Long Method) 用到的重构方法 : Extract Method(提炼函数), Replace Temp with Query(以查询取代临时变量), Introduce Parameter...Conditional(分解条件表达式); -- Extract Method(提炼函数) : 将代码放到一个新函数中, 函数名清晰的说明函数的作用; -- Replace Temp with Query(以查询取代临时变量...) : 程序中将表达式结果放到临时变量中, 可以将这个表达式提炼到一个独立函数中, 调用这个新函数 去替换 这个临时变量表达式, 这个新函数就可以被其它函数调用; -- Introduce Parameter...with Query(以查询取代临时变量) 方法消除临时元素; -- 消除过长参数 : 使用 Introduce Parameter Object(引入参数对象) 和 Preserve Whole Object
它们体积小,便于携带,适用于快速数据传输和临时存储。 磁带存储: 磁带是一种用于数据备份和归档的长期存储解决方案。虽然访问速度慢,但成本低,容量大,适合大量数据的备份。...先进行旋转调度,再进行移臂调度: 这个顺序是不合逻辑的,因为在磁头没有移动到指定的柱面之前,旋转调度是没有意义的。 B. 在访问不同柱面的信息时,只需要进行旋转调度: 这是错误的。...访问不同柱面的信息首先需要移动磁头到目标柱面(移臂调度),然后再进行旋转调度。 C. 先进行移臂调度,再进行旋转调度: 这是正确的顺序。...首先,磁头需要移动到目标柱面上(移臂调度),然后等待磁盘旋转,使目标扇区旋转到磁头下方(旋转调度)以进行数据的读写。 D. 在访问同一磁道的信息时,只需要进行移臂调度: 这个说法不正确。...这反映了磁盘访问过程中的自然顺序,首先是磁头移动到正确的柱面上,然后磁盘旋转到正确的位置以访问数据。这个过程是优化磁盘访问时间和提高磁盘I/O性能的关键。
2. vim常用命令 2.1 一般模式中的命令 2.1.1 光标移动 命令 说明 h,← 光标左移一个字符 j,↓ 光标下移一个字符 k,↑ 光标上移一个字符 l,→ 光标右移一个字符 n[h,j,k,...- 光标移动到非空格符的上一列 n n表示数字,再按下空格键光标向右移动n个字符 0,[Home] 光标移动到第一个字符 $,[End] 光标移动到最后一个字符 H 光标移动到屏幕第一行第一个字符...M 光标移动到屏幕中央一行的第一个字符 L 光标移动到屏幕最后一行的第一个字符 G 光标移动到文件最后一行 nG n为数字,光标移动到文件第n行 gg 光标移动到文件第一行,相当于1G n临时文件。注意之后正常离开后,要手动删除该临时文件。 (D)elete:删除临时文件。 (Q)uit:离开vim (A)bort:放弃编辑行为。...显示所有环境参数设定值 :set 显示所有与系统默认值不同的环境参数设定值 :set nu:set nonu 显示行号取消显示行号 :set hlsearch:set nohlsearch 高亮显示查询结果取消高亮显示查询结果
按键:shift + 6 即输入 ‘^’ ②光标移动到行尾 按键:shift + 4 即输入 ‘$’ ③光标移动到首行 按键:gg ④光标移动到末行 按键:G ⑤快速移动到指定的行 按键:数字G...f (after) 或 PgDn 2、复制粘贴操作 ①复制光标所在行 按键:yy ②以光标所在行为准(包含当前行),向下复制指定的行数 按键:数字yy ③可视化复制 按键:ctrl + v,然后按下...②剪切/删除光标所在行为准(包含当前行),向下删除/剪切指定的行 按键:数字dd (删除之后下一行上移) ③剪切/删除光标所在的当前行光标之后的内容,但是删除之后下一行不上移 按键:D (删除之后当前行会变成空白行...表示强制退出,刚才做的修改操作不做保存 ⑤搜索/查找 输入:/关键词 在搜索结果中切换上/下一个结果:N/n(next) 取消高亮可输入 :nohl (no highlight) ⑥替换(substitute...在文件打开的时候在末行模式下输入的配置(临时的) b. 个人配置文件(~/.vimrc,如果没有可以自行新建) c.
那么OLAP的优化雷同于,添加一个索引,或者对语句的改写吗,当然不是,如同OOP 面向对象思维的方式,OLAP的操作也可以进行拆分,一个好的OLAP 的操作并不是将一个SQL 写成几十行,然后通过纷繁的索引来解决问题...基于上面的思想,我们会用到以下几种技术来对OLAP 的SQL 进行改写 1 Temporary table 2 CTE 3 视图 4 物化视图 1 临时表 我们创建一个临时表,将中间的结果进行存储...,为什么我们要抛弃原表,将结果进行临时的计算并且将结果存储到临时表中。...2 临时表将主表与计算分离,通过空间换时间的方式,避免的主表在OLTP 和OLAP 之间分身乏术,避免了长时间占用主表,导致OLTP 工作的失败。...3 如果主表过大,临时添加索引不是一件好事情,可以在产生临时表后,对表进行索引的建立,提高执行的效率,并且灵活应对各种对后期的数据查询和数据提取。 所以临时表是你优化一个复杂查询的第一个方法。
num from classes a left join students b on a.id = b.class_id where b.gender = 'F' group by a.name 查询结果...as num from classes a left join students b on a.id = b.class_id and b.gender = 'F' group by a.name 查询结果...as num from classes a left join students b on a.id = b.class_id and a.name = '一班' group by a.name 查询结果...num from classes a left join students b on a.id = b.class_id where a.name = '一班' group by a.name 查询结果...on 后跟关联表(从表)的过滤条件,where 后跟主表或临时表的筛选条件(左连接为例,主表的数据都会查询到,所以临时表中必定包含主表所有的字段,需要给主表加什么筛选条件,直接给临时表加效果相同) 总结
1、此Hanoi塔与传统Hanoi塔的关系为:把n个盘中的每m个想成一个整体,就变成了传统的只能一次移动一个盘的Hanoi问题,n / m (如果有余数则+1)的结果就成了传统Hanoi塔的盘子数; ...2、分析传统Hanoi塔,假设初始状态盘子都在柱子A上,B为目标柱子,C为临时柱子,移动两个盘,需要3步(小盘--->C,大盘--->B,小盘---->B),移动三个盘,需要把前两个盘移动到柱子C,再将最大盘移到目标柱子...,再把前两个盘移动到目标柱子,所以需要的步数为3(移两个盘)+ 1(移动最大盘) + 3(移两个盘) = 7步,移动四个盘,需要把前三个盘移动到柱子C,再把最大盘移动到目标柱子,再把前三个盘子移动到目标柱子
领取专属 10元无门槛券
手把手带您无忧上云