关于大量数据更新的性能

sound9world 2010-12-02 07:04:12
小弟初入j2ee,工作中遇到一个任务是写一个脚本,来完成对一个表的操作,

具体的操作要求是: 新建6个字段,这6个字段的意义是通过关联查询得到的统计数据(求和,统计个数等),现在要求对现有数

据更新,需要的查询没有难点,现只担心性能问题,需要这个更新的操作尽可能的快,该表的数据量是百万级别。

希望有经验的兄弟更够提供一些思路。

另外还有一个比较弱的问题。。关于存储过程,现在对存储过程基本的认识,现在主要的疑惑是不知何时应该应用存储过程。

小弟刚入门,问题比较白,见笑了。

希望大家不吝赐教,先谢过了。
...全文
233 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2010-12-03
  • 打赏
  • 举报
回复
百万级别 数据用 create table .... as select .. 显然不行。
但楼主你至少要举例说明你的需求吧。

我的理解能力显然不好,但我对例子说明的问题还是会比较容易看懂的。


(不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式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)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

wwwwb 2010-12-03
  • 打赏
  • 举报
回复
瓶颈在什么地方?这6个查询与原表都有相同的KEY字段,如果有
create table newtt select * from 原表 a left join 查询1 on ...
left join 查询2 on ...
sound9world 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wwwwb 的回复:]

如果这6个字段可通过查询得到,建议不用增加,将查询存为VIEW,再调用,与原来的表连接即可(如果
有相同的KEY字段)
[/Quote]

PM的要求 .. 必须增加哎
wwwwb 2010-12-03
  • 打赏
  • 举报
回复
如果这6个字段可通过查询得到,建议不用增加,将查询存为VIEW,再调用,与原来的表连接即可(如果
有相同的KEY字段)
sound9world 2010-12-03
  • 打赏
  • 举报
回复
小弟简单写了个存储过程来测试一个字段的更新..在12万条记录的测试数据库中性能不堪入目。。

我贴上来是希望各位高人能够更明了的了解需求,第一次写存储过程 照着别人写的改的。。见笑


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个 这里只简单测试了一个。

哎 是在惨不忍睹 希望各位多多指正。
WWWWA 2010-12-03
  • 打赏
  • 举报
回复
对,
select * from 原表 a left join 查询1 on ...
left join 查询2 on ...
sound9world 2010-12-03
  • 打赏
  • 举报
回复
..恩 ..不清楚 是中间表吗?
WWWWA 2010-12-03
  • 打赏
  • 举报
回复
直接连接生成不行吗,一定要生成表?
sound9world 2010-12-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 acmain_chm 的回复:]

需要考虑并发操作吗?
[/Quote]

。。请恕我水平比较低 不知道这里涉及到什么有关并发的问题,我只需把表的migration做好 结构做好

原有数据的新的字段的值更新好 至于后面这些字段如何操作 不在我的考虑范围内。
ACMAIN_CHM 2010-12-03
  • 打赏
  • 举报
回复
需要考虑并发操作吗?
sound9world 2010-12-03
  • 打赏
  • 举报
回复
数据库Mysql ..5.1.53 就知道这么多了..
sound9world 2010-12-03
  • 打赏
  • 举报
回复
抱歉 是我说明的不太清楚

这个表的建表语句我是搞不到的。。我可以举例说明一下.

比如有这样一个表 travel_way 表示出行的方式 这里面有百万级的数据记录(假设。。)

和它相关联的有一个表travel,用来记录实际出行,一次出行就是一个travel记录,travel中有字段

travel_way_id,引用travel_way的id

我现在的需求是,对travel_way增加一个字段,total_travels,用来记录使用此种出行方式的travel总数

逻辑上是比较简单的,我开始就想add column之后直接一个

update travel_way set total_travels=(select...)

在处理性能以及大量数据的处理方面没有经验 所以才来问问。

因为这都是实际项目中的表,字段都很多,数据也很大 我只能这样大概描述下了。 见谅 见谅
sound9world 2010-12-02
  • 打赏
  • 举报
回复
额。。我以为我说的很清楚了呢,就是有一张存有大量数据的表,我要写一个脚本对这个表增加6个字段,对现有数据则对这6个字段进行更新,这6个字段的值都是通过一些与其他表的关联查询得到。

因为具体的6个查询比较麻烦,这里就不一一赘述。我的问题旨在得到一些在这种情况下的脚本编写思路。查询暂且不论,主要是更新的性能上。

可能问题提的不好,见谅。
ACMAIN_CHM 2010-12-02
  • 打赏
  • 举报
回复
以目前楼主提供的信息,无法做出什么具体回答。

泛泛的谈,则官方文档中都有说明了。
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html


问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
zuoxingyu 2010-12-02
  • 打赏
  • 举报
回复
存储过程就是一个代码块。你什么时候要用到SQL的时候,什么时候调用存储过程。

56,687

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧