小弟初入j2ee,工作中遇到一个任务是写一个脚本,来完成对一个表的操作,具体的操作要求是: 新建6个字段,这6个字段的意义是通过关联查询得到的统计数据(求和,统计个数等),现在要求对现有数据更新,需要的查询没有难点,现只担心性能问题,需要这个更新的操作尽可能的快,该表的数据量是百万级别。希望有经验的兄弟更够提供一些思路。另外还有一个比较弱的问题。。关于存储过程,现在对存储过程基本的认识,现在主要的疑惑是不知何时应该应用存储过程。小弟刚入门,问题比较白,见笑了。希望大家不吝赐教,先谢过了。
调试欢乐多
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧)
有相同的KEY字段)
create table newtt select * from 原表 a left join 查询1 on ...
left join 查询2 on ...
但楼主你至少要举例说明你的需求吧。我的理解能力显然不好,但我对例子说明的问题还是会比较容易看懂的。
(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
。。请恕我水平比较低 不知道这里涉及到什么有关并发的问题,我只需把表的migration做好 结构做好原有数据的新的字段的值更新好 至于后面这些字段如何操作 不在我的考虑范围内。
select * from 原表 a left join 查询1 on ...
left join 查询2 on ...
delimiter $$drop procedure if exists updateTotalTravels$$create procedure updateTotalTravels()
begin
declare _done int default 0;
declare ref_id varchar(32);
declare ref_count int;
declare _cur1 cursor for select id from ca_travel_method where is_system=false;
declare continue handler for sqlstate '02000' set _done = 1; open _cur1; repeat fetch _cur1 into ref_id;
set ref_count=(select count(*) from ca_travel ct join ca_travel_method ctm on ct.travel_method_id=ctm.id where ctm.id=ref_id and ct.status=2);
update ca_travel_method set total_travels=ref_count where id=ref_id;
until _done end repeat;
close _cur1;end$$delimiter ;call updateTotalSuccessfulPayments();类似的更新操作还有6个 这里只简单测试了一个。哎 是在惨不忍睹 希望各位多多指正。