关于处理百万级大批量数据的mysql运行几个重要点

处理大批量百万级的数据几点重要知识点:

一:设置php运行的内存配置 ini_set("memory_limit","1200M");

  在php.ini中有如下配置

  ; Maximum input variable nesting level
  ; http://php.net/max-input-nesting-level
  ;max_input_nesting_level = 64

  ; How many GET/POST/COOKIE input variables may be accepted
  ; max_input_vars = 1000

  ; Maximum amount of memory a script may consume (128MB)
  ; http://php.net/memory-limit
  memory_limit = 100M

  会有一个默认的配置,导致运行到一定数量的时候,报错,无法运行下去。

二:设置脚本最大执行时间 set_time_limit ( int $seconds )

  方法具体详情

三:不设置缓存结果 mysql_unbuffered_query

  在处理大批量数据的时候优势非常大,

(PHP 4 >= 4.0.6, PHP 5)

mysql_unbuffered_query — 向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行

说明

resource mysql_unbuffered_query ( string $query [, resource $link_identifier ] )

mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query() 那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier

Note:

mysql_unbuffered_query() 的好处是有代价的:在 mysql_unbuffered_query() 返回的结果集之上不能使用mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。

参见 mysql_query()

 

四:取消变量缓存 unset($x)

  在循环的结束环节,使用unset方法释放变量占用的内存。

 

 

具体代码例子(使用pdo):

$pdo = new PDO("mysql:host=127.0.0.1;dbname=aa","root","root"); 
$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
ini_set("memory_limit","1200M");
set_time_limit(0);


$sql = 'select url,num from cas_key limit 100000 ';
$rs = $pdo->query($sql);

while($value = $rs->fetch()){
    unset($xxx);
    unset($xxx);
    unset($xxx);
}
var_dump(memory_get_usage());//查看内存占用方法

 

 

如有更多优化方法,欢迎请教指点!

 

 

 

 

原文地址:https://www.cnblogs.com/fpcing/p/7249818.html