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

执行一条sql都经历了什么?

查询缓存 连接成功后,即开始要正式执行 select 语句了,但是在执行查询之前,mysql 会去看下有没有该条语句的缓存内容,如果有缓存直接从缓存中读取并返回数据,不再执行后面的步骤了,结束查询操作。...只要对表有一个更新,这个表上的所有缓存就会被清空,因此你刚缓存下来的内容,还没来得及用就被另一个更新给清空了。...分析器主要对 sql 语句进行语法和语义分析,检查单词是否拼写错误,还有检查要查询的表或字段是否存在。...通常对于同一个 sql 语句,mysql 内部可能存在多种执行方案,比如存在多个索引时,该选择哪个索引,多个表关联查询时,怎么确认各个表的连接顺序。...这里你可能会问,为什么不在连接器中就直接判断权限呢,这里我觉得可能是因为 mysql 要查询的表并不一定仅限于 sql 语句中字面上的那些表,有的时候可能需要经过分析器和优化器之后才能确定到底要怎么执行

53250

MySQL 性能优化总结

解释:      连接的表越多,其编译的时间和连接的开销也越大,性能越不好控制。     最好是把连接拆开成较小的几个部分逐个顺序执行。     优先执行那些能够大量减少结果的连接。     ...所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用union all而不是union 1.4.7,避免类型转换   这里所说的“类型转换”是指where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换...但是我们要记得有些语句隐形的用到了等值连接,如: SELECT A.id,A.name,B.id,B.name FROM A,B WHERE A.id = B.id;   推荐:能用inner join...索引优化 如果针对sql语句已经没啥可以优化的,那我们就要考虑加索引了(下面有对索引的详细介绍,以及Mysql底层为什么选用b+树的介绍)。...如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间

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

    SQL学习笔记(基础部分)

    SQL学习笔记 基础部分 SQL语法 数据库语言对大小写不敏感,用分号分隔每条数据库语言 SQL通用数据类型 SQL开发,在创建SQL表时要确定每个列要存储的数据类型,每一列都需要一个列名和确定的数据类型...charlist] 不在字符列中的任何单一字符 # %运用 SELECT * FROM Customers WHERE City LIKE '%es%'; #_运用 SELECT * FROM Customers...连接 SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段。...on table1_name.column = table2_name.column #基于表之间的共同字段相连接 INNER JOIN:如果表中有至少一个匹配,则返回行 LEFT JOIN:即使右表中没有匹配...#默认选取不同值,如果要允许重复值,使用union all SQL select into 将一个表中的数据复制到另一个中 SELECT * INTO newtable [IN externaldb

    86120

    Mysql_基础

    不指定该项时,被联合查询结果集合中的重复行将只保留一行。 联合查询时,查询结果的列标题为第一个查询语句的列标题。因此,要定义列标题必须在第一个查询语 句中定义。...连接可以在SELECT 语句的FROM子句或WHERE子句中建立,似是而非在FROM子句中指出连接时有助于 将连接操作与WHERE子句中的搜索条件区分开来。...当为一个表中的记录建立备份时,这种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前,你可以先用这种方法把它们拷贝到另一个表中。...但是,使用本节中讲述的SQL语句,你可以绕过这两个问题。 例如,假设你想从一个表中删除一个字段。使用SELECT INTO 语句,你可以创建该表的一个拷贝,但不包含要删除的字段。...当为一个表中的记录建立备份时,这种形式的INSERT 语句是非常有用的。在删除一个表中的记录之前,你可以先用这种方法把它们拷贝到另一个表中。

    2.4K70

    初学者SQL语句介绍

    2.使用 From 子句指定记录源     From 子句说明的是查询检索记录的记录源;该记录源可以是一个表或另一个存储查询。    ...用 As 对字段名进行别名化     为什么在查询中对字段命以别名,或重新命名,这样做的原因有两个:     ☆所涉及的表的字段名很长,想使字段在结果集中更易处理一些。    ...·在 Union 语句中的全部 select_list 必须有相同数量的列、兼容的数据类型并且按照同样的顺序出现。     ·在结果集中,列名来自第一个 Select 语句。    ...8.连接查询     在实际使用过程中经常需要同时从两个表或者两个以上表中检索数据。连接就是允许同时从两个表或者两个以上表中检索数据,指定这些表中某个或者某些列作为连接条件。...在 SQL Server 中,可以使用两种连接语法形式,一种是 Ansi 连接语法形式,这是连接用在 From 子句中,另外一种是 SQL Server 连接语句形式,这是连接用在 Where 子句中。

    1.7K30

    oracle数据库sql语句优化(循环语句有几种语句)

    2、使用表的别名: 当在SQL语句中连接多个表时, 尽量使用表的别名并把别名前缀于每个列上。这样一来, 就可以减少解析的时间并减少那些由列歧义引起的语法错误。...如果有3个以上的表连接查询, 那就需要选择交叉 表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。...4、WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他 WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾...19、用EXISTS替代IN、用NOT EXISTS替代 NOT IN: 在基于基础表的查询中经常需要对另一个表进行联接。...索引只能告诉我们什么存在于表中, 而不能告诉你什么不在表中。 (2)’||’是字符连接函数。就象其他函数那样, 停用了索引。 (3)’+’是数学函数。和其他数学函数一样, 停用了索引。

    2.9K10

    数据库sql常见优化方法

    以前刚开始做项目的时候,开发经验尚浅,每次遇到查询比较慢时,项目经理就会问:是不是又用select * 了?查询条件有没有加索引?一语惊醒梦中人,赶紧检查..果然如此!...4)尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,引擎将放弃使用索引而进行全表扫描,如: select id from person_info where...,这样是可以索引查找的,如:select id from person_info where name like ‘abc%’; 8)如果在 where 子句中使用参数或对字段进行表达式操作,也会导致全表扫描...12)对于多张大数据量(这里几百条就算大了)的表JOIN,要先分页再JOIN,否则逻辑读会很高,性能很差。...可以改为select count(id) from table。 14)尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。

    2.4K30

    数据库知识学习,数据库设计优化攻略(十)

    like 不能完成的复杂搜索,如搜索一个单词或一个短语,搜索一个与另一个单词或短语相 近的单词或短语,或者是搜索同义词; (2)实现全文搜索比实现 like 搜索更容易(特别是复杂的搜索); 3.3.2...SQL 语句优化 ➢ 在查询中不要使用 select * 为什么不能使用,地球人都知道,但是很多人都习惯这样用,要明白能省就省,而且这样查询数据库不能利用“覆盖索引”了 ➢ 尽量写 WHERE...C、杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。...F、不要写一些没有意义的查询,比如 SELECT * FROM EMPLOYEE WHERE 1=2 3.3.3 WHERE 使用原则 1)在下面两条 select 语句中: select * from...2)在下面的 select 语句中: select * from tab where a=… and b=… and c=…; 若有索引 index(a,b,c),则 where 子句中字段的顺序应和索引中字段顺序一致

    63110

    SQL命令记录

    mysql> W nowarning w 不在每一个语句后面显示警告。 mysql> w 要获得服务器端的帮助信息,键入“help contents” 1.1....确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。 FOREIGN KEY - 外键,保证一个表中的数据匹配另一个表中的值的参照完整性。...SELECT column_name(s) FROM table1UNIONSELECT column_name(s) FROM table2; SELECT INTO 通过 SQL,您可以从一个表复制信息到另一个表...SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。支持使用WHERE、JOIN等操作符。MYSQL不支持,但支持INSERT INTO…. SELECT。...SELECT column_name(s)INTO newtable [IN externaldb]FROM table1; INSERT INTO SELECT 通过 SQL,您可以从一个表复制信息到另一个表

    22020

    数据分析系列——SQL数据库

    删除数据表 创建和修改数据时每次只能创建或修改一张数据表,删除数据表时,一次可以删除多张数据表。删除语句如下: ? 也可以 ? 4 表的操作基础 ? 约束表中的数据 1、为什么要使用约束?...1、子查询 所谓子查询就是在一个查询语句中可以使用另一个查询语句中得到的结果作为条件进行查询,常用于两个表之间的查询引用。常用的子查询关键字有:IN、ANY、SOME、以及EXISTS。...(3)、SOME关键字,与ANY关键字的用法比较相似,但是意义却不同,SOME通常用来比较满足查询中的任意一个值,而ANY要满足所有值。 ? 上面语句中的“=some”与“in”功能相同。...(1)、同一个表的连接——自连接 查询语句不仅可以查询多张表的内容,还可以同时连接多次同一张数据表,把这种同一张表的连接称为自连接。但是在查询时要分别为同一张表设置不同的别名。 ?...(2)、查询出额外数据的连接——外连接 在前面的查询语句中,查询结果全部都是需要符合条件才能够被查出,如果执行语句中没有符合条件的结果,那么在结果中就不会有任何记录。

    2.1K80

    SQLServer中的CTE通用表表达式

    这一常规使开发人员能获取一个行集,并立即将该行集加入到 SELECT 语句中的其他表、视图和用户定义函数中。另一种方案是使用视图而不是派生表。这两种方案都有其各自的优势和劣势。...另一个方法是使用派生表针对聚合数据编写一个查询 通过将 SQL 语句移到 FROM 子句中并对其进行查询,可实现这一点。 视图通常用来分解大型的查询,以便用更易读的方式来查询它们。...要创建派生表,在由括号包围的 FROM 子句中移动 SELECT 语句即可。接着就能像表或视图一样查询或者联接它。图 2 中的代码解决的查询与图 1 所解决的相同,但使用的是派生表而不是视图。...尽管只能在派生表所在的语句中访问它们,但是,表通常使查询变得更难以阅读和维护。如果想要在同一个批处理中多次使用派生表,此问题会变得更加严重,因为随后必须复制和粘贴派生表才能重复使用它。...结束语   比起那些在查询中使用复杂的派生表或引用那些在 T-SQL 批处理外部定义的视图的方案,CTE 使得编写 T-SQL 更具可读性。

    3.9K10

    重磅:关于hive的join使用必须了解的事情

    Hive支持连接表的以下语法: 本文主要讲hive的join 编写连接查询时要考虑的一些要点如下,不同版本支持的情况可能会有些许不同: 1,可以编写复杂的链接表达式,如下 SELECT a.* FROM...FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key2) 3,如果每个表在连接子句中使用了相同的列,则Hive将多个表上的连接转换为单map...OUTER JOIN语义应该符合标准的SQL规范。 7,连接发生在where之前。因此,如果要限制连接的OUTPUT,则需要在WHERE子句中,否则应该在JOIN子句中。...使用LEFT SEMI JOIN的限制是右边的表只能在连接条件(ON子句)中引用,而不能在WHERE或SELECT子句中引用。...11,如果被连接的表在连接列上被分桶,并且一个表中的桶的数量是另一个表中的桶的数量的倍数,则桶可以彼此连接。

    7.4K111

    MySQL【知识改变命运】05

    1:where的基本用法练习(比较运算符) 基本操作:查询英语的同学 如果english为NULL,会自动过滤掉,NULL比较特殊 查询语⽂成绩⾼于英语成绩的同学 这个过程:先读取表中每行记录...,然后把where 条件进行筛选,然后把符合条件的记录放在临时表中,最终返回给客户端; 总分在 200 分以下的同学 我们都知道可以给列改名 那如果我们用修改后的别名作为条件可以使用吗?...where语句是不能用别名当作过滤条件: 因为第一步:from 找到这个表 第二步:定位符合条件的数据行 where 第三步:根据过滤后的结果集中抽取要显示的列,表达式 所有在执行where字句时...再where 里面没办法用别名判断,为什么在oder by里面可以呢?...所有语文成绩不为NULL的同学,按语⽂成绩从⾼到低排序 注意 • 查询中没有ORDER BY ⼦句,返回的顺序是未定义的,永远不要依赖这个顺序 • ORDER BY ⼦句中可以使⽤列的别名进

    6610

    京东提前批研发面经

    【每日一语】真实人生中,我们往往在大势底定无可更改时才迟迟进场,却又在胜败未分的浑沌中提早离席。——翁贝托·埃科《开头与结尾》 京东提前批Java开发 本来想等面完再发个面经,等了半个月了没等到。...7 为什么要划分年轻代和老年代,方法区是否会垃圾回收,还问了gc时要扫描哪些位置,说了gc root,他问具体呢,虚拟机栈的局部变量,然后说其他忘了。...1、表的主键、外键必须有索引; 2、数据量超过300的表应该有索引; 3、经常与其他表进行连接的表,在连接字段上应该建立索引; 4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 5...10 为什么select方法默认可以不加锁呢,明明可能会有并发冲突,我说根据隔离级别判断是否加锁,他说可重复读级别下select是不加锁的,为什么。...Spring,servlet,Spring的工厂方法 7 MySQL的select1和select *有什么区别,为什么加索引访问比不加索引要快。 8 负载均衡的几种算法,缓存的几种淘汰策略。

    41320

    面试官:不会sql优化?出门右转顺便带上门,谢谢!

    ,比如是使用索引排序还是文件排序 2、EXPLAIN中的列 (1)id 1、标识select所属的行,sql语句中有多少个select就有多少个id,并且id的顺序是按照select出现的顺序增长的...,不在From语句中 例如: explain select id,name,(select class_id from class_student) from student; ?...第一个select被标记为外查询来执行,如果UNION被From子句中的子查询包含,那么它的第一个Select会被标记为DERIVED。...,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。...join buffer 使用了连接缓存 impossible where where子句的值总是false,不能用来获取任何元素 distinct 一单mysql找到了与形相联合匹配的行,就不在搜索了

    84520

    SQL 性能调优

    阅读目录 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效) (2)WHERE子句中的连接顺序 (3)SELECT子句中避免使用 ‘ * ‘ (4)减少访问数据库的次数 (5)在SQL*Plus...回到顶部 (2)WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE...能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的 回到顶部 (14) 使用表的别名(Alias) 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,...(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT....换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例: ... where status 'INVALID'; 对这个查询,可以改写为不使用NOT: select *

    3.2K10

    SQL 性能调优

    (2)WHERE子句中的连接顺序 ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE...在这单表查询统计的情况下,如果要过滤的条件没有涉及到要计算字段,那它们的结果是一样的,只是where可以使用rushmore技术,而having就不能,在速度上后者要慢如果要涉及到计算的字 段,就表示在没计算之前...能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的 (14) 使用表的别名(Alias) 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来...(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT....换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例: ... where status 'INVALID'; 对这个查询,可以改写为不使用NOT: select

    2.8K60

    MySQL从删库到跑路(五)——SQL查询

    全连接: 全连接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。MySQL不支持全外连接。...FROM子句中的表或视图可通过内连接或全连接按任意顺序指定;但是,用左或右向外连接指定表或视图时,表或视图的顺序很重要。...5、过滤条件 ON条件:过滤两个连接表笛卡尔积形成中间表的约束条件。 WHERE条件:在有ON条件的SELECT语句中是过滤中间表的约束条件。...如果要限制分组结果,只能使用HAVING子句。...7、匹配指定字符以外的字符 “[^字符集合]”匹配不在指定集合中的任何字符。

    2.6K30

    SQL基础--> 数据处理(DML、RETURNING、MERGE INTO)

    在INSERT 子句中随意列出列名和他们的值。 字符和日期型数据应包含在单引号中。 --查看emp表的表结构 SQL> DESC emp; Name Null?...子查询中的值列表应与INSERT 子句中的列名对应 --克隆表结构 SQL> CREATE TABLE test AS SELECT * FROM scott.emp WHERE 0 = 1;...六、在DML语句中使用WITH CHECK OPTION 子查询可以用来指定DML语句的表和列 WITH CHECK OPTION 关键字可以防止更改不在子查询中的行 --deptno列不在select...SQL> PRINT avg_salary; AVG_SALARY ---------- 2554.6875 十、MERGE INTO 将一个表中的行合并到另一个表中 MERGE INTO...ON 子句用于表之间的连接 WHEN MATCHED THEN 子句指明当条件满足时则对目的表执行何种操作(此处是UPDATE操作) WHEN NOT MATCHED THEN 子句指明当条件不满足时对目的表执行何种操作

    87920

    SQL必知必会总结2-第8到13章

    可以对分组进行嵌套 GROUP BY子句中列出的每一列都是检索列或者有效的表达式(但是不能是聚集函数) 如果在SELECT中使用表达式,则必须在GROUP BY子句中使用相同的表达式,而不是使用别名 除了聚集函数外...,SELECT语句中的每列都必须在GROUP BY子句中列出 如果分组中包含具有NULL的行,则NULL将作为一个分组返回;如果列中出现多个NULL,它们将分成一个组 GROUP BY子句必须在WHERE...BY items, order_num; -- 先分组再过滤,最后排序输出 SELECT子句顺序 在这里总结一下SELECT子句的相关顺序: 子句 说明 是否必须使用 SELECT 要返回的列或者表达式...AND OrderItems.order_num = Orders.order_num AND prod_id = 'RGAN01' 创建高级联结 使用表别名 在SQL语句中可以给表取别名: SELECT...AND prod_id = 'RGAN01' 3、外联结 有时候我们需要将一个表中的行和另一个表中行相关联,但是有时候也需要包含那些没有关联行的行记录,比如下面的场景中: 对每个顾客下的订单数进行统计

    2.3K21
    领券