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

一条SQL语句优化

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秒足以,再看执行计划也使用到了索引

28810

一条 SQL 语句引发思考

他创建了一张数据库表,表里字段只有主键索引(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; 这条不符合联合索引最左匹配原则查询语句走了索引查询呢?...为什么这个数据表加了非索引字段,执行同样查询语句后,怎么变成走是全表扫描呢?

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

一条SQL语句是如何执行

一条SQL语句是如何执行? 首发于GitHub开源项目: Java超神之路 你好,我是杜少雄。 今天和大家聊一聊MySQL基础架构。我们经常说,看一个事千万不要直接陷入细节里。应该先鸟瞰全貌。...当一条SQL语句执行时候,我们看到是最后执行结果。却不知道这条语句在MySQL内部是如何执行。 总览 所以今天我们把MySQL拆解一下,看看里边有哪些零件。下边是MySQL基本架构示意图。...你可以先每个组件名字有个印象,接下来我会结合开头提到那条 SQL 语句,带你走一遍整个执行流程,依次看下每个组件作用。 1. 连接器 你会先连接到这个数据库上,这时候接待你就是连接器。...你输入是由多个字符串和空格组成一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。 MySQL 从你输入"select"这个关键字识别出来,这是一个查询语句。...小结 今天介绍了 MySQL 逻辑架构,希望你一个 SQL 语句完整执行流程各个阶段有了一个初步印象。 由于篇幅限制,我只是用一个查询例子将各个环节过了一遍。

1.1K50

【DB笔试面试588】使用with优化一条SQL语句

♣ 题目部分 在Oracle中,使用with优化一条SQL语句。...♣ 答案部分 当面试官问到这类问题时,读者可以根据自己经验谈谈是自己是如何优化曾经碰到SQL语句即可,下面作者会给出一些自己曾遇到过很多次SQL优化案例。...在SQL优化中,有一个很重要原则就是减少大表查询次数,尤其是要避免在同一个SQL中多次扫描同一张大表,若有这种情况可以考虑SQL改写,下面给出几种常见改写方式: 先根据条件提取数据到临时表中,然后再做连接...,即利用WITH语句来改写SQL。...使用WITH子查询优点就在于其复杂查询语句只需要执行一次,但结果可以在同一个查询语句中被多次使用。 ① 有的相似的语句可以用MAX+DECODE函数来处理。

40720

MySQL:一条SQL语句执行过程

一条select语句执行流程 第一步:连接器 连接器负责跟客户端建立连接、获取权限、维持和管理连接。如果用户名密码验证通过后,连接器会到权限表里面查出你拥有的权限。...之后该连接权限验证都依赖于刚查出来权限。 第二步:查询缓存 当获取连接后,一条SELECT语句会先去查询缓存,看之前是否执行过。如果获取到缓存后就执行返回,不然继续后面的步骤。...第三步:分析器 分析器首先会做“词法分析”,MYSQL会识别出SQL语句里面的字符串是什么以及代表什么。接下来就是“语法分析器”,分析SQL语法问题。...第四步:优化器 优化器会对SQL执行顺序,使用哪个索引进行优化。确定SQL执行方案。 第五步:执行器 执行器执行SQL语句会对权限进行校验,如果有权限,就打开表继续执行。...打开表时候,执行器就会根据表引擎定义,去使用这个引擎提供接口。 图片 一条update语句执行流程 update语句除了会执行上面的五步,还会涉及两个重要日志模块。

22120

一条 SQL 语句是如何执行

1. select 语句执行过程 一条 select 语句执行过程如上图所示 1、建立连接 连接器会校验你输入用户名和密码是否正确,如果错误会返回提示,如果正确,连接器会查询当前用户对于权限。...连接器作用就是校验用户权限 2、查询缓存 MySQL 中有个缓存概念,当你在执行一条 SQL 查询语句时,MySQL 会先去缓存中查看是否有对应记录,如果有,则直接返回,如果没有,则取数据库中查询...对于 select 语句而言,MySQL 拿到这条 SQL 语句后,识别出 select 关键词,知道这是一条查询语句,然后再取识别 from 以及表名,识别字段,这个步骤是词法分析。...词法分析完成后还需要进行语法分析,也就是判断这条语句语法是否正确,比如你 select 写成了 selct,那么语法分析就会检验出来 4、优化器 优化器职责是 sql 语句进行优化,比如这条语句该用什么索引...所有引擎都可以使用 redo log 是物理日志,记录是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录是这个语句原始逻辑,比如“给 ID=2 这一行 c 字段加 1 ”。

64720

详解一条SQL语句执行过程

同时,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 后可以使用

56920

一条 SQL 查询语句是如何执行

一条 SQL 查询语句是如何执行?...一个用户连接后,即使你试用管理员账号这个用户权限做修改,也不会影响已经存在连接权限,修改完成后,只有再新建连接才会使用权限设置。...好在MySQL 也提供了这种“按需使用方式。你可以将参数 query_cache_type 设置成DEMAND,这样对于默认SQL语句都不使用查询缓存。...你输入是由多个字符串和空格组成一条SQL语句,MySQL需要识别出里面的字符串分别是什么,代表什么,MySQL从你输入" select"这个关键字识别出来,这是一个查询语句。...t1 ,再判断 t1 里面 c 值是否等于10 这两种执行方法逻辑结果是一样,但是执行效率会有不同,而优化器作用就是决定选择使用哪一种方案。

77910

一条SQL查询语句是如何执行

MySQL自带缓存系统应用场景非常有限,它要求SQL语句必须一模一样,多一个空格,变一个大小写都被认为是两条不同SQL语句 缓存失效非常频繁。...SQL语句打碎成一个个单词,比如一条简单SQL语句,会打碎成8个符号,每个符号是什么类型,从哪里开始到哪里结束。...,Java 编译器、百度搜索引擎如果要识别语句,必须也要有词法语法分析功能。...MySQL作者担心我们写SQL太垃圾,所以有设计出一个叫做查询优化器东东,辅助我们提高查询效率。 2.3.1 什么是查询优化器? 一条 SQL语句是不是只有一种执行方式?...或者说数据库最终执行 SQL是不是就是我们发送 SQL? 不是。一条 SQL 语句是可以有很多种执行方式,最终返回相同结果,他们是等价

1.4K30

一条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 这两种执行方法逻辑结果是一样,但是执行效率会有不同,而优化器作用就是决定选择使用哪一个方案。

1.1K20

一条SQL查询语句是如何执行

本篇文章将通过一条 SQL 执行过程来介绍 MySQL 基础架构。...,一个用户成功建立连接后,即使管理员这个用户权限做了修改,也不会影响已经存在连接权限,修改完后,只有再新建连接才会使用权限设置。...可以将参数 query_cache_type 设置成 DEMAND,对于默认 SQL 语句都将不使用查询缓存。...这两种执行方法逻辑结果是一样,但是执行效率会有不同,而优化器作用就是决定选择使用哪一个方案。优化器阶段完成后,这个语句执行方案就确定下来了,然后进入执行器阶段。...总结 主要通过一个 SQL 语句完整执行过程进行讲解,介绍 MySQL 逻辑架构,MySQL 主要包括连接器、查询缓存、分析器、优化器、执行器这几个模块。

1.7K30

一条sql语句究竟是如何执行

点击上方蓝字关注我们 相信做后端同学肯定离不开一个话题,就是 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

37530

MySQL中一条SQL语句是如何执行

例如一个简单SQL语句: mysql> select * from T where ID=10; ? 在 MYSQL 内部是怎么执行呢?我们从头梳理一下。...分析器 client 和 server 连接完成了,向 server 发送 sql 请求,连接器不会直接处理,会转给分析器,这条 sql 进行词法分析,例如识别出来“select”关键字,知道这是一个查询语句...这两种执行方法逻辑结果是一样,但是执行效率会有不同,而优化器作用就是决定选择使用哪一个方案。 在比如一个表中有多个索引,具体使用哪一个?也是由优化器来决定。 ?...执行器基本执行逻辑: 调用存储引擎“取满足条件第一行”这个接口,然后循环取“满足条件下一行”这个接口,将所有满足条件行组成结果集返还给客户端。 ? 至此,这个语句就执行完了。...其实 server 层中还有一个查询缓存,一个语句进来后先看是否在缓存中有,如果有就直接返回,如果没有再走分析器,但由于实际环境中查询缓存作用很小,上面的描述中就没有提及,而且在 MySQL 8 中已经去掉了查询缓存

1.5K20

笔记 | 一条SQL查询语句是如何执行

这个时间是由参数 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 有没有执行查询权限,如果没有,就会返回没有权限错误,如下所示

1.1K101

一条SQL更新语句是如何执行

这是图解MySQL第2篇文章,这篇文章会通过一条SQL更新语句执行流程让大家清楚地明白: 什么是InnoDB页?缓存页又是什么?为什么这么设计? 什么是表空间?...为什么需要这么多种类型日志? 正文开始! ---- 之前我们讲过了一条SQL查询语句是如何执行,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作流程又是什么样子呢?...SQL更新语句执行总结——初版 有了事务日志之后,我们来简单总结一下更新操作流程,这是一个简化过程。 name 原值是chanmufeng。...加上两阶段提交之后我们再来看一下SQL更新语句执行流程。 7....SQL更新语句执行总结——终版 客户端发送更新命令到MySQL服务器,经过处理连接、解析优化等步骤; Server层向InnoDB存储引擎要id=1这条记录; 存储引擎先从缓存中查找这条记录,有的话直接返回

53220

一条SQL语句在MySQL中如何执行

前两天发了一条SQL原因有哪些,在那篇文章我没有说到优化器之类,我觉得如果配合一条SQL是如何执行,会更好,所以特地找了一篇。...MySQL 查询不建议使用缓存,因为查询缓存失效在实际业务场景中可能会非常频繁,假如你一个表更新的话,这个表上所有的查询缓存都会被清空。对于不经常更新数据来说,使用缓存还是可以。...3) 分析器 MySQL 没有命中缓存,那么就会进入分析器,分析器主要是用来分析 SQL 语句是来干嘛,分析器也会分为几步: 第一步,词法分析,一条 SQL 语句有多个字符串组成,首先要提取关键字,比如...二 语句分析 2.1 查询语句 说了以上这么多,那么究竟一条 sql 语句是如何执行呢?其实我们 sql 可以分为两种,一种是查询,一种是更新(增加,更新,删除)。...进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎执行结果。 2.2 更新语句 以上就是一条查询 sql 执行流程,那么接下来我们看看一条更新语句如何执行呢?

3.5K20

oracle创建索引sql语句_mysql创建组合索引

大家好,又见面了,我是你们朋友全栈君。...创建索引一般分为在线索引和非在线索引,在线与非在线区别:非在线锁表,优先创建索引,此时DML都被阻塞,所以快;相反,在线锁是行而非表,通过临时表进行索引创建,所以不会影响DML操作,但副作用就是慢...另外如果是大表,那么采用非在线而导致锁表所带来影响可能会很大。一句话,生产环境不停服脚本操作,建议使用online。 1、创建索引。...DROP INDEX 索引名; 4、查看某个表索引,表名需大写。 SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名' 5、查看某个表哪些列有索引。...如发现本站有涉嫌侵权/违法违规内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

3.7K20
领券