首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一条 sql 的执行过程详解

如果没有开启则直接跳过。...比如一个典型的例子是这样的: 表T,对A、B、C列建立联合索引(A,B,C),在进行查询的时候,当sql查询条件是:select xx where B=x and A=x and C=x.很多人会以为是用不到索引的...,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理...从索引列的第一列开始,检查其在 where 条件中是否存在,若存在并且 where 条件仅为 =,则跳过第一列继续检查索引下一列,下一索引列采取与索引第一列同样的提取规则;若 where 条件为 >=、...>、则跳过索引第一列,将其余 where 条件中索引相关列全部加入到 Index Filter 之中;若索引第一列的 where 条件包含 =、>=、>、条件,则将此条件以及其余

69530

一条 sql 的执行过程详解

如果没有开启则直接跳过。...比如一个典型的例子是这样的: 表T,对A、B、C列建立联合索引(A,B,C),在进行查询的时候,当sql查询条件是:select xx where B=x and A=x and C=x.很多人会以为是用不到索引的...,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理...从索引列的第一列开始,检查其在 where 条件中是否存在,若存在并且 where 条件仅为 =,则跳过第一列继续检查索引下一列,下一索引列采取与索引第一列同样的提取规则;若 where 条件为 >=、...>、则跳过索引第一列,将其余 where 条件中索引相关列全部加入到 Index Filter 之中;若索引第一列的 where 条件包含 =、>=、>、条件,则将此条件以及其余

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    SQL语句执行过程详解

    如果没有开启则直接跳过。...比如一个典型的例子是这样的: 表T,对A、B、C列建立联合索引(A,B,C),在进行查询的时候,当sql查询条件是:select xx where B=x and A=x and C=x.很多人会以为是用不到索引的...,但其实会用到,虽然索引必须符合最左原则才能使用,但是本质上,优化器会自动将这条sql优化为:where A=x and B=x and C=X,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理...从索引列的第一列开始,检查其在 where 条件中是否存在,若存在并且 where 条件仅为 =,则跳过第一列继续检查索引下一列,下一索引列采取与索引第一列同样的提取规则;若 where 条件为 >=、...>、则跳过索引第一列,将其余 where 条件中索引相关列全部加入到 Index Filter 之中;若索引第一列的 where 条件包含 =、>=、>、条件,则将此条件以及其余

    2.3K30

    MySQL中的执行计划

    可能用到的索引 key 实际上使用的索引 key_len 实际使用到的索引长度 ref 当使用索引列等值查询时,与索引列进行等值匹配的对象信息 rows 预估的需要读取的记录条数 filtered 某个表经过搜索条件过滤后剩余记录条数的百分比...如果该索引列可以存储NULL值,则key_len比不可以存储NULL值时多1个字节。 对于变长字段来说,都会有2个字节的空间来存储该变长列的实际长度。...、unique_subquery、index_subquery其中之一时,ref列展示的就是与索引列作等值匹配具体的值 > EXPLAIN SELECT * FROM s1 WHERE key1 = '...xiaohaizi.s1.id,这说明在对被驱动表进行访问时会用到PRIMARY索引,也就是聚簇索引与一个列进行等值匹配的条件,于s2表的id作等值匹配的对象就是xiaohaizi.s1.id列 2.9...执行计划的filtered列就代表查询优化器预测在这9827条记录中,有多少条记录满足其余的搜索条件,也就是common_field = ‘a’这个条件的百分比。

    86920

    《SQL Cookbook》 - 第三章 多表查询

    如果习惯在FROM子句中,而不是WHERE子句中,写连接逻辑,则可以使用JOIN子句。 如果从可阅读性角度来说,表关联的时候,关联条件写在ON子句中,过滤条件写在WHERE子句中,会更让人理解。...从一个表检索和另一个表不相关的行 基于共同列将两个表连接起来,返回一个表的所有行,不论这些行在另一个表中是否存在匹配行,然后,只存储这些不匹配的行即可。...,则只会返回一行数据,如果返回两行,说明这两个表中没有完全相同的数据。...运算比较中使用NULL NULL不等于任何值,甚至不能和其自身进行比较,但是对从NULL列返回的数据进行评估,就像评估具体的值一样。...(1) nvl(expr, 0) 如果第一个参数为null,则返回第二个参数。 如果第一个参数为非null,则返回第一个参数。

    2.4K50

    当谈 SQL 优化时谈些什么?

    1、索引的左前缀规则;索引中的列由左向右逐一匹配,如果中间某一列不能使用索引则后序列不在查询中不再被使用。...例如,如果有一个3列索引(str_col1,col2,col3),其中str_col1为字符串,则对(str_col1)、(str_col1,col2)和(str_col1,col2,col3)上的查询进行了索引...4、如果表达式中存在类型转换或者列上有复杂函数则与该列不匹配索引中的列。...Index Filter 的提取规则:同样从索引列的第一列开始,检查其在 where 条件中是否存在:若存在并且 where 条件仅为 =,则跳过第一列继续检查索引下一列,下一索引列采取与索引第一列同样的提取规则...;若 where 条件为 >=、>、则跳过索引第一列,将其余 where 条件中索引相关列全部加入到Index Filter之中;若索引第一列的where条件包含 =、>=、>、<

    5.9K20

    Mysql学习笔记,持续记录

    如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。 group by 子句必须出现在 where 子句之后,order by 子句之前。...也就是索引列的cardinality的值与表中数据的总条数差距越大,即使查询的时候使用了该索引作为查询条件,实际存储引擎实际查询的时候使用的概率就越小。...2. null和数值进行比较 MySQL 使用三值逻辑 —— TRUE, FALSE 和 UNKNOWN。任何与 NULL 值进行的比较都会与第三种值 UNKNOWN 做比较。...如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。...如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。 5. 包含于匹配 like匹配时,可以用instr函数方案代替,效率的话还得自己测一测。

    1.2K50

    【MySQL】01_运算符、函数

    运算符 描述 例子 = 检查两个操作数的值是否相等,如果是,则条件为真(true) (a = b)is false != 检查两个操作数的值是否相等,如果值不相等则条件为真(true) (a !...> 检查左操作数的值是否不大于右操作数的值,如果是,则条件为真(true) (a < b)is true 作用与“=”运算符作用一样,区别在于“” 可以用来对NULL进行判断 (ab...LIKE运算符也可以匹配指定的字符串,但与REGEXP不同,LIKE匹配的字符串如果在文本中间出现,则找不到它,相应的行也不会返回。...在对多列进行排序的时候,首先排序的第一列必须有相同的列值,才会对第二列进行排序。如果第 一列数据中所有值都是唯一的,将不再对第二列进行排序。...单行函数 操作数据对象 接受参数返回一个结果 只对一行进行变换 每行返回一个结果 可以嵌套 参数可以是一列或一个值 数值函数 基本函数 角度与弧度互换函数 三角函数 指数与对数 进制间的转换

    2.5K30

    【重学 MySQL】十七、比较运算符的使用

    IS NULL IS NULL 是一个条件表达式,用于检查某个列的值是否为NULL。如果列的值是NULL,则表达式的结果为TRUE;否则,结果为FALSE。...IS NOT NULL IS NOT NULL 也是一个条件表达式,但它用于检查某个列的值是否不是NULL。如果列的值不是NULL,则表达式的结果为TRUE;否则,结果为FALSE。...如果参数中有NULL值,则LEAST函数会忽略NULL值,但如果所有参数都是NULL,则结果也是NULL。...同样地,如果参数中有NULL值,GREATEST会忽略它们,但如果所有参数都是NULL,则结果也是NULL。...如果需要在模式中包含这些字符作为文字字符,你可能需要使用ESCAPE子句来指定一个转义字符。 使用通配符进行搜索时,MySQL会扫描表中的每一行,并检查列值是否与模式匹配。

    20210

    ClickHouse | 查询

    限制HAVING如果不执行聚合则无法使用 7 Join 支持的联接类型 所有标准 SQL JOIN 支持类型: INNER JOIN,只返回匹配的行。...m 如果没有 ORDER BY 子句显式排序结果,结果的行选择可能是任意的和非确定性的 9 Limit by 10 Order by 11 Where prewhere .PREWHERE与WHERE...在数据过滤之后再读取SELECT声明的列字段以补全其余属性。所以在一些场合下,PREWHERE相比WHERE而言,处理的数据更少,性能更高。 clickhouse提供了自动 . ....化优化的功能,会在条件合适的情况下将where替换为prewhere。...默认已经开启了此参数 . 12 Sample 语法 举例 13 Union all 结果列通过它们的索引进行匹配(在内部的顺序 ).如果列名称不匹配,则从第一个查询中获取最终结果的名称 对联合执行类型转换

    8410

    2024Mysql And Redis基础与进阶操作系列(5)作者——LJS

    SQL语言的规则与规范 2.1 基本规则 SQL 可以写在一行或者多行。...“_”:只能匹配一个字符。 REGEXP 运算符 REGEXP运算符用来匹配字符串,语法格式为: expr REGEXP 匹配条件 。 如果expr满足匹配条件,返回1; 如果不满足,则返回0。...若expr或匹配条件任意一个为NULL,则结果为NULL。 ^ 匹配以该字符后面的字符开头的字符串 $ 匹配以该字符前面的字符结尾的字符串 . 匹配任何一个单字符 [...]...category_id = 'c002'; 聚合查询-NULL值的处理 1、count函数对null值的处理 如果count函数的参数为星号(*),则统计所有记录的个数。...product group by category_id ; 注意: 如果要进行分组的话,则SELECT子句之后,只能出现分组的字段和统计函数,其他的字段不能出 现 分组之后的条件筛选-having

    26330

    SQL数据查询之——单表查询

    如果有GROUP BY子句,则将结果按的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。...二、SQL单表查询(仅涉及一个表的查询) 1.选择表中的若干列 (1)查询指定列 查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student; 查询全体学生的姓名、学号、所在系...WHERE Sno='201215121' 此处介绍下字符匹配 谓词LIKE可以用来进行字符串的匹配。...其一般语法格式如下: [NOT] LIKE'匹配串>' [ESCAPE ''] 其含义是查找指定的属性列值与匹配串>相匹配的元组。...MIN([DISTINCT|ALL]) 求一列值中的最小值 如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。

    1.8K50

    mysql优化概述

    ,与索引列进行等值匹配的对象信息 rows 预估的需要读取的记录条数 filtered 某个表经过搜索条件过滤后剩余记录条数的百分比 Extra 额外提示信息 执行计划各列详细信息 id 查询语句中每出现一个...InnoDB只会存一个大概的值,并不精确) const: 根据主键或者唯一二级索引列(unique)与常数进行等值匹配。...如EXPLAIN SELECT * FROM s1 WHERE id = 5, 一次就能匹配到 eq_ref: 在连接查询时,如果被驱动表是通过主键或者唯一二级索引(unique)等值匹配的方式进行访问的...ref : 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是ref fulltext: 全文索引 ref_or_null: 当对普通二级索引进行等值匹配查询,该索引列的值也可以是...test.s1.id,这说明在对被驱动表进行访问时会用到PRIMARY索引,也就是聚簇索引与一个列进行等值匹配的条件,于s2表的id作等值匹配的对象就是test.s1.id列(注意这里把数据库名也写出来了

    55220

    SQL数据查询之——单表查询

    如果有GROUP BY子句,则将结果按的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。...二、SQL单表查询(仅涉及一个表的查询) 1.选择表中的若干列 (1)查询指定列 查询全体学生的学号与姓名 SELECT Sno,Sname FROM Student; 查询全体学生的姓名、学号、所在系...WHERE Sno='201215121' 此处介绍下字符匹配 谓词LIKE可以用来进行字符串的匹配。...其一般语法格式如下: [NOT] LIKE'匹配串>' [ESCAPE ''] 其含义是查找指定的属性列值与匹配串>相匹配的元组。...MIN([DISTINCT|ALL]) 求一列值中的最小值 如果指定 DISTINCT 短语,则表示在计算时要取消指定列中的重复值。

    1.7K10

    必知必会——关于SQL中的NOT IN优化

    如果不是您想要的结果,我将在这里告诉您如何解决。 首先,一个简单的情况:如果“ x”和“ y”是使用NOT NULL子句创建的列,则它们永远不会为NULL。让我们考虑其他情况。...在开始之前,我们需要记住另外两个SQL细节: WHERE针对行测试条件,并且仅当此条件为TRUE时才让行通过(拒绝FALSE和UNKNOWN)。...因为WHERE消除了条件不为TRUE的行,所以消除了房屋A。从SQL的角度来看,上面两个SELECT的结果是正确的。现在轮到您决定它们是否符合您的期望。 如果符合预期,那么一切都很好。...如果我做两次重写中的任何一个,我就会以某种方式向MySQL声明我希望NULL是我的NOT IN的明确匹配项。另一个好处是,这还使MySQL可以更“积极地”进行优化。...),因为NOT IN与NULL的行为与关系代数中反联接的定义不匹配。

    4.9K40

    mysql优化概述

    ,与索引列进行等值匹配的对象信息 rows 预估的需要读取的记录条数 filtered 某个表经过搜索条件过滤后剩余记录条数的百分比 Extra 额外提示信息 执行计划各列详细信息 id 查询语句中每出现一个...InnoDB只会存一个大概的值,并不精确) const: 根据主键或者唯一二级索引列(unique)与常数进行等值匹配。...eq_ref: 在连接查询时,如果被驱动表是通过主键或者唯一二级索引(unique)等值匹配的方式进行访问的,则对该被驱动表的访问方法就是eq_ref。...如: 从执行计划的结果中可以看出,s1作为驱动表,s2作为被驱动表,s2的访问方法是eq_ref表明在访问s2表的时候可以通过主键的等值匹配来进行访问 ref : 当通过普通的二级索引列与常量进行等值匹配时来查询某个表...test.s1.id,这说明在对被驱动表进行访问时会用到PRIMARY索引,也就是聚簇索引与一个列进行等值匹配的条件,于s2表的id作等值匹配的对象就是test.s1.id列(注意这里把数据库名也写出来了

    46510

    MySQL(二)数据的检索和过滤

    ,就是正确的) MySQL如同大多数DBMS一样,不需要单条SQL语句后加分号,但特定DBMS可能必须在单条SQL语句后加分号;如果是多条SQL语句必须加分号(;),如果使用的是MySQL命令行,则必须用分号结束...criteria),搜索条件你也被称为过滤条件(filter condition) 1、where子句 select语句中,数据根据where子句中指定的搜索条件进行过滤,where子句在表名(from...= N; where子句中,对过滤的值,有的用单引号,有的不用,原因在于:单引号用于限定字符串,如果将值与串类型的列进行比较,则需要,如用来与数值列比较,则不用引号 3、范围值检查 select column...column=X和Y的column2的行(in操作符用来指定匹配值的清单的关键字,功能和or相当) 圆括号在where子句中还有另一种用法,in操作符用来指定条件范围,范围中的每个条件都可以进行匹配;in...MySQL后跟的搜索模式利用通配符匹配而不是直接相等匹配进行比较 1、百分号(%)通配符 在搜索串中,%表示任何字符出现任意次数;通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符 select

    4.1K30

    【21】进大厂必须掌握的面试题-65个SQL面试

    右连接: MySQL中的右连接用于返回右表中的所有行,但仅返回满足连接条件的左表中的匹配行。 完全联接: 当任何表中都存在匹配项时,完全联接将返回所有记录。...索引分为三种: 唯一索引: 如果列是唯一索引的,则此索引不允许字段具有重复的值。如果定义了主键,则可以自动应用唯一索引。 聚集索引: 该索引对表的物理顺序进行重新排序,并根据键值进行搜索。...这意味着,如果任何事务的一部分失败,则整个事务都会失败,并且数据库状态将保持不变。 一致性: 一致性可确保数据必须符合所有验证规则。简而言之,您可以说您的事务永远都不会离开数据库而不完成其状态。...持久性: 持久性意味着如果事务已提交,则它将发生之间可能发生的任何事情,例如断电,崩溃或任何类型的错误。 Q24。在SQL中,”触发”是什么意思?...该语句允许条件更新或将数据插入表中。如果存在一行,则执行UPDATE;如果不存在,则执行INSERT。 Q39。递归存储过程是什么意思?

    6.9K22

    【MySQL】02_子查询与多表查询

    # 其中,若员工department_id与location_id为1800 的department_id相同,则locatio为’Canada’,其余则为’USA’ SELECT employee_id...注意:如果我们使用了表的别名,在查询字段中、过滤条件中就只能使用别名进行代替, 不能使用原有的表名,否则就会报错。...`employee_id`; 非自连接:上面写的都属于非自连接 角度3:内链接 vs 外链接 内连接 合并具有同一列的两个以上的表的行, 结果集中不包含一个表与另一个表不匹配的行 外连接 两个表在连接过程中除了返回满足连接条件的行以外还返回左...没有匹配的行时, 结果表中相应的列为空(NULL)。 如果是左外连接,则连接条件中左边的表也称为 主表 ,右边的表称为 从表 。...如果是右外连接,则连接条件中右边的表也称为 主表 ,左边的表称为 从表 。

    2.8K40
    领券