一条update语句优化小记】的更多相关文章

遇到性能问题的sql如下: sql1: UPDATE amlclientlevel a SET    a.client_value = (SELECT l.client_value                          FROM   amlclientdynamiclevel l                          WHERE  l.inner_client_id = a.inner_client_id) WHERE  a.client_value = 0       …
几个月没有更新笔记了,最近遇到一个坑爹的问题,顺道记录一下.. 需求是这样的:一次性修改上万条数据库. 项目是用MVC+linq的. 本来想着用 直接where() 1 var latentCustomerList = this.FindAll().Where(m => arrId.Contains(m.CustomerID.ToString())).ToList(); 这样子执行,意料之中的就是出错了,出啥错,自己试了就知道了.哈哈 想来就只有直接操作数据库了.第一次的想法,直接就是for拼接…
大家好,我是小林. 昨晚在群划水的时候,看到有位读者说了这么一件事. 在这里插入图片描述 大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩了,被老板教训了一波 这次我们就来看看: 为什么会发生这种的事故? 又该如何避免这种事故的发生? 说个前提,接下来说的案例都是基于 InnoDB 存储引擎,且事务的隔离级别是可重复读. 为什么会发生这种的事故? InnoDB 存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务…
需求: 如何将多条update语句合并为一条update语句:如,update table1 set col='2012' where id='2014001'      update table1 set col='1009' where id='2014003'如何合并为一条?   在网上找了好久,总结了一个相对简单的语句(有些语句是函数语句,有点晕),如下: update table1 set col=(case id  when '2014001' then '2012' when '2…
迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子. 手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:"我爱加班". 面试开始,直入正题. 面试官: 看你简历上面写着精通MySQL,我问你一个MySQL锁相关的问题,你看一下这条SQL会对哪些数据加锁? update user set name='一灯' where age=5; 表结构是这样的: CREATE TABLE `user` ( `id` int NOT NULL AUTO_…
最近研究sql优化,以下文章转自互联网: 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1'whereyear='2011' 更新年度为“2011”的数据的join_state字段为“1”.如果更新的字段加了索引,更新时会重建索引,更新效率会慢.    多表关联,并把一个表的字段值更新到另一个表中的字段去: update 表a set a.字段1 = (s…
首先创建一张表: create table T(ID int primary key,c int); 如果要更新ID=2这行+1:应该这样写 update T set c=c+1 where ID=2; 执行这句操作首先还是要与数据库建立连接这是连接器的工作. 在一个表进行更新操作时,这张表的缓存就会失效. 接下来分析器会对这条跟新语句进行语法和词法分析,如果有问题就会报错提示.然后优化器会决定使用ID的索引情况,最后执行器负责执行,找到这行然后更新. 与查询操作不同的是,更新操作涉及到两个重要…
原文地址:http://blog.csdn.net/u011721927/article/details/39228001 一.         update语句的语法与原理 1.     语法 单表:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 如:update t_join_situation set join_state='1'whereyear='2011' 更新年度为“2011”的数据的join_state字段为“1”.如果更新的字段加了索引,更新时会重…
今天同事要我修改服务器数据库里面的2条数据,查看服务器上的SQL Server数据库的时候,发现这几天数据没有添加成功,然后发现磁盘很快就满了,执行Update语句时,执行半天都提示还在执行,查询语句没有问题.这时就想到了应该是数据库文件过大的原因. 在数据库磁盘查看数据库的原始文件,数据库文件只有1G大小,但是日志文件.log文件却有20多G,在网上搜了一下资料,因为日志文件作用不大,于是对日志文件做了如下修改: 问题解决,磁盘空间变大,数据开始添加,Update语句很快执行完毕.…
在SQL UPDATE语句中,"="右侧的值在整个UPDATE语句中都是一致的,所有更新同时发生!因此以下语句将在没有临时变量的情况下交换两列的值: UPDATE table SET a = b, b = a; 注意,在MySQL的实现中,更新将按语句从左到右依次完成.…
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from…
傻瓜级的.此sql语句存在于分销王系统中. 查阅slow log ,时间设置1s 发现很多 SELECT r.*, goods_id, bn, name FROM sdb_goods_rate r, sdb_goods WHERE ((goods_2 = goods_id AND goods_1=4799) OR (goods_1 = goods_id AND goods_2 = 4799 AND manual='both')) AND rate > 99; 主要是2个表的联立,相当于inner…
如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: 复制代码 代码如下: UPDATE mytable SET myfield='value' WHERE other_field='other_value';  但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源.教程指南.橱窗展…
如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?本文以一个示例向大家讲解下如何实现如标题所示的情况,有此需求的朋友可以了解下 通常情况下,我们会使用以下SQL语句来更新字段值: 复制代码 代码如下: UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源.教程指南.橱窗展示…
一条select语句执行流程 第一步:连接器 连接器负责跟客户端建立连接.获取权限.维持和管理连接.如果用户名密码验证通过后,连接器会到权限表里面查出你拥有的权限.之后该连接的权限验证都依赖于刚查出来的权限. 第二步:查询缓存 当获取连接后,一条SELECT语句会先去查询缓存,看之前是否执行过.如果获取到缓存后就执行返回,不然继续后面的步骤. 大多数时候不建议使用缓存,因为只要一个表更新,这个表上的所有缓存数据就会被清空了.对于那些经常更新的表来说,缓存命中率很低.MYSQL8版本直接将查询缓存…
最近好几次有开发同学在问我,比如下图: 问题归纳起来就是:在MySQL里面update一条记录,语法都正确的,但记录并没有被更新... 刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是 有区别 ,这里我用测试数据来模拟下: 有问题的SQL语句: update apps set owner_code='43212' and owner_name='李四' where owner_code='13245' and owner_name='张三'; 执…
[SQL标准中有一个叫同时执行的概念] 同时执行指的是在同一个子句中的各个部分的执行时机是不区分先后的,如下面的SQL语句 ),); +---------+--------+ ) ) | +---------+--------+ | +---------+--------+ row in set (0.01 sec) 按SQL标准的说法 abs(-1) 与 abs(2) 这两个函数是“同时执行”的! [MySQL的Update与SQL标准相背] 1): 为了说明问题我定义如下表结构,表t包含两个…
最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: 经过提炼,问题重现的步骤非常简单,在SQL 2008上可以很容易地重现. 1.         首先,创建一张表格,上面有一个clustered index,两个non-clustered index. create table tt(id int identity primary key,a ch…
非常好用的SQL语句优化34条 1)选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基 础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序.: ORACL…
本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默认值. 3.应尽量避免在where子句中使用!=或<>操作符,MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的L…
如何用一条sql语句实现批量更新?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现. 复制代码 代码如下: UPDATE mytable SET myfield = CASE id WHEN 1 THEN 'value' WHEN 2 THEN 'value' WHEN 3 THEN 'value' END WHERE id IN (1,2,3); 这里使用了case when 这个小技巧来实现批量更新. 举个例子: 复制代码 代码如下: UPDATE categories…
sql语句优化: 1.表加索引 2.少用like,直接用=所有值 3.where语句把能大量筛查的条件写在前面 4.数据量大时,参与计算的值相同时只取一条 后一条减前一条, select houec,[houdate],houtimes,tw=ISNULL(convert(decimal(18,2),houtw-(select top 1 qiantw from #qian where houec=qianec and houcid>qiancid order by qiancid desc))…
一条更新语句的执行过程和查询语句类似,更新的流程涉及两个日志:redo log(重做日志)和binlog(归档日志).比如我们要将ID(主键)=2这一行的值加(c:字段)1,SQL语句如下: update T set c=c+1 where ID=2; redo log 重做日志是InnoDB引擎特有的,是物理日志,记录在“某个数据页上做了什么修改“.大小是固定,可以进行配置大小.假如我们配置一组4个文件,图中write pos是当前记录的位置,往后推移并且循环:checkpoint是当前要擦除…
我们sql语句的书写是根据业务逻辑进行书写的,如果执行比较慢,那么我们对sql重写: 如分步查询,然后在代码层进行拼接:用临时表:改变sql语句的写法等等.我们称之为逻辑层优化. 然后我们看看每条sql语句执行的执行计划,用explain命令查看.可以看到这些表的执行顺序,可能使用到的索引,实际使用到索引,索引的长度,可能要扫描的行数等等信息, 然后对这些信息分析,进行索引的优化.我们称之为实现层的优化.…
首先声明,本人所有博客均为原创,谢绝转载! 今天接到一个需求,如下 这里解释一下,为什么是几十条,因为这里面每个公式的每个条件都是一个单独的数据如净利润就是一条sql语句,而且分散在不同的表,如果此方法按照常规方法来做,为了与指标名称对应的话,那么我们就必须要一个条件一个条件的去查,然后再进行计算. 但是这样就出现了一个问题,大家都知道,在程序里,在不出现死锁的情况下,本地运行的代码其实并不耗多少时间,真正耗时间的是那些需要远程通信的,因为有一个通信时间,而我们查数据库就是一个远程通信的过程.所…
(1)      选择最有效率的表名顺序 ( 只在基于规则的优化器中有效 ) : ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名, FROM 子句中写在最后的表 ( 基础表driving table) 将被最先处理,在 FROM 子句中包含多个表的情况下 , 你必须选择记录条数最少的表作为基础表.如果有 3 个以上的表连接查询 , 那就需要选择交叉表 (intersection table) 作为基础表 , 交叉表是指那个被其他表所引用的表 . (2)      WHERE…
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, Sql 代码 : select id from t where num is null; 可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询: Sql 代码 : select id from t where num=0; 3.应尽量避免在 wh…
网上查找的总结: 1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 2.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描. 4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,…
MS   SQL   Server查询优化方法查询速度慢的原因很多,常见如下几种 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)          2.I/O吞吐量小,形成了瓶颈效应.          3.没有创建计算列导致查询不优化.          4.内存不足          5.网络速度慢          6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)          7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)   …
首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯,搞得代码只有你看的懂,其他人需要花大量时间去理解你写的这种非常用的代码,代码这种东西,越规范越通用越好,至于有些coder所说的,这个值不值得就需要读者自己去思考了 php代码优化"建议" PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置,以下我们就来看看…