2.1 工作原理 外部循环:首先,数据库系统会从外表中选择一行。 内部循环:然后,对于外表中的这一行,数据库系统会在内表中逐行搜索匹配的行。这个搜索过程会根据JOIN条件(如等于、大于等)进行。...内部表扫描:对于内存中保存的外部行的每一行,算法在内部表中执行搜索操作,查找满足JOIN条件的匹配行。这个步骤与标准嵌套循环连接相似,但是在一个数据块的所有外部行都处理完之后才会继续。...当两个或多个表需要根据某些条件进行连接时,索引连接能够显著减少搜索和匹配所需的时间。...索引覆盖:如果索引包含了查询所需的所有列(即覆盖索引),那么数据库系统可以避免回表操作,进一步提高性能。回表操作是指在使用索引找到匹配的行后,还需要访问表中的数据页来获取其他列的值。...这些列通常是连接条件中用于匹配的列。 构建哈希表:数据库系统会扫描其中一个表(通常称为构建表或内部表),并使用哈希函数将哈希键的值映射到一个哈希表中。
外部循环逐行消耗外部输入表。内部循环为每个外部行执行,在内部输入表中搜索匹配行。最简单的情况是,搜索时扫描整个表或索引;这称为单纯嵌套循环联接。如果搜索时使用索引,则称为索引嵌套循环联接。...如果将索引生成为查询计划的一部分(并在查询完成后立即将索引破坏),则称为临时索引嵌套循环联接。...在多对多的关联表上执行Merge Join时,通常需要使用临时表进行操作。...例如A join B使用Merge Join时,如果对于关联字段的某一组值,在A和B中都存在多条记录A1、A2...An、B1、B2...Bn,则为A中每一条记录A1、A2...An,都必须在B中对所有相等的记录...在 Argument 列中,如果操作执行一对多联接,则 Merge Join 运算符将包含 MERGE:() 谓词;如果操作执行多对多联接,则该运算符将包含 MANY-TO-MANY MERGE:()
返回结果: 子查询通常返回一个结果集,这个结果集可以是一个值、一列值、一行值或者多行多列值。 用途: 子查询的主要用途之一是在一个查询中使用另一个查询的结果。...加速连接操作: 在进行连接操作时,如果连接的列上存在索引,可以减少连接的复杂度,提高连接操作的速度。这对于关联多个表的查询非常重要。...支持全文搜索: 对于包含全文搜索的数据库,全文索引可以加速搜索操作,提高搜索的效率。 减少磁盘 I/O 操作: 索引可以减少需要读取的数据量,从而减少磁盘 I/O 操作,提高数据库系统的整体性能。...以下是一些建议,可以帮助你编写高效的子查询: 选择适当的子查询类型: 子查询可以是标量子查询(返回单一值)、行子查询(返回一行多列)、列子查询(返回单列多行)或表子查询(返回多行多列)。...在子查询中,需处理多个值、NULL值,提升可读性,防止嵌套过深。常规错误包括遗漏连接条件、处理NULL不当、性能问题、嵌套深度过大、过度使用子查询。
在数据库查询中,投影操作用于指定需要返回的列或字段。投影下推的目的是在查询执行之前尽早地应用投影操作,减少返回的数据列数量,从而降低数据传输和存储开销。...对于给定的列或属性,收集该列的数据值,并确定最小值和最大值。 桶的划分:根据收集到的最小值和最大值,将数据范围划分为多个桶(或区间)。桶的数量和大小可以根据具体需求进行调整。...在进行基于规则的重写之后,数据库管理系统(DBMS)将为查询枚举不同的计划并估算它们的成本: 单个关系。 多个关系。 嵌套子查询。...---- 动态规划在连接成本分析中的应用 对于每个表,枚举连接操作的顺序: 例如:左深连接树#1,左深连接树#2… 对于每个操作符,枚举计划: 例如:哈希连接,排序-合并连接,嵌套循环连接… 对于每个表格...实际情况更加复杂… ---- 嵌套查询 数据库管理系统(DBMS)将嵌套子查询在WHERE子句中视为接受参数并返回单个值或一组值的函数。
在5.5以后的版本中,MySQL通过引入INLJ和BNL算法来优化嵌套执行, 今天主要介绍三种join算法 Nested-Loop Join (NLJ) 和 Index Nested-Loop Join...基于索引的嵌套循环连接算法(Index Nested-Loop Join (INLJ) 索引嵌套循环连接算法是基于嵌套循环算法的改进版,其优化的思路,主要是为了减少了内层循环匹配次数,就是通过外层数据循环与内存索引数据进行匹配...可以通过调整join_buffer_size缓存大小 join_buffer_size的默认值是256K,join_buffer_size的最大值在MySQL 5.1.22版本前是4G,而之后的版本才能在...都是在Simple Nested-Loop Join 的算法的基础上 减少嵌套的循环次数, 不同的是 Index Nested-Loop Join 是通过索引的机制减少内层表的循环次数,Block...) 4、减少不必要的字段查询(字段越少,join buffer 所缓存的数据就越多,外层表的循环次数就越少) 当用到BNLJ时,字段越少,join buffer 所缓存的数据就越多,外层表的循环次数就越少
,比如or或and查询对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,因此就不会导致索引失效的问题了 如果从Explain执行计划的type列的值是index_merge可以看出MySQL使用索引合并的方式来执行对表的查询...,那么在相同数据页中能放下的索引值也就越少,这就意味着搜索索引需要的查询时间也就越长,进而查询的效率就会降低,所以我们可以适当的选择使用前缀索引,以减少空间的占用和提高查询效率 比如,邮箱的后缀都是固定的...,就是遍历驱动表(外层表),每读出一行数据,取出连接字段到被驱动表(内层表)里查找满足条件的行,组成结果行 要提升join语句的性能,就要尽可能减少嵌套循环的循环次数 一个显著优化方式是对被驱动表的join...字段建立索引,利用索引能快速匹配到对应的行,避免与内层表每一行记录做比较,极大地减少总循环次数。...另一个优化点,就是连接时用小结果集驱动大结果集,在索引优化的基础上能进一步减少嵌套循环的次数 如果难以判断哪个是大表,哪个是小表,可以用inner join连接,MySQL会自动选择小表去驱动大表 避免使用
如果两个列的值通过等式关联,那么MySQL能够把其中一个列的WHERE条件传递到另一列上。 列表IN()的比较。 在很多的数据库系统中,IN()完全等同于多个OR条件的子句,因为这两者是完全等价的。...但是在MySQL中,它将IN()列表中的数据先进行排序,然后通过二分查找的方式来确定列表中的值是否满足条件,这是一个O(log n)复杂度的操作,等价转换为OR查询的复杂度为O(n)。...当前MySQL关联执行的策略如下:MySQL对任何关联都执行嵌套循环关联操作,即MySQL现在一个表中循环取出单条数据,然后再嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为止。...关联查询优化器则通过评估不同顺序时的成本来选择一个代价最小的关联顺序。它会遍历每一个表然后逐个做嵌套循环计算每一棵可能的执行计划树的成本,最后返回一个最优的执行计划。...当搜索空间非常大时,优化器会选择使用“贪婪”搜索的方式查找“最优”的关联顺序。有时候,各个查询的顺序是不能随意安排的,比如左连接等,这时候关联优化器就可以根据这些规则大大减少搜索空间。
使用块嵌套循环(BNL)时,较大的连接缓冲区意味着可以将驱动表(外部表)的所有行都存储在连接缓冲区中; 使用块嵌套循环(BNL)时,较大的连接缓冲区意味着对连接操作的右侧表进行的顺序访问就越多。...type 列的值为 ref 或 eq_ref 时,就意味着该表使用了 BKA 算法。...在构建哈希表阶段,MySQL将连接操作的第一个表插入到哈希表中,其中哈希表的键是连接操作的连接列。...,并将它们插入到一个哈希表中,其中哈希表的键是连接列(在此示例中为column1)的值。...MySQL将从t2中读取每一行,并将连接列的值用作哈希表的键来查找哈希表。如果哈希表中存在匹配的行,则将它们作为连接操作的结果返回。
对于包含子查询的查询语句来说,就可能涉及多个SELECT关键字,所以在包含子查询的查询语句的执行计划中,每个SELECT关键字都会对应一个唯一的id值: explain select * from s1...这两个属性比较好理解,但是注意一点: 在使用index访问方法来查询某个表时,possible_keys列是空的,而key列展示的是实际使用到的索引 注意: possible_keys列中的值并不是越多越好...---- Using index 当我们的查询列表以及搜索条件中只包含属于某个索引的列,也就是在可以使用索引覆盖的情况下,在Extra列将会提示该额外信息。...我们前边又说过,采用嵌套循环连接算法的两表连接过程中,被驱动表可是要被访问好多次的,如果这个被驱动表中的数据特别多而且不能使用索引进行访问,那就相当于要从磁盘上读好几次这个表,这个I/O代价就非常大了,...设计MySQL的大叔把这种加入了join buffer的嵌套循环连接算法称之为基于块的嵌套连接(Block Nested-Loop Join)算法。
然后在该类中执行另一个搜索。下一个搜索将找到文档中的所有标记(包括,不包括之类的部分匹配项)。最后,将对象赋值给变量“name”。...提取6.png 循环将遍历整个页面源,找到上面列出的所有类,然后将嵌套数据追加到列表中: 提取7.png 注意,循环后的两个语句是缩进的。循环需要用缩进来表示嵌套。...数组有许多不同的值,通常使用简单的循环将每个条目分隔到输出中的单独一行: 输出2.png 在这一点上,“print”和“for”都是可行的。启动循环只是为了快速测试和调试。...“Names”是列的名称,“results”是要打印的列表。pandas可以创建多列,但目前没有足够的列表来利用这些参数。...最简单的方法之一是重复上面的代码,每次都更改URL,但这种操作很烦。所以,构建循环和要访问的URL数组即可。 ✔️创建多个数组存储不同的数据集,并将其输出到不同行的文件中。
by中的错,为啥是可能呢,因为mysql 8.0以上版本是不会报错,默认只展示第一个值。...尤其第二段代码的书写方式我们需要注意,当select中有多列时,经常会在group by后面漏写某个字段,导致报错。 4 权限错误 在公司里面我们要对数据查询时,首先需要申请权限。...5 逗号错误 select后面的多个字段之间要用逗号分隔开来,且只能有一个。最后一个字段与from之间不可以有逗号。有的时候要么会多写逗号,要么会漏写,都会导致程序报错。...当列名与列名之间的逗号放在列名之后时,很容易被我们忽视,忽视就会导致程序报错。这也就是为什么建议大家把列与列之间的逗号要放在列名前,而不是放在列名后,可以减少代码错误率。...6 括号错误 代码中的括号都是成对出现的,没有成对出现的括号都是会报错的。如果是只有一对括号时是不容易出错的,当有多层括号嵌套时,最容易少写一个或多写一个,根据报错定位的位置仔细检查即可。
前期经过沟通达成一致的需求,在开发后期忘做了 多个模块关联同一份代码,需求文档只提到某一模块的改动,错估改动影响范围 方案: 同一功能有多种实现方案,思考尽可能多的可能性,给产品出选择题,在理解上达成一致...在不断的讨论+思考实现方案的循环下,需求和思路会越来越清晰。...,在完成阶段性功能时, 逐一检查git提交文件 和团队一起讨论解决方案,自己想出来的不一定是最好的,不成熟的方案会导致后期维护成本高,隐藏bug多 示例1: 录入编辑器功能比较复杂,大致流程是 OCR识别的题目结构...a function 方案: 给函数的参数默认值 对函数的参数和返回值在使用时先做类型校验,或者统一类型 代码逻辑 bug原因: 重复代码太多,在后期修改同一个功能时需要重复改多份,容易漏改 一个函数包含的代码太多...: 单层级的if else,可以用switch或hash代替 嵌套型的if else,将易判断的逻辑放在前面,处理完后使用return退出后续判断,减少嵌套 不断自我review,自我质疑: 如果下次我要改这块东西好不好改
2 应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。...16 使用表的别名(Alias):当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误。...22 在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。 23 尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。...31 在所有的存储过程中,能够用SQL语句的,我绝不会用循环去实现!...36 避免死锁,在你的存储过程和触发器中访问同一个表时总是以相同的顺序;事务应经可能地缩短,在一个事务中应尽可能减少涉及到的数据量;永远不要在事务中等待用户输入。
它们在实现上有一些区别,下面是它们的主要区别: B树: B树是一种多叉树,每个节点可以有多个子节点,通常在实现中有一个上限,即节点的最大子节点数目。...减少查询次数:通过合并多个查询或使用JOIN等操作来减少查询次数。 优化查询语句:使用合适的SQL语句,避免使用SELECT *,只查询所需的列。...8.循环依赖是指在Spring容器中,两个或多个Bean之间相互引用,形成了循环的依赖关系。为了解决循环依赖,可以使用构造器注入或使用@Lazy注解。...执行EXPLAIN SELECT ...命令,可以查看查询的执行计划,包括使用了哪些索引以及执行的顺序。 检查索引列是否被修改: 如果索引列的值在查询时被修改了,那么索引可能会失效。...检查是否存在列组合索引: 如果查询条件中的多个列可以组合在一起使用索引,可以考虑创建列组合索引,以提高查询性能。
尽量减少使用,搜索时间更长 尽量不要以通配符开头进行搜索,这样最慢。...'; 若要匹配反斜杠,则需要写成 \\\ 匹配多实例 需要对正则匹配的数目控制时,应该使用重复元字符。 常见有 6 种 * 0或多个 + 一个或多个 ?...,返回一列的最小值/最大值 SUM 函数,返回一列的最大值 聚集不同值 ALL 返回所有行数,默认行为 DISTINCT 只返回包含不同的值 组合聚集函数 在一个查询语句允许采用多个函数。...嵌套在其他查询中的查询语句。...一般游标配合数据的重复循环处理,MySQL 循环使用 REPEAT-UNTIL。 第二十五章 使用触发器 什么是触发器? 在某个表数据发生变更时自动执行一条 MySQL 语句的东西。
JOIN 查询: Nested Loops(嵌套循环连接):对应 JOIN 语句中的嵌套循环连接操作,用于根据连接条件从两个表中获取匹配的行。...Nested Subquery(嵌套子查询):对应 SQL 语句中的嵌套子查询,用于获取多行多列的子查询。...join查询 当使用 JOIN 查询时,数据库会根据连接条件将两个或多个表中的数据进行关联。这样可以从多个表中获取相关的数据,以满足复杂的查询需求。...下面是 JOIN 查询中常见的连接方法的详细介绍: 嵌套循环连接(Nested Loops Join): 嵌套循环连接是最基本的连接方法之一,它通过嵌套循环的方式将两个表中的数据进行匹配。...在执行嵌套循环连接时,数据库会选择一个表作为外部表,然后遍历外部表的每一行,对于每一行,再遍历内部表的每一行,查找满足连接条件的匹配行。
,那什么又是嵌套循环呢?...嵌套大家应该都能理解,就是一层套一层;那循环呢,你可以理解成是 for 循环。...一个是驱动表,那另一个就只能是非驱动表了,在 join 的过程中,其实就是从驱动表里面依次(注意理解这里面的依次)取出每一个值,然后去非驱动表里面进行匹配,那具体是怎么匹配的呢?...上面的 left join 会从驱动表 table A 中依次取出每一个值,然后去非驱动表 table B 中从上往下依次匹配,然后把匹配到的值进行返回,最后把所有返回值进行合并,这样我们就查找到了table...04.Block Nested-Loop Join 理想情况下,用索引匹配是最高效的一种方式,但是在现实工作中,并不是所有的列都是索引列,这个时候就需要用到 Block Nested-Loop Join
2、应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认值,但大多数时候应该使用 NOT NULL,或者使用一个特殊的值,如 0,-1 作为默认值。...16、使用表的别名(Alias):当在 SQL 语句中连接多个表时,请使用表的别名并把别名前缀于每个 Column 上。这样一来,就可以减少解析的时间并减少那些由 Column 歧义引起的语法错误。...22、在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。 23、尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。...36、避免死锁,在你的存储过程和触发器中访问同一个表时总是以相同的顺序;事务应经可能地缩短,在一个事务中应尽可能减少涉及到的数据量;永远不要在事务中等待用户输入。...、GROUP BY 和 ORDER BY 子句中使用有索引的列,保持索引简单,不在多个索引中包含同一个列。
2、整数类型中,TINYINT使用8位存储空间,BIGINT为64位,一般做SIMHASH选择64位做特征值应该是基于这个,转成16进制有16位。其中指定的宽度只在命令行中展示时起作用。...7、BIT可以在一列中存储一个或多个0/1值,最大长度为64。问题是存进去是二进制,但是展示出来却是十进制的。...8、在选择多列索引的时候,通常把选择性更大的放到前面(该条件下统计数量更小的)。...比如多列索引中有sex列,但是用户查询时没有选择sex,则使用IN(‘M’,’F’)来满足使用索引的条件。...MYSQL对任何关联都执行嵌套循环关联操作,即先在一个表中循环取出单条数据,然后嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的行为为止。
4 Block Nested-Loop Join(快嵌套循环连接) 如果存在索引,那么会使用 index 的方式进行 join,如果 join 的列没有索引,被驱动表要扫描的次数太多了。...注意: 这里缓存的不只是关联表的列,sql中select 后面要查询的列也会缓存起来。 在一个有 N 个 join 关联的 SQL 中会分配 N-1 个 join buffer。...所以查询的时候尽量减少不必要的字段,可以 让 join buffer 中存放更多的列。 其原理如下图。 其开销统计如下。...join buffer size 的最大值在 32 位系统可以申请 4G,而在 64 位操做系统下可以申请大于 4G 的 join_buffer空间(64 位 Windows 除外,其大值会被截断为 4GB...减少外层循环的次数。 (4)INNER JOIN 时,MySQL 会自动将小结果集的表选为驱动表 。选择相信 MySQL 优化策略。 (5)能够直接多表关联的尽量直接关联,不用子查询。
领取专属 10元无门槛券
手把手带您无忧上云