Php 一次插入太多数据后,系统瘫痪
我开发了一个库存系统,当用户决定注册一个项目时,需要跟踪每个项目序列号 系统将根据方框上显示的给定初始序列号和结束序列号生成序列号。假设一盒物品有1000个物品,每个物品都有自己的序列号,从最初的序列号1开始。根据上下文,系统将逐个生成每个序列号,例如:;用户提交表单时,每行1,2,3…1000 db 现在,当项目的数量很小时,实现是完美的,但当处理大量数据时,它开始使系统瘫痪。大到一百万 除了在用户每次注册项目时逐个、逐行存储序列号之外,是否还有其他方法可以解决这些问题 请帮帮我,有人吗 我不太明白你是怎么做的 但是,如果您像我不认识Laravel一样查看Oracle演示,您会发现插入一个微不足道的100万行不需要花费时间和大量资源。希望您可以在您的系统上执行类似的操作Php 一次插入太多数据后,系统瘫痪,php,oracle,laravel,database-design,Php,Oracle,Laravel,Database Design,我开发了一个库存系统,当用户决定注册一个项目时,需要跟踪每个项目序列号 系统将根据方框上显示的给定初始序列号和结束序列号生成序列号。假设一盒物品有1000个物品,每个物品都有自己的序列号,从最初的序列号1开始。根据上下文,系统将逐个生成每个序列号,例如:;用户提交表单时,每行1,2,3…1000 db 现在,当项目的数量很小时,实现是完美的,但当处理大量数据时,它开始使系统瘫痪。大到一百万 除了在用户每次注册项目时逐个、逐行存储序列号之外,是否还有其他方法可以解决这些问题 请帮帮我,有人吗 我不
SQL> create table serial (id number);
Table created.
SQL> create or replace procedure p_serial (par_start in number, par_end in number)
2 is
3 begin
4 insert into serial (id)
5 select level + par_start - 1
6 from dual
7 connect by level <= par_end - par_start + 1;
8 end;
9 /
Procedure created.
SQL> set timing on
SQL> begin
2 p_serial(1, 1000000); -- 1 million
3 end;
4 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.83 --> 83 miliseconds
SQL> set timing off
SQL> select count(*), min(id) min_id, max(id) max_id from serial;
COUNT(*) MIN_ID MAX_ID
---------- ---------- ----------
1000000 1 1000000 --> 1 million values inserted
SQL>
你基本上得到了你所编码的性能。。。比如说
SQL> create table t ( x int );
Table created.
--
-- 100k unprepared statements, each with a commit
--
SQL>
SQL> set timing on
SQL> begin
2 for i in 1 .. 100000 loop
3 execute immediate 'insert into t values ('||i||')';
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:56.91
--
-- 100k prepared statements, each with a commit
--
SQL>
SQL> set timing on
SQL> begin
2 for i in 1 .. 100000 loop
3 insert into t values (i);
4 commit;
5 end loop;
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:06.81
--
-- 100k prepared statements, one commit
--
SQL>
SQL> set timing on
SQL> begin
2 for i in 1 .. 100000 loop
3 insert into t values (i);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.73
--
-- 1 array-based insert prepared statements, one commit
--
SQL> set timing on
SQL> declare
2 type numlist is table of number
3 index by pls_integer;
4 n numlist;
5 begin
6 for i in 1 .. 100000 loop
7 n(i) := i;
8 end loop;
9 forall i in 1 .. 100000
10 insert into t values (n(i));
11 commit;
12 end;
13 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.07
SQL>
SQL>
--
-- or we can bump those number up a bit
--
SQL> set timing on
SQL> declare
2 type numlist is table of number
3 index by pls_integer;
4 n numlist;
5 begin
6 for i in 1 .. 10000000 loop
7 n(i) := i;
8 end loop;
9 forall i in 1 .. 10000000
10 insert into t values (n(i));
11 commit;
12 end;
13 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:05.15
which is around 2million rows per second (on my laptop)
你考虑过准备好的声明吗?你说瘫痪是什么意思?使用您的监控工具检查CPU使用情况,并检查您的db工具以尝试定位瓶颈。我使用laravel的ORM Elount来处理数据,因此我没有使用准备好的语句。此外,当用户插入大量生成的项目时,服务器资源也会急剧增加,例如:100000个序列号。如果有一种方法可以跟踪生成的序列号而不逐个存储,那么服务器几乎停机,当发生大量事务时,这是真的吗?天哪!83毫秒,这是真的。我的建议是:让数据库来完成这项肮脏的工作,不要在任何您想要的前端应用程序中进行。谢谢,我将尝试实现它,这是准备好的语句吗?为了简单起见,我使用PLSQL引用变量是自动准备的。有关PHP示例,请参见