mysql updated 优化更新的方式

在工作中遇见个问题,navicat premiun for mysql 要把两张表A,B关联更新根据id字段更新pass字段,每张表的数据都是2000w+,用update
A as a,B as b SET a.pass=b.pass WHERE a.id=b.id;的方式进行更新,从昨天下午15开始,今天早上
发现电脑在晚上凌晨就宕机了,有什么办法可以避免这种情况,耗时稍微长一些没有关系(mysql版本为5.1)
听说update可以分批次更新,具体要怎么做,麻烦详细些,我刚刚使用mysql,对于语法什么的都不了解,谢谢大家!

0

11个回答

这是基于spring的代码,基于其他照葫芦画瓢就行了,我电脑是4核,开了5个线程(并发5个线程),线程数=cpu核心数+1,按这个规则来


        package com.example.demo;

        import com.sun.jmx.remote.internal.ArrayQueue;
        import org.junit.Before;
        import org.junit.Test;
        import org.junit.runner.RunWith;
        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.boot.test.context.SpringBootTest;
        import org.springframework.dao.DataAccessException;
        import org.springframework.jdbc.core.JdbcTemplate;
        import org.springframework.test.context.junit4.SpringRunner;

        import java.util.List;
        import java.util.Map;
        import java.util.Queue;
        import java.util.concurrent.Semaphore;
        import java.util.concurrent.atomic.AtomicLong;

        @RunWith(SpringRunner.class)
        @SpringBootTest
        public class DemoApplicationTests {

                private Long total;
                // 声明volatile关键字为了保证可见性,多线程2大特性,一:原子性,二:可见性
                private volatile Semaphore semaphore;
                private volatile AtomicLong aleary;// 已经取了多少条
                private volatile AtomicLong real;// 真实已执行了多少条
                private volatile AtomicLong threadCount;// 执行第几次线程

                @Autowired
                private JdbcTemplate jdbcTemplate;

                @Before
                private void init(){
                        // 初始化总数,因为我看你的事a表根据b表更新
                        total = jdbcTemplate.queryForObject("SELECT COUNT(id) FROM B",Long.class);
                        // 初始化信号量(并发锁数量)
                        semaphore = new Semaphore(5);
                        // 初始化已经取了0条
                        aleary = new AtomicLong(0);
                        real = new AtomicLong(0);
                        threadCount = new AtomicLong(0);
                }

                @Test
                public void contextLoads() {
                        // 开始多线程执行
                        for(int i=0;i<total/1000+1;i++){// 除以1000是因为1个线程取1000,一共需要多少个线程,其实可以优化,让线程可回收,这样可以减小内存消耗,不过,你的应该是只执行一次,以后不用了,所以就没有必要了
                                new Thread(new Runnable() {
                                        @Override
                                        public void run() {
                                                // 获取一把锁
                                                try {
                                                        semaphore.acquire();
                                                        System.out.println("第"+threadCount.addAndGet(1)+"个线程进来了...");
                                                        List<Map<String, Object>> list = jdbcTemplate.queryForList("SELECT id,pass FROM B LIMIT " + aleary.longValue() + "," + 1000);// 取一千条数据,最后一次可能取不到1000条数据不过无所谓,
                                                        aleary.addAndGet(1000);// 增加1000 ,最后已处理数量会比总数多,无所谓,不影响,其就是为了标记,对了,把mysql的max_allowed_package设大一点,要不取1000条数据可能不让取
                                                        list.forEach((l)->{// jdk8 新特性,lamb表达式,jdk版本低的话改为普通for循环
                                                                try {
                                                                        // 忽略错误插入
                                                                        jdbcTemplate.update("UPDATE IGNORE A SET pass=? WHERE id=?",new Object[]{l.get("pass"),l.get("id")});
                                                                } catch (DataAccessException e) {// try catch 忽略异常
                                                                        e.printStackTrace();
                                                                }finally {
                                                                        System.out.println(real.addAndGet(1));
                                                                }
                                                        });
                                                } catch (InterruptedException e) {
                                                        e.printStackTrace();
                                                }finally {
                                                        semaphore.release();// 释放锁
                                                }
                                        }
                                });
                        }
                }

        }

0
zhangpan_soft
zhangpan_soft 我这个地方写的有点问题,线程应该调用start()方法,new Thread(new Runnable(){}).start()才对
12 个月之前 回复

转储数据的时候看好表结构是否一致,字段限制是否一致,,,如你所说不在意速度快慢的话,,,,上述方法已经测试有效..
配置好数据库的链接,,,随意写一个main方法执行 transService方法 即可
希望能够对你有所帮助

1
cashT
cashT 回复ggx1abc: 已在本地测试可用,如果适合您的需求并有幸解决您的问题,请采纳0.0谢谢
12 个月之前 回复
ggx1abc
gu123xin 好的,谢谢!
12 个月之前 回复

update A as a set a.pass=(select pass from B as b where a.id=b.id ) where a.id between 0 and 10000;
……

这样分批次更新呢

0
ggx1abc
gu123xin Truncated incorrect DOUBLE value 会报这样的错误
12 个月之前 回复

要是分批更新有没有说,让mysql每次自动更新多少条的,不用每次更新都去操作

0

update A as a,B as b SET a.pass=b.pass WHERE a.id=b.id and a.id in (select a.id from A as a,B as b where a.pass!=b.pass limit 10000)
自动更新的话可以设置一个定时任务,参考https://blog.csdn.net/zhenzhendeblog/article/details/50599994

0
qq_38361634
爱_LOVE 回复ggx1abc: update A as a,B as b SET a.pass=b.pass WHERE a.id=b.id and a.id in (select * from(select distinct a.id from A as a,B as b where a.pass!=b.pass limit 10000)as t)
12 个月之前 回复
ggx1abc
gu123xin 回复qq_38361634: 这个语句是错的,我试验了一下,无论limit 后面数值多大,都只能更新四列,而且第一列还无法更新
12 个月之前 回复
qq_38361634
爱_LOVE 回复ggx1abc: update A as a,B as b SET a.pass=b.pass WHERE a.id=b.id and a.id in (select * from(select a.id from A as a,B as b where a.pass!=b.pass limit 10000)as t)加个嵌套就好
12 个月之前 回复
ggx1abc
gu123xin 不能在子句里面用limit语句
12 个月之前 回复
ggx1abc
gu123xin - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
12 个月之前 回复

主要问题是这个语句会导致表联接查询,数据量大,联接肯定不行,除非你将数据一点点迁移到临时表再做联接更新,不知道你的id有没有什么规则?
可以搞个存储过程通过mysql进行分页查询,每次查询1000条记录的id然后依次执行,update
A as a,B as b SET a.pass=b.pass WHERE a.id=b.id and a.id=n,有索引语句执行很快

0
ggx1abc
gu123xin 回复zhaomin_g:好吧,我试试
12 个月之前 回复
ggx1abc
gu123xin 回复zhaomin_g: update A as a,B as b SET a.pass=b.pass WHERE a.id=b.id and a.id=id;这个b.id and a.id=id;后面的id还要指定是哪张表的id吧?还是指定两张表的id
12 个月之前 回复
zhaomin_g
_赵明 回复zhaomin_g: 自己建两张表插入数据测试下,我mysql也,没怎么用过,应该是这样的
12 个月之前 回复
zhaomin_g
_赵明 回复ggx1abc: update A as a,B as b SET a.pass=b.pass WHERE a.id=b.id
12 个月之前 回复
ggx1abc
gu123xin 回复zhaomin_g:给两张表的id字段加个索引然后这样写是吧? update A as a,B as b SET a.pass=b.pass WHERE a.id=b.id and a.id=id;
12 个月之前 回复
zhaomin_g
_赵明 回复ggx1abc: 给你两张表的id都加个索引就可以了,数据量大,加索引也是很耗时的,加完就好了
12 个月之前 回复
zhaomin_g
_赵明 n就是id,没有索引那玩不起来,加个索引就搞定了,加完索引,你再运行你原先的语句是可以的
12 个月之前 回复
ggx1abc
gu123xin id 就是些字符串,也没有设置索引,如果建立索引,...b.id and a.id=n,这个n是A,B共同的索引名字吗?
12 个月之前 回复

mysql 几百万的数据量就会影响性能,几个百万级的表关联查询性能差表现的尤为明显,你这两个2000W加的表关联起来更扩张,建议分区。

1.创建与原始表一样结构的新表,新分区。
2.将原始表中数据复制到新表。
3.删除原始表。
4.将新表名称改为原始表名称
两张表都要这样做。

用 ID 做RANGE分区:
PARTITION BY RANGE (id)
(PARTITION d10w VALUES LESS THAN (100000) ENGINE = InnoDB,
PARTITION d20w VALUES LESS THAN (200000) ENGINE = InnoDB,
PARTITION d50w VALUES LESS THAN (500000) ENGINE = InnoDB,
PARTITION d100w VALUES LESS THAN (1000000) ENGINE = InnoDB

你是用 a.id=b.id去关联更新的,两张表你的id都按一样的规则去分区。
之后再写一个存储过程去,用游标一个分区一个分区的去更新。
如果你想 不做任何改变,就通过优化一个sql去改变,那是不可能。。。mysql没办法实现你的需求。
就单写一个sql来说,你这个sql没什么可优化的,你的 id已经是主键了。
照我我说的 去普及一下相关资料,动起来。
望采纳啊啊啊啊啊 老铁

0
u013927589
还来得及 回复ggx1abc: 有前途,毕业直接来我们公司
12 个月之前 回复
ggx1abc
gu123xin 有没有是加个索引比较快点的方法
12 个月之前 回复
ggx1abc
gu123xin 哥,B表的id数据行数和A表行数也不一样,也就是有些要更新,有些不用。分表的化,也要花很多时间,我怕时间不够,因为我只是暑假实习,下个星期就要离职了,但我很想把任务做好
12 个月之前 回复

@Service("transservice")
public class transService {
@Autowired
JdbcTemplate jdbcTemplatesql1;

@Autowired
JdbcTemplate jdbcTemplatesql2;
    //从原表中查询数据
    String asql = "SELECT id,pass FROM A";
    List<Map<String, Object>> AList = jdbcTemplatesql1.queryForList(asql);
    for (Map<String, Object> Amap : AList) {

                Integer Aid = Amap.get("id") == null ? "" : (Integer) Amap.get("id");
                String passA = Amap.get("pass") == null ? "" : ((String) Amap.get("pass")).trim();

                 String bsql = "UPDATE B set "
                                + "pass = '" + passA
                                + "' WHERE id = '"
                                + Aid + "' ;";

                jdbcTemplatesql2.update(bsql);

                }

}

0

1.关联字段建立索引
2.创建一张临时表,先将两表关联记录转存临时表
3.分批次更新

0

你照着步骤操作,复制到你的navicat执行,注意<改一下> 的注释,有些地方需要改一下。操作完后耐心等待,看看会不会弘机。
假如能跑完,别忘了采纳,我还需要 10+8个C就行了
-- 1.创建存储过程
create procedure update_pro()
begin -- 开始存储过程
DECLARE val_id INT(10);
DECLARE val_pass varchar(32); -- <改一下> 这里把32改成你要更新字段的长度
DECLARE done INT DEFAULT FALSE; -- 控制游标循环变量,默认false
DECLARE My_Cursor CURSOR FOR ( SELECT id, pass FROM test_b ); -- <改一下> 这个sql改成你的表和字段
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 绑定控制变量到游标,游标循环结束自动转true
START TRANSACTION;-- 打开事务
OPEN My_Cursor; -- 打开游标
myLoop: LOOP -- 开始循环体,myLoop为自定义循环名,结束循环时用到
FETCH My_Cursor into val_id, val_pass; -- 将游标当前读取行的数据顺序赋予变量val_id,val_pass
IF done THEN -- 判断是否继续循环
LEAVE myLoop; -- 结束循环
END IF;
-- 更新数据
UPDATE test_a SET pass = val_pass WHERE id = val_id ; -- <改一下> 这个sql改成你的表和字段 ,val_pass和val_id是上面声明的变量,不用改
END LOOP myLoop; -- 结束自定义循环体
CLOSE My_Cursor; -- 关闭游标
COMMIT; -- 提交事务
END; -- 结束存储过程

-- 2.调用你刚刚创建的存储过程
CALL update_pro();

0
u013927589
还来得及 博主,你把创建存储过程的语句改一下,把 START TRANSACTION;-- 打开事务 和 COMMIT; -- 提交事务 去掉
12 个月之前 回复
共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
mysql updated 优化更新的方式
在工作中遇见个问题,navicat premiun for mysql 要把两张表A,B关联更新根据id字段更新pass字段,每张表的数据都是2000w+,用updaten A as a,B as b SET a.pass=b.pass WHERE a.id=b.id;的方式进行更新,从昨天下午15开始,今天早上n 发现电脑在晚上凌晨就宕机了,有什么办法可以避免这种情况,耗时稍微长一些没有关系(mysql版本为5.1)n 听说update可以分批次更新,具体要怎么做,麻烦详细些,我刚刚使用mysql,对于语法什么的都不了解,谢谢大家!
Vue updated生命周期函数
由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。 无论是组件本身的数据变更,还是从父组件接收到的 props 或者从vuex里面拿到的数据有变更,都会触发虚拟 DOM 重新渲染和打补丁,并在之后调用 updated。 有个值得注意的地方,举例说明: 例子 &amp;lt;template&amp;gt; &amp;lt;div&amp;gt; &amp;lt;div v-for=&quot;(ite...
mysql多表关联更新和in效率问题
#重新下发投放配置,只下放投放状态的单子 1.单表where查询更新 UPDATE bus_execute_sync b SET b.flag = 0 WHERE b.execid IN(SELECT id FROM bus_execute a WHERE a.status IN('10','20','21','22','23','24','25')); 2.表关联更新 UPDATE bu
mysql优化的常用方法
最近,在使用Mysql的时候,遇到一些查询优化问题,自己查阅资料,并顺带整理了一下。 Mysql的优化,大体可以分为三部分:索引的优化,sql语句的优化,表的优化 1.索引的优化 只要列中含有NULL值,就最好不要在此例设置索引,复合索引如果有NULL值,此列在使用时也不会使用索引尽量使用短索引,如果可以,应该制定一个前缀长度对于经常在where子句使用的列,最好
MySQL的常用优化方式
MySQL的常用的优化手段:    1. SQL语句的优化,使用精确查询,避免模糊查询,特别是在where语句时,少使用比较运算符,避免全表查询。    2. 使用联表查询,避免使用子查询。    3. 给经常被访问的字段创建索引,也可以创建联合索引,但是遵从最左原则。            例:create index '索引名'  on '表名'( 字段名 (长度 ) )           ...
hibernate乐观锁
[size=large]乐观锁的作用[/size] 乐观锁的主要作用是为了解决事务并发带来的问题。相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。 悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(Version)...
一条update语句的优化
1.首先给出update语句 UPDATE T_TEST A SET A.MANA_CODE = ( SELECT MANA_CODE FROM T_TEST2 B WHERE A.APPLY_NO = B.APPLY_NO ) WITH UR; 2.分析: 这条语句执行10多分钟都没反应。T_TEST2表只有300多条记录,T_TEST表却有6万多条数据。很明显主表数据有点多,应该给...
update 语句优化
update 语句优化
MySQL主要优化手段(数据读写分离、Sharding)介绍
MySQL常用优化手段:数据读写分离与数据库Sharding 数据读写分离 在大多数的业务场景,都是读多写少,因此进行数据库的读写分离是一件非常简单且有效率的方案。 读写分离简单点来说就是把数据的读操作和写操作分开,让这两种操作去访问不同的数据库,这样就可以减轻数据库的压力 从阿里云的读写分离可以看出数据库会有一个“主实例”,这个主要用来提供写操作(偶尔也会承担读操作),除了“主实例”...
MySQL性能优化 SQL优化方法技巧
MySQL性能优化 SQL优化方法技巧
几种优化mysql的方法
1. 选取合适的字段属性,应该尽量把字段设置为not null,这样数据库在查询的时候就不用去比较NULL值,枚举型【国家,省份】的时候尽量设置数值型数据比文本类型处理的快。 2. 使用join,union来代替子查询,这样mysql不需要在内存中创建临时表来满足查询操作。 3. 事务【优点:数据完整性,缺点:独占性】---锁定表  解决独占性,锁定表的方法可以维护数据的完整性,但是它却不能
【uni-app框架】Vue之实时更新响应式数据的方法【使用生命周期updated方法】
updated监听数据变化和watch监听数据变化的区别: updated:只要data对象中的任何数据发生变化,都会执行一次!【响应式刷新数据】 watch:仅当data对象中的属性地址发生改变时,才会执行【引用类型才有地址,值类型改变自然会调用】 ...
vue 中updated的使用
updated : function(){//什么时候 进updated方法?//只有事先设置好的data变量改变并且要在页面重新渲染{{}}完成之后,才会进到这个方法,光改变data但不渲染页面//是不会进来的 console.log(&quot;1==我会先执行&quot;); this.$nextTick(function(){  //在下次 DOM 更新循环结束之后执行这个回调。在修改数据之后立即使用这个方法...
MYSQL优化建议总结(长期收集更新)
索引优化 1、避免使用非独立的索引列进行查询 如 where a+1=2 2、多列索引和索引顺序 当出现多个索引做相交操作时(多个AND条件),通常来说一个包含所有相关列的索引要优于多个独立索引。 当出现多个索引做联合操作时(多个OR条件),对结果集的合并、排序等操作需要耗费大量的CPU和内存资源,特别是当其中的某些索引的选择性不高,需要返回合并大量数据时,查询成本更高。索引的顺序对...
mysql 语句优化的十个经验
mysql 语句优化的十个经验mysql 语句优化的十个经验 本文算是前一篇 查询语句优化经验总结1的后续,总结了&amp;lt;高性能mysql&amp;gt;中与网上常见的一些优化经验中出现的案例进行总结与勘误.但是要注意本文中出现的explain结论都是出现在mysql 5.7.18中,要注意mysql在5.6中出现了大量的升级,以往许多经验都开始失效,需要注意 分解关联查询 分解关联查询是一...
MySQL常见优化手段
索引相关: 索引基数表示不同数值的个数,除以全表行的数量可以代表散列程度,约大扫描的定位的效率越高。 索引失效的原因 运算±*/ ! &amp;lt;&amp;gt; %. 模糊查询like开头“%, where.中类型错误 函数的话需要建立函数索引,mysql8才开始支持. 如果有or,除非or的都有索引,否则失效 字符串如果没“,失效 组合索引最左匹配 逻辑唯一最好建唯一索引。 EXPLAIN提示优化 ...
MySQL性能优化常用方式
1、开启慢查询日志 2、EXPLAIN 分析查询 3、profiling分析 4、show命令查询系统状态及系统变量 参考文章: https://www.jianshu.com/p/3c79039e82aa https://kaimingwan.com/post/shu-ju-ku/mysqlxing-neng-fen-xi-fang-fa-gong-ju-jing-yan-zong-jie...
Java 3种批量插入更新操作的效率横向比较
以前总是说批量插入和更新的效率比非批量的要高,但是到底高多少,没有评估过,今天我就具体的测试下(1)三种插入操作的方法1.1 利用for循环的批量插入示例xml <insert id="insertUser"> insert into test_user (u_name,create_date) value (#{userName},SYSDATE()) </inser
mysql5.6性能优化
合理安排资源、调整系统参数使MySQL运行更快、更节省资源。 优化是多方面的,包括查询、更新、服务器等。 原则:减少系统瓶颈,减少资源占用,增加系统的反应速度。
MySQL主从同步故障-Slave_SQL_Running: No
转自:https://www.linuxidc.com/Linux/2014-02/96945.htm我这边的原因是:Change master to如果从库的Slave未启动,Slave_IO_Running为NO。可能是主库是的master的信息有变化,查看主库show master status;记录下File,Position字段,假设为‘mysql-bin.000004’,98;在从库执...
Mysql的sql优化方法
1、选择最合适的字段属性        Mysql是一种关系型数据库,可以很好地支持大数据量的存储,但是一般来说,数据库中的表越小,在它上面执行的查询也就越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度舍得尽可能小。         例如:在定义邮政编码这个字段时,如果将其设置为char(255),显然给数据库增加了不必要的空间,甚至使用varchar这种类型也是多余的...
关于更新20w+数据量的SQL性能优化
前段时间,有个同事找我,让我帮忙优化一下DML SQL语句,说是update更新很慢,一分钟值更新260条数据,但是里面有20W以上的数据需要更新。
优化MySQL数据库性能的八种方法
优化MySQL数据库性能的八种方法, 1、选取最适用的字段属性 2、使用连接(JOIN)来代替子查询(Sub-Queries) 3、使用联合(UNION)来代替手动创建的临时表
MySQL性能优化——易实现的MySQL优化方案汇总
1、索引优化及索引失效情况汇总2、表结构优化小技巧3、临时表的优化4、其它优化技巧
MySQL查询优化的几种思路和方法
整理的一些mysql查询存储的优化思路和方法
mysql 语句优化
在项目中发现一个页面加载速度超级慢,时长超过5s 时间,简直不能忍受, 检查代码,寻找到一处sql 语句,然后分析其执行计划。 这段SQL想要得到的结果是appid 为100032下面,打包状态小于3,或者测试状态小于3 且测试状态不等于初始态的结果集。 通过mysql explain 分析其执行计划。发现虽然在appid 这个字段上建立了索引。但是索引并未生效。近乎全表式的扫描。 当...
Vue源码解析之_update函数(六)
在$mount函数中,主要是调用了mountComponent函数,而该函数最后主要是调用了updateComponent函数,上一次我们分析了render函数的功能(主要是利用createElement函数生成vnode),那么_update函数主要做了什么首先,可以看到在'src/core/instance/lifecycle.js'中在Vue原型上定义了私有方法_update,在整个函数中,...
参数更新的方式(优化方式)
SGD是实际方法中收敛最慢的。(直接根据梯度矫正W,因为水平方向梯度很小,垂直方向梯度很大,所以会出现如下图的波动方式)   补救上面的一种方式是动量更新(momentum)。(可以理解为在浅的方向上加快收敛,在深得方向上来回摆动) 在上面的基础上,另外一种更新方式  Nesterov Momentum  然后就是AdaGrad updata,这种方法可以理解为,垂直方向梯度大...
mysql5.7中的一个update order by排名问题解决办法(一条sql搞定排名)
在作排序时,发现update中的orderby 不起作用,业务功能:按照syl字段进行降序排名:在mysql5.6版本中运行的sql如下: UPDATE (SELECT @a := @a + 1 AS rn, id, syl FROM t_user_syl h, (SELECT @a := 0 ) t where h.day=${day}
如何在 Linux 上安装/更新 Intel 微码固件 | Linux 中国
Linux 的内核可以在引导时更新 CPU 固件,而无需 BIOS 更新。处理器的微码保存在内存中,在每次启动系统时,内核可以更新这个微码。-- Vivek Gite有用的原文链接请访问文末的“原文链接”获得可点击的文内链接、全尺寸原图和相关文章。致谢编译自 | https://www.cyberciti.biz/faq/install-update-intel-microcode-firmwar
mysql关联更新update
update db_operation_log o LEFT JOIN db_user u ON o.user_id = u.id set o.user_name = u.real_name , o.mobile = u.mobile
django使用数据库ORM时的优化点
先放两个model方便说明 from django.db import models from django.contrib.auth.models import AbstractUser, UnicodeUsernameValidator class User(AbstractUser): username_validator = UnicodeUsernameValidator...
SQL优化改写之美——MySQL 数据库下DELETE、UPDATE 子查询的锁机制解析与优化
在日常的工作之中,避免不了与in/exists、not in/not exists子查询打交道,只知道in/exists、not in/not exists会
MySQL批量插入效率优化手记
在用C++写一段mysql入库代码时,用的connector/c++,使用了PreparedStatement方式单条insert,然后整个插入操作放在事务中,大致如下: begintrans PreparedStatement for(要插入的数据集) { setInt、setString等填充参数 excute() } commit 结果发现效率太低,在一台破虚拟机上每秒不到...
mysql一条语句update多条记录
通常情况下,我们会使用以下SQL语句来更新字段值:UPDATE mytable SET myfield='value' WHERE other_field='other_value'; 但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的php程序示例: foreach ($display_order as
mysql排错
目录 基础 1.语法错误 2.select返回错误结果 3.当错误可能由之前的更新引起时 4.获取查询信息 5.追踪数据中的错误 6.慢查询 7.当服务器没有响应的时候 8.特定于存储引擎的问题及解决方案 1.myisam损坏 2.innodb数据损坏 9.许可问题 并发问题 1.锁和事务 2.锁 3.事务 1.隐藏查询 2.死锁 3.隐式提交 4.并发如何...
chosen插件--简单快速的理解
chosen插件的一些设置项: 1、默认文字选项 你可以在select元素上添加data-placeholder属性定义默认文字,也就是在没有选择选项的情况下,显示的文字。 2、对其方式 选项文字默认是左对齐的,可以在class属性中加入“chzn-rtl”来设置右对齐:  3、JS参数设置 在调用chosen()方法时,我们可以设置一些参数:
常用的 mysql优化策略
常用的 mysql优化策略 使用索引 1 类似 状态(0,1)的字段不宜作为索引。 2 索引的创建条目不宜过多,我的个人经验是不超过6个。误区是有多少查询条件就创建多少索引,这样多条件查询的sql只会用到其中一个索引而已,具体哪一个,我估计是以第一个有索引的查询条件。 3 如果查询条件比较固定,可以创建复合索引,越有区分度的索引越放在前面。同时,创建的sql也必须与复合索引的顺...
MYSQL性能优化之Mysql数据库结构设计
数据库结构设置和SQL语句优化是最能提升性能的优化了,和项目进行持续优化 减少数据冗余(数据多次出现,或者一列数据可以通过其他列计算得到) 尽量避免数据维护中出现更新,插入和删除异常(可以利用范式化模型来解决) 插入异常:表中的某个实体随着另一个实体而存在 更新异常:如果更改表中的某个实例的单独属性时,需要对多行进行更新。(数据冗余) 删除异常: 删除表中的某个实体,另一个实体也消失 节约数据存储
MySql优化原理(一)
  文章参考自:https://blog.csdn.net/Jack__Frost/article/details/72571540 一、索引       1、索引是什么?它是一种特殊的文件,包含着对数据表里所有记录的引用指针。通俗的说,数据库索引就像是一本书的目录部分,这能加快数据库的查询速度。在没有索引的情况下,数据库会遍历全部数据然后选择符合条件的;然而有了相应的索引之后,数据库会直接...