1、了解背景情况 让厂家找到相关语句,一看却是个UPDATE语句,再看SQL语法,是个带.的表和不带.的表,根本不是什么DBLINK,就是同一个数据库上的不同用户而已。...既然慢,那就慢慢看语句吧,语句不复杂,就是从一张表根据条件更新到另一张表 UPDATE语句比较烦人,一般情况下我都会把语句改写成SELECT语句 2、查看执行计划 对改写后的语句进行执行,并且查看执行计划...看表结构看分区看索引看表数据看索引分布 看表结构主要看ALL_TABLES,ALL_INDEXES,ALL_IND_COLUMNS,ALL_TAB_PARTITIONS 其实看那么多,不一定有用,直接在pl/sql...在WHERE条件中,发现用到了分区条件,和内层表的三个索引列 4、进行优化 通过以上分析,可以知道在外层表上随便建一个索引,应该就会取得较好的效果。...CREATE INDEXAAA ON dl_jlddl_r_sjd(YHBH) 5、评估效果 创建完索引后,运行脚本,120秒足以,再看执行计划也使用到了索引
他创建了一张数据库表,表里的字段只有主键索引(id)和联合索引(a,b,c),然后他执行的 select * from t where c = 0; 这条语句发现走的是索引,他就感觉很困惑,困惑在于两点...第二点,在这个数据表加了非索引字段,执行同样的查询语句后,怎么变成走的是全表扫描呢? 我先跟大家解释下,什么是最左匹配原则?...a 时,就无法使用到联合索引,比如以下这种情况,就是不符合最左匹配规则: where b = 0; where c = 0; where b = 0 and c =0; where c = 0 and...为什么 select * from t where c = 0; 这条不符合联合索引的最左匹配原则的查询语句走了索引查询呢?...为什么这个数据表加了非索引字段,执行同样的查询语句后,怎么变成走的是全表扫描呢?
接下来,通过一条sql语句的执行来深入了解MySQL各个组件功能以及其作用。...像 select1 id from table1 这条sql语句就会在解析时报错,因为没有识别到 select 这个关键字(对列名、表名的检查和验证是在预处理阶段)。...「优化器」阶段了,sql如何执行、使不使用索引、使用哪个索引都是在这个阶段处理,《MySQL优化的底层逻辑》中有写到,这里不过多赘述。...一条查询SQL语句的执行流程: 客户端通过连接器连接MySQL服务。 连接成功后向SQL接口发送SQL语句请求。...2.2 更新语句 以上就是一条查询 sql 的执行流程,那么接下来我们看看一条更新语句如何执行的呢?
一条SQL语句是如何执行的? 首发于GitHub开源项目: Java超神之路 你好,我是杜少雄。 今天和大家聊一聊MySQL的基础架构。我们经常说,看一个事千万不要直接陷入细节里。应该先鸟瞰全貌。...当一条SQL语句执行的时候,我们看到的是最后的执行结果。却不知道这条语句在MySQL内部是如何执行的。 总览 所以今天我们把MySQL拆解一下,看看里边有哪些零件。下边是MySQL的基本架构示意图。...你可以先对每个组件的名字有个印象,接下来我会结合开头提到的那条 SQL 语句,带你走一遍整个执行流程,依次看下每个组件的作用。 1. 连接器 你会先连接到这个数据库上,这时候接待你的就是连接器。...你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。 MySQL 从你输入的"select"这个关键字识别出来,这是一个查询语句。...小结 今天介绍了 MySQL 的逻辑架构,希望你对一个 SQL 语句完整执行流程的各个阶段有了一个初步的印象。 由于篇幅的限制,我只是用一个查询的例子将各个环节过了一遍。
♣ 题目部分 在Oracle中,使用with优化一条SQL语句。...♣ 答案部分 当面试官问到这类问题时,读者可以根据自己的经验谈谈是自己是如何优化曾经碰到的SQL语句的即可,下面作者会给出一些自己曾遇到过很多次的SQL优化的案例。...在SQL优化中,有一个很重要的原则就是减少对大表的查询次数,尤其是要避免在同一个SQL中多次扫描同一张大表,若有这种情况可以考虑SQL改写,下面给出几种常见的改写方式: 先根据条件提取数据到临时表中,然后再做连接...,即利用WITH语句来改写SQL。...使用WITH子查询的优点就在于其复杂查询语句只需要执行一次,但结果可以在同一个查询语句中被多次使用。 ① 有的相似的语句可以用MAX+DECODE函数来处理。
一条select语句执行流程 第一步:连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。如果用户名密码验证通过后,连接器会到权限表里面查出你拥有的权限。...之后该连接的权限验证都依赖于刚查出来的权限。 第二步:查询缓存 当获取连接后,一条SELECT语句会先去查询缓存,看之前是否执行过。如果获取到缓存后就执行返回,不然继续后面的步骤。...第三步:分析器 分析器首先会做“词法分析”,MYSQL会识别出SQL语句里面的字符串是什么以及代表什么。接下来就是“语法分析器”,分析SQL的语法问题。...第四步:优化器 优化器会对SQL的执行顺序,使用哪个索引进行优化。确定SQL的执行方案。 第五步:执行器 执行器执行SQL语句会对权限进行校验,如果有权限,就打开表继续执行。...打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。 图片 一条update语句执行流程 update语句除了会执行上面的五步,还会涉及两个重要的日志模块。
1. select 语句执行过程 一条 select 语句的执行过程如上图所示 1、建立连接 连接器会校验你输入的用户名和密码是否正确,如果错误会返回提示,如果正确,连接器会查询当前用户对于的权限。...连接器的作用就是校验用户权限 2、查询缓存 MySQL 中有个缓存的概念,当你在执行一条 SQL 查询语句时,MySQL 会先去缓存中查看是否有对应的记录,如果有,则直接返回,如果没有,则取数据库中查询...对于 select 语句而言,MySQL 拿到这条 SQL 语句后,识别出 select 关键词,知道这是一条查询语句,然后再取识别 from 以及表名,识别字段,这个步骤是词法分析。...词法分析完成后还需要进行语法分析,也就是判断这条语句的语法是否正确,比如你 select 写成了 selct,那么语法分析就会检验出来 4、优化器 优化器职责是对 sql 语句进行优化,比如这条语句该用什么索引...所有引擎都可以使用 redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL语句的底层实现不同罢了,但结果相同。...一般情况下,大部分SQL语句在不同的数据库上是通用的,但我们知道每个数据库都有自己独有的特性,像在MySql数据库中,可以使用substr(取字符串),trim(去空格),ifnull(空值处理函数),...1,一条查询的sql语句先执行的是 FROM student 负责把数据库的表文件加载到内存中去,如图1.0中所示。...5,HAVING num >= 2对上图所示临时表中的数据再次过滤,与WHERE语句不同的是HAVING 用在GROUP BY之后,WHERE是对FROM student从数据库表文件加载到内存中的原生数据过滤...,而HAVING 是对SELECT 语句执行之后的临时表中的数据过滤,所以说column AS otherName ,otherName这样的字段在WHERE后不能使用,但在HAVING 后可以使用。
一条 SQL 查询语句是如何执行的?...一个用户连接后,即使你试用管理员账号对这个用户的权限做修改,也不会影响已经存在的连接的权限,修改完成后,只有再新建的连接才会使用新的权限设置。...好在MySQL 也提供了这种“按需使用”的方式。你可以将参数 query_cache_type 设置成DEMAND,这样对于默认的SQL语句都不使用查询缓存。...你输入的是由多个字符串和空格组成的一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么,MySQL从你输入的" select"这个关键字识别出来,这是一个查询语句。...t1 ,再判断 t1 里面 c 的值是否等于10 这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一种方案。
MySQL自带的缓存系统应用场景非常有限,它要求SQL语句必须一模一样,多一个空格,变一个大小写都被认为是两条不同的SQL语句 缓存失效非常频繁。...SQL语句打碎成一个个单词,比如一条简单的SQL语句,会打碎成8个符号,每个符号是什么类型,从哪里开始到哪里结束。...,Java 的编译器、百度搜索引擎如果要识别语句,必须也要有词法语法分析功能。...MySQL作者担心我们写的SQL太垃圾,所以有设计出一个叫做查询优化器的东东,辅助我们提高查询效率。 2.3.1 什么是查询优化器? 一条 SQL语句是不是只有一种执行方式?...或者说数据库最终执行的 SQL是不是就是我们发送的 SQL? 不是。一条 SQL 语句是可以有很多种执行方式的,最终返回相同的结果,他们是等价的。
查询缓存 每次查询都会缓存查询结果,相同语句再次查询时直接返回缓存结果,缓存结果会在修改表信息时自动失效。 3. 分析器 语法分析,判断sql语句是否正确 4....优化器 生成执行计划,索引选择,自动优化sql 5. 执行器 真正执行sql查询
本文通过一条sql语句来讲述mysql的基础架构 select * from jiuxiao_admin_log where user_id =1000; ?...好了现在我们大致了解了mysql的零件,那么现在我们将通过一条查询sql,从连接器到执行器来讲清楚每层作用。...你可以将参数query_cache_type设置成DEMAND,这样对于默认的SQL语句都不使用查询缓存。...而对于你确定要使用查询缓存的语句,可以用SQL_CACHE显式指定,像下面这个语句一样 select SQL_CACHE * from T where ID=10; 分析器 如果没有命中查询缓存,就要开始真正执行语句了...的值是否等于1000 这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。
本篇文章将通过一条 SQL 的执行过程来介绍 MySQL 的基础架构。...,一个用户成功建立连接后,即使管理员对这个用户的权限做了修改,也不会影响已经存在连接的权限,修改完后,只有再新建的连接才会使用新的权限设置。...可以将参数 query_cache_type 设置成 DEMAND,对于默认的 SQL 语句都将不使用查询缓存。...这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。...总结 主要通过对一个 SQL 语句完整执行过程进行讲解,介绍 MySQL 的逻辑架构,MySQL 主要包括连接器、查询缓存、分析器、优化器、执行器这几个模块。
点击上方蓝字关注我们 相信做后端的同学肯定离不开一个话题,就是 mysql,大家也花式的执行过各种各样的 sql 语句,然后得到返回结果,那么一条 sql 语句执行究竟经历了哪些步骤呢?...分析器 对客户端传来的 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,这种优化会为了底层能够匹配到索引,同时在这个阶段是自动按照执行计划进行预处理...,mysql会计算各个执行方法的最佳时间,最终确定一条执行的sql交给最后的执行器 执行器 执行器会调用对应的存储引擎执行 sql。
例如一个简单的SQL语句: mysql> select * from T where ID=10; ? 在 MYSQL 内部是怎么执行的呢?我们从头梳理一下。...分析器 client 和 server 连接完成了,向 server 发送 sql 请求,连接器不会直接处理,会转给分析器,对这条 sql 进行词法分析,例如识别出来“select”关键字,知道这是一个查询语句...这两种执行方法的逻辑结果是一样的,但是执行的效率会有不同,而优化器的作用就是决定选择使用哪一个方案。 在比如一个表中有多个索引,具体使用哪一个?也是由优化器来决定。 ?...执行器的基本执行逻辑: 调用存储引擎“取满足条件的第一行”这个接口,然后循环取“满足条件的下一行”这个接口,将所有满足条件的行组成结果集返还给客户端。 ? 至此,这个语句就执行完了。...其实 server 层中还有一个查询缓存,一个语句进来后先看是否在缓存中有,如果有就直接返回,如果没有再走分析器,但由于实际环境中查询缓存的作用很小,上面的描述中就没有提及,而且在 MySQL 8 中已经去掉了查询缓存
这个时间是由参数 wait_timeout 控制的,默认值是 8 小时#查询缓存之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中key 是查询的语句,value 是查询的结果所以...,只要有对一个表的更新,这个表上所有的查询缓存都会被清空所以,MySQL有这样的一个配置,你可以将参数 query_cache_type 设置成 DEMAND,这样对于默认的 SQL 语句都不使用查询缓存...而对于你确定要使用查询缓存的语句,可以用 SQL_CACHE 显式指定 mysql> select SQL_CACHE * from T where ID=10;注意:MySQL 8.0 版本直接将查询缓存的整块功能删掉了...#优化器优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。...同一条sql可以不同的拼接组合查询 但是每一种执行的效率时间都会有所不同 而优化器就是选择最优的组合去查询#执行器要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如下所示
这是图解MySQL的第2篇文章,这篇文章会通过一条SQL更新语句的执行流程让大家清楚地明白: 什么是InnoDB页?缓存页又是什么?为什么这么设计? 什么是表空间?...为什么需要这么多种类型的日志? 正文开始! ---- 之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的流程又是什么样子呢?...SQL更新语句的执行总结——初版 有了事务日志之后,我们来简单总结一下更新操作的流程,这是一个简化的过程。 name 原值是chanmufeng。...加上两阶段提交之后我们再来看一下SQL更新语句的执行流程。 7....SQL更新语句的执行总结——终版 客户端发送更新命令到MySQL服务器,经过处理连接、解析优化等步骤; Server层向InnoDB存储引擎要id=1的这条记录; 存储引擎先从缓存中查找这条记录,有的话直接返回
前两天发了一条SQL慢的原因有哪些,在那篇文章我没有说到优化器之类的,我觉得如果配合一条SQL是如何执行的,会更好,所以特地找了一篇。...MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你对一个表更新的话,这个表上的所有的查询缓存都会被清空。对于不经常更新的数据来说,使用缓存还是可以的。...3) 分析器 MySQL 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干嘛的,分析器也会分为几步: 第一步,词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如...二 语句分析 2.1 查询语句 说了以上这么多,那么究竟一条 sql 语句是如何执行的呢?其实我们的 sql 可以分为两种,一种是查询,一种是更新(增加,更新,删除)。...进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。 2.2 更新语句 以上就是一条查询 sql 的执行流程,那么接下来我们看看一条更新语句如何执行的呢?
大家好,又见面了,我是你们的朋友全栈君。...创建索引一般分为在线索引和非在线索引,在线与非在线的区别:非在线锁表,优先创建索引,此时DML都被阻塞,所以快;相反,在线锁的是行而非表,通过临时表进行索引的创建,所以不会影响DML操作,但副作用就是慢...另外如果是大表,那么采用非在线而导致锁表所带来的影响可能会很大。一句话,生产环境不停服的脚本操作,建议使用online。 1、创建索引。...DROP INDEX 索引名; 4、查看某个表的索引,表名需大写。 SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名' 5、查看某个表哪些列有索引。...如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如果我们有表A和表B, 我想把我的表A的Col1内的数据更新到表B的Col1里面,那么我们怎么做呢?...Microsoft SQL例子 UPDATE scores SET scores.name = p.name FROM scores s INNER...UPDATE scores s, people p SET scores.name = people.name WHERE s.personId = p.id 高阶使用...那么,有没有办法一次性,将上传的表与需要的数据合并后再根据条件更新呢?...MERGE SQL使用 The MERGE statement is used to manipulate (INSERT, UPDATE, DELETE) a target table by referencing
领取专属 10元无门槛券
手把手带您无忧上云