Php 一次插入太多数据后,系统瘫痪

Php 一次插入太多数据后,系统瘫痪,php,oracle,laravel,database-design,Php,Oracle,Laravel,Database Design,我开发了一个库存系统,当用户决定注册一个项目时,需要跟踪每个项目序列号 系统将根据方框上显示的给定初始序列号和结束序列号生成序列号。假设一盒物品有1000个物品,每个物品都有自己的序列号,从最初的序列号1开始。根据上下文,系统将逐个生成每个序列号,例如:;用户提交表单时,每行1,2,3…1000 db 现在,当项目的数量很小时,实现是完美的,但当处理大量数据时,它开始使系统瘫痪。大到一百万 除了在用户每次注册项目时逐个、逐行存储序列号之外,是否还有其他方法可以解决这些问题 请帮帮我,有人吗 我不

我开发了一个库存系统,当用户决定注册一个项目时,需要跟踪每个项目序列号

系统将根据方框上显示的给定初始序列号和结束序列号生成序列号。假设一盒物品有1000个物品,每个物品都有自己的序列号,从最初的序列号1开始。根据上下文,系统将逐个生成每个序列号,例如:;用户提交表单时,每行1,2,3…1000 db

现在,当项目的数量很小时,实现是完美的,但当处理大量数据时,它开始使系统瘫痪。大到一百万

除了在用户每次注册项目时逐个、逐行存储序列号之外,是否还有其他方法可以解决这些问题

请帮帮我,有人吗

我不太明白你是怎么做的

但是,如果您像我不认识Laravel一样查看Oracle演示,您会发现插入一个微不足道的100万行不需要花费时间和大量资源。希望您可以在您的系统上执行类似的操作

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示例,请参见