问: 假设我有这个脚本: export.bash #!...echo $VAR 有没有一种方法可以通过只执行 export.bash 而不 source 它获取 $VAR? 答: 不可以。 但是有几种可能的解决办法。...在调用 shell 的上下文中执行脚本: $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 另一种方法是在脚本中打印设置环境变量的命令...-f 指 shell 函数 -n 从每个(变量)名称中删除 export 属性 -p 显示所有导出变量和函数的列表 ---- 参考: stackoverflow question 16618071...help eval 相关阅读: 用和不用export定义变量的区别 在shell编程中$(cmd) 和 `cmd` 之间有什么区别 ----
第 1 ~ 3 步是循环执行的过程,直到已经从存储引擎读取到所有符合 where 条件的记录,这个循环执行的过程才会结束。 第 4 步,对临时表中的记录进行排序。...从存储引擎读取符合 where 条件的所有记录之后,把数据发送给客户端之前,需要按照临时表中 e1 字段值对临时表中的记录进行排序。...如果能够使用索引(仅指 B-TREE 索引)实现 group by,索引中的记录已经是排好序的了,实际上相当于已经分好组了,可以直接进行聚合操作,而不需要借助临时表进行分组。...想必大家都已经想到了,对 from 子句的表中记录按照 group by 字段值排序之后,有点类似于为 group by 字段建立了索引,记录排好序之后也就分好组了,可以直接进行聚合,而不需要再借助临时表进行分组...对于上面关于分组和聚合的描述,大家可能会有个疑问:想要聚合就一定要先进行分组吗? 这个当然不是,从实现角度来说,不分组也可以聚合。
下图数据页用户记录中的各个方块位置分别对应这几个行记录头信息的字段。 从图中可以看出数据页中的记录按照顺序组成单链表,而且还对记录进行了分组,这里叫做页记录【槽】。...第一个分组中的记录只能有 1 条记录 最后一个分组中的记录条数范围只能在 1-8 条之间 剩下的分组中记录条数范围只能在 4-8 条之间 槽指向的是不同组的最后一个记录(组内最大记录) 这里做个小总结:...】继续查找,到了【页14】时,已经到达页 到达页之后,就到了第二部分了 先根据页目录中的槽来进行二分法查找,确定在哪个槽 确定在哪个槽之后,遍历槽内记录,也就是分组记录,最后找到主键5的记录 可以看到,...定位到该页后,又会在该页内进行二分法快速定位记录所在的分组(槽号),最后在分组内进行遍历查找,查找结束。...我们以test_index表的col1列建立一个索引,col1是不是主键,以col1构建的B+树结构如下: 从图中我们可以看到和聚簇索引的区别: 叶子节点和非叶子节点都是使用col1列(非主键)的大小进行页记录排序
这家企业的面试官有点意思,一面是个同龄小哥,一起聊了两个小时(聊到我嘴都干了)。二面是个从阿里出来的架构师,视频面试,我做完自我介绍之后,他一开场就问我: 对 MySQL 熟悉吗?...我知道这样不直观,所以我又画个图,方便你们理解: [482d8a8929375a5ea0caaa5e0f9df949.png] 图中最后一步,对内存临时表的排序,具体的细节在之前的 《order by...PS:回表的概念我就不说了哈,有兴趣的可以看我之前的《MySQL 索引详解》文章,强烈建议你去看,非常重要的是概念。...如果分组字段本身就是有序的,我们是不是就不用排序了?或者我们的需求并没有要求排序是不是就可以优化了?如果必须使用临时表,我们是不是可以只用内存临时表呢?...当然,开启这个要慎重,有可能会造成一些意想不到的错误,一般情况下还是加上这个设置比较稳妥。 6.2 group by 后面的一定要出现在 select 中吗? 不一定,我的就没报错。
工作中会经常遇到这样的业务问题: 如果找到每个类别下用户点击最多的5个商品是什么? 这类问题其实就是常见的:每组最大的N条记录(topN)。 【题目】 现有“成绩表”,记录了每个学生各科的成绩。...表内容如下: 问题:查找每个学生成绩最高的2个科目 【解题思路】 1.看到问题中要查“每个”学生最高的成绩。还记得我们之前课程里讲过的吗?当有“每个”出现的时候,就要想到是要分组了。...这里是“每个学生”,结合表的结构,是按学生“姓名”来分组。 2.将表按学生姓名分组后,把成绩按降序排列,排在最前面的2个就是我们要找的“成绩最高的2个科目”。...我们在《从零学会sql》里多次强调过,要牢记sql的书写顺序和运行顺序。在运行顺序中,select字句是最后被运行的。...2.在筛选过程中,非常容易因为子查询问题报错,本题也考察了对子查询的熟练运用。 3.本题间接考察了对sql语句执行顺序的熟悉程度。 【举一反三】 经典topN问题:每组最大的N条记录。
翻译的时候,从CR3寄存器中取出页目录地址,根据页目录索引找到页表,再根据页表索引找到物理内存页面,最后根据页内偏移,完成寻址。我说的对吧?”...我思考了一下,开始算了起来。从页目录表中读取一次,从页表中再读取一次,最后访问页面内数据再读取一次,总共就是三次。 “需要访问三次内存!”,我回答到。...0x00abc678” “地址翻译完成后,将虚拟页编号0x12345和物理页编号0x00abc的映射关系记录起来放到缓存中” “在进行地址翻译的时候,先去这个缓存里瞅一瞅,看看有没有记录过,如果有就直接用之前记录的...可以把缓存存储空间划分很多个组,全部遍历太慢,直接取模映射又容易冲突,那如果映射的结果不是一个固定的位置,而是一个分组呢?”...“听上去不错唉,这样既降低了冲突,遍历也只需在分组区间里进行了,工作量大大降低了,真是个好办法” 小黑和大家都一致同意了我的想法。 “那怎么分组呢,多少项为一组呢?”,有人问到。
感谢 OpiesDad,所以我应该创建一张桌子来容纳我需要的东西吗?我看不出答案那么复杂。你也是对的,我不认为我想加入使用两个字段。你能建议一些方向吗?...OrderID 已经与 CustomerID 相关,因为它们都在 Order Table 中。所以每条记录都有一个与它们相关的记录。...然后您可以使用别名和分组进行修改,并在此过程中对其进行测试。...最后,您将根据 OrderID 进行分组。它不会导致错误,但它也没有做任何事情。您在 SELECT 部分的聚合函数中使用 OrderID。您应该聚合您想要聚合的字段,并按您不聚合的字段进行分组。...【讨论】: 感谢您的回复 OpiesDad,您在第一条评论中暗示了答案,我推迟检查线程,直到完成(可以显示保存时间)。
当获取记录时,InnoDB存储引擎需要一条条地把记录从磁盘中读取出来吗? 当然不行!...可是记录之间能比较大小吗?能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...: 上图中我把真实数据信息中的主键id值画了出来,方便我们后续进行解释。...槽的编号从0开始,我们查找数据的时候先找到对应的槽,然后再到小组中进行遍历即可,因为一个小组内的记录数量并不多,遍历的性能损耗可以忽略。...数据页的其他字段 最后再补充几个知识点,文章中有两个问题我并没有讲 槽是怎样被存储的? 二分查找的时候,怎么知道目前有几个槽呢?
当获取记录时,InnoDB存储引擎需要一条条地把记录从磁盘中读取出来吗?当然不行!...可是记录之间能比较大小吗?能啊,这篇文章的题目就是关于主键啊,我们可以按照主键的顺序,从小到大来串联当前数据页中的所有记录。事实上,MySQL的设计者也确实是这么设计的。...接下来我们向表中多添加几条数据,看看分组到底是什么回事儿?需要注意的是,由于我们已经在表中指定了主键id,因此DB_ROW_ID这个参数不会再画出来了。...槽的编号从0开始,我们查找数据的时候先找到对应的槽,然后再到小组中进行遍历即可,因为一个小组内的记录数量并不多,遍历的性能损耗可以忽略。...,二分法就是根据这个字段的值来确定high的值PAGE_LAST_INSERT当前页面最后插入记录的位置,当有新记录插入的时候,直接读取这个数据,将新记录放到相应位置就可以了PAGE_N_RECS该页中记录的数量
玩爆你的数据报表之存储过程编写(下) 前言 最近要对数据库进行优化,但由于工作项目中已经很少亲自写SQL而且用的都不是很复杂的语句,所以有些生疏了,于是翻翻N年前的笔记资料,想以此来记录回顾总结一些实用的...在以上的10个处理步骤中, 每一步的处理都生成一个虚拟表来作为下一步的输入. 虚拟表对于调用者或输出查询来说是不存在的, 仅在最后步骤生成的表才会返回给调用者或者输出查询....第三步中OUTER: 如果多余两张表, 则将VT3和FROM中的下一张表再次执行从第一步到第三步的过程....第四步中WHERE: 由于此刻没有分组, 也没有执行select所以, where子句中不能写分组函数, 也不能使用表的别名....如果定义了Distinct子句, 则只能排序上一步中返回的表VT9, 如果没有指定Distinct子句, 则可以排序不再最终结果集中的列.
首先介绍一下这个表的情况,避免有闲言碎语说表结构特殊, 从图中看有这几个字段,region 字段是一个BIGINT 的数字自增列,country 列式MD5 随机的计算值,year是插入数据的时的系统时间...应用分组集 目的:通过region_class 来进行分组并且每组要求取最大的region 数。...2 的数据,POSTGRESQL 可以做吗?...我们在进行分组的时候,select 后面的 字段需要进行分割显示,例如 我统计 一车水果,通过水果的 好 或 坏来进行分类,但显示的时候,要对苹果,香蕉,芒果来分别显示他们的好 和坏的 总数量。...并且 partition by order by 也没有问题 么最后我们还可以进行 而我们最常用的就是对我们查询的记录进行重新的排序编号 当然 POSTGRESQL 在数据库处理方面的函数也是一大把 简单列举一些
使用group by的简单例子 group by一般用于分组统计,它表达的逻辑就是根据一定的规则,进行分组。...X’的行,没有就插入一个记录 (X,1); 如果临时表中有city=’X’的行的行,就将x 这一行的num值加 1; 继续重复2,3步骤,找到所有满足条件的数据, 最后根据字段city做排序,得到结果集返回给客户端...count() 数量 sum() 总和 avg() 平均 max() 最大值 min() 最小值 如果没有配合聚合函数使用可以吗? 我用的是Mysql 5.7 ,是可以的。...group by 后面跟的字段一定要出现在select中吗?...如果你的需求并不需要对结果集进行排序,可以使用order by null。
_2; 的结果一致,都是表示求笛卡尔积;用于直接计算两个表笛卡尔积,得到虚拟表VT1,这是所有select语句最先执行的操作,其他操作是在这个表上进行的,也就是from操作所完成的内容 on: 从VT1...group by条件中; 上述内容让我们知道一个查询会返回什么,同时,也回答了以下这些问题: 可以在 GRROUP BY 之后使用 WHERE 吗?...可以对窗口函数返回的结果进行过滤吗?...(不行,窗口函数是 SELECT 语句里,而 SELECT 是在 WHERE 和 GROUP BY 之后) 可以基于 GROUP BY 里的东西进行 ORDER BY 吗?...(可以,ORDER BY 基本上是在最后执行的,所以可以基于任何东西进行 ORDER BY) LIMIT 是在什么时候执行?(在最后!)
慢查询 面试官:知道MySQL慢查询吗? MySQL的慢查询日志可以记录执行时间超过阈值的SQL查询语句,所以我们可以利用该日志查找出哪些SQL语句执行效率差,从而对SQL语句进行优化。...我们可以遵循第三范式,把冗余的字段抽出一个新的商品表,当要查询订单明细时只需要把两表通过商品id进行连接即可。 面试官:遵循第二范式就一定最优?...group by分组要尽量覆盖索引。如果使用非索引字段进行分组,MySQL只能进行全表扫描后建立临时表才能得出分组结果。...关于如何避免索引失效,大家可以阅读我出版的《JavaGetOffer》专栏关于【MySQL索引】的文章。 三、从减少不必要的查询的角度。...索引的设计有以下设计原则,大家在实际业务开发中应该尽量遵循这些原则,可以帮你避开不少坑。 经常进行order by排序、group by分组、join多表联结查询的字段应该建立索引。
在这个例子中,所以我们指定了按“班级”分组(partition by 班级) 2.按成绩排名 order by子句的功能是对分组后的结果进行排序,默认是按照升序(asc)排列。...这是因为,group by分组汇总后改变了表的行数,一行只有一个类别。而partiition by和rank函数不会减少原表中的行数。例如下面统计每个班级的人数。...比如前3名是并列的名次,排名是正常的1,2,3,4。 这三个函数的区别如下: 最后,需要强调的一点是:在上述的这三个专用窗口函数中,函数后面的括号不需要任何参数,保持()空着就可以。...我单独用sum举个例子: 如上图,聚合函数sum在窗口函数中,是对自身记录、及位于自身记录以上的数据进行求和的结果。...不仅是sum求和,平均、计数、最大最小值,也是同理,都是针对自身记录、以及自身记录之上的所有数据进行计算,现在再结合刚才得到的结果(下图),是不是理解起来容易多了?
磁盘文件中的数据块,虽然是分开写入的,但终究要合并去重,并进行分组计数。 磁盘文件中的每个数据块内部,记录的字段内容是不存在重复的。...合并缓冲区会分成 N 份(N = 磁盘文件中数据块的数量),每一份对应一个数据块,用于存放从数据块中读取的一批记录。 合并缓冲区 7. 红黑树怎么去重和分组计数?...我给 t_group_by 表的 e1 字段建了索引,所以 SQL 执行时就不需要先对表中记录进行排序了。...红黑树写满过,部分数据在磁盘文件中,部分数据在内存中。需要先把内存中红黑树所有结点数据写入到磁盘文件中,组成最后一个数据块。 所有数据都写入磁盘文件之后,就可以开始进行合并去重和分组计数了。...如果不一样,说明字段内容不重复,对 top Merge_chunk 中的最小记录进行分组计数,然后回到 ③ ,继续进行下一轮循环。
这个SQL查询关联两个数据表,一个是攻击IP用户表主要是记录IP的信息,如第一次攻击时间,地址,IP等等,一个是IP攻击次数表主要是记录每天IP攻击次数。而需求是获取某天攻击IP信息和次数。...这里看来的确是索引的问题,导致了临时表啊,然而再看看ROWS的数量,原来的9W变成了1552W,这不是不是捡了芝麻掉了西瓜吗?...8、执行distinct去重复数据 9、执行order by字句 10、执行limit字句 这里得知,Mysql 是先执行内联表然后再进行条件查询的最后再分组,那么想想这SQL的条件查询和分组都只是一个表的...,内联后数据就变得臃肿了,这时候再进行条件查询和分组是否太吃亏了,我们可以尝试一下提前进行分组和条件查询,实现方法就是子查询联合内联查询。...总结: 其实这个优化方案跟我上一篇文章MYSQL一次千万级连表查询优化(一)解决原理一样,都是解决了内联表后数据就变得臃肿了,这时候再进行条件查询和分组就太吃亏了,于是我们可以先对单表进行条件处理,再进行连表查询
我喜欢用实际案例说明问题,本文使用泰坦尼克号沉船事件中的乘客信息表: 实现几个简单分析需求: 找出多人(2人或以上)一起登船的组的数量 列出这些人的信息 是否存在最幸运的亲朋好友(多人一起登船,同时全部人都获救...也就是说,如果你的数据任务最终需要输出 Excel 文件,vba是"数据展示"过程的最佳自动化工具。 可惜,现实中的大部分需求并不单纯,都需要进行"数据处理",那么 vba 中又是如何处理数据?...来看一个数据分析相关的处理需求: 我们注意到,有些人是亲朋好友一起上船,比如: 从"票根号"一样,可以看出来他们是一起上船 从"住址"一样,可以看出来他们是一家四口 我们需要统计出有多少组这些2人或以上登船的...用最后一个需求说明: 是否存在最幸运的亲朋好友(多人一起登船,同时全部人都获救)? 假如说,我只给你一组相同"票根号"的乘客数据,该如何判断他们都是生还呢? 只要看"生还"列是否都为1就可以。...方式非常多,除了上面的做法,还可以"生还列求和,看看是否等于记录行数" 前一个需求中使用的 filter 就是可以接受一段逻辑(函数),pandas 负责帮你分组,你只需要在函数中描述出符合条件的逻辑即可
---- 此时问题又出现了,User Records部分中的多条记录该用什么样的数据结构进行保存呢? 数组吗?— 每条记录的大小都是不固定的,不能使用数组 链表吗?...这里我们可以把六条记录算为一组,用一个槽指向当前组最后一条记录结束的位置,然后在当前页中单独开辟一块地方存放这些槽,这些槽组成了一个数组,就可以使用二分法进行快速查找,定位记录到某个组,某个组内再进行链表遍历...所以分组是按照下边的步骤进行的: 初始情况下一个数据页里只有最小记录和最大记录两条记录,它们分属于两个分组。...---- 如何进行数据查找 假设目前表中的记录比较少,所有的记录都可以被存放到一个页中,那么我们查找数据的时候,也只需要在一个页中进行查找即可: 以主键为搜索条件 这个查找过程我们已经很熟悉了,可以在页目录中使用二分法快速定位到对应的槽...---- 大部分情况下我们表中存放的记录都是非常多的,需要好多的数据页来存储这些记录。在很多页中查找记录的话可以分为两个步骤: 定位到记录所在的页。 从所在的页内中查找相应的记录。
数据库由一个或多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。 在 InnoDB 中存在两种表空间的类型:共享表空间和独立表空间。...若设置完成,则所有表中页的大小都为innodb_page_size,不可以再次对其进行修改,除非通过mysqldump导入和导出操作来产生新的库。 innoDB存储引擎中,常见的页类型有: 1....第 1 组,也就是最小记录所在的分组只有 1 个记录; 最后一组,就是最大记录所在的分组,会有 1-8 条记录; 其余的组记录数量在 4-8 条之间。...这里我以上面的图示进行举例,5 个槽的编号分别为 0,1,2,3,4,我想查找主键为 9 的用户记录,我们初始化查找的槽的下限编号,设置为 low=0,然后设置查找的槽的上限编号 high=4,然后采用二分查找法进行查找...如果通过 B+ 树的索引查询行记录,首先是从 B+ 树的根开始,逐层检索,直到找到叶子节点,也就是找到对应的数据页为止,将数据页加载到内存中,页目录中的槽(slot)采用二分查找的方式先找到一个粗略的记录分组
领取专属 10元无门槛券
手把手带您无忧上云