PHP+MySQL缓冲查询和无缓冲查询
http://php.net/manual/zh/mysqlinfo.concepts.buffering.php 
  http://php.net/manual/zh/mysqli.query.php 
  PHP MySQL查询(mysqli,pdo_mysql)默认使用缓冲模式. 
  也就是说查询结果将一次性从MySQL传输到PHP进程内存中, 
  这时可以统计结果集的行数,以及移动结果集指针. 
  缓冲模式下,如果结果集很大,那么PHP进程也会占用大量的内存, 
  直到结果集被unset或者free. 
  
  store_result用于缓冲模式,所有结果一次性存储到PHP进程中: 
  mysqli::query MYSQLI_STORE_RESULT 
  mysqli::store_result 
  mysqli_stmt::store_result 
  如果PHP的MySQL数据库驱动底层用的是libmysqlclient,那么memory_limit不能统计到结果集占用的内存, 
  除非结果集已经赋值给PHP变量,如果底层使用mysqlnd作为驱动时则可以统计到(PHP从5.4开始底层默认使用mysqlnd). 
  无缓冲模式下执行的查询将会返回一个resource资源引用,位于MySQL的查询结果等待PHP获取. 
  无缓冲模式下,PHP进程占用的内存很少,但会增大MySQL服务器的负载. 
  在PHP取回所有结果前,在当前数据库连接下不能发送其他的查询请求. 
  
  use_result表示无缓冲查询: 
  mysqli::query MYSQLI_USE_RESULT 
  mysqli::use_result 
  
  总结: 
  当结果集不大时,或者需要在读取所有行前获取结果集行数时,使用缓冲查询(默认). 
  当结果集很大时,使用无缓冲查询,避免PHP进程占用大量的内存. 
  $rs = $mysqli->query("SELECT  FROM City", MYSQLI_USE_RESULT); 
  $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false); 
  $rs = $pdo->query("SELECT  FROM City"); 
  
  默认情况下,mysqli_stmt的SELECT查询结果将留在MySQL服务器上,等待fetch方法把记录逐条取回到PHP程序中,这样做会降低性能,但能节省内存. 
  如果需要对所有记录进行处理,可以调用mysqli_stmt::store_result,把所有结果一次性全部传回到PHP程序中, 
  这样做更高效,能减轻MySQL服务器的负担,虽然内存占用会多一些. 
  如果获取SELECT语句查找到了多少条记录,可以用 mysqli_stmt::$num_rows 获取. 
  这个属性只有在提前执行过 mysqli_stmt::store_result 方法,将全部查询结果传回到PHP程序中的情况下才可以使用. 
  对比 mysqli_result::$num_rows 则不没有这个限制. 
  用 mysqli_stmt::free_result 关闭 mysqli_stmt::store_result: 
  $stmt->store_result(); 
  echo $stmt->num_rows; 
  $stmt->free_result(); 
  
  http://php.net/manual/zh/mysqli-stmt.fetch.php 
  mysqli_stmt::store_result能让mysqli_stmt::fetch更高效,但也需要用mysqli_stmt::free_result显式关闭. 
  可以用mysqli_stmt::get_result拿到结果集对象$result,然后mysqli_result::fetch_all拿到查询数组$results: 
  $result = $stmt->get_result(); 
  $results = $result->fetch_all(MYSQLI_ASSOC); 
  
  http://php.net/mysqli 
  mysqli::query              执行SQL,成功返回 mysqli_result(SELECT,SHOW,DESCRIBE操作)对象或TRUE(其他操作), 失败返回FALSE.用 mysqli::close 关闭. 
  mysqli::prepare            预处理SQL,成功返回 statement 对象, 失败返回 FALSE. 
  mysqli_stmt::execute       执行SQL.用 mysqli_stmt::close 关闭. 
  mysqli_stmt::store_result  取回全部查询结果(SELECT,SHOW,DESCRIBE,EXPLAIN)到PHP,可选.用 mysqli_stmt::free_result 关闭. 
  mysqli_stmt::bind_result   把prepare和execute产生的结构绑定结果到变量,然后在 mysqli_stmt::fetch 中把这些变量输出或赋值. 
  mysqli_stmt::fetch         每次返回结果集的一条,赋值给 mysqli_stmt::bind_result 绑定的变量. 
  mysqli_stmt::get_result    获得结果对象,然后调用 mysqli_result::fetch_all 就能返回结果集数组.mysqlnd下可用. 
  mysqli_result::fetch_all   返回一个结果集数组(MYSQLI_NUM(默认),MYSQLI_ASSOC,MYSQLI_BOTH),用 mysqli_result::close 关闭.mysqlnd下可用. 
  mysqli_result::fetch_array 每次返回结果集的一条,包含一个一维的数字数组和关联数组. 
  mysqli_result::fetch_assoc 每次返回结果集的一条,即一个一维的关联数组. 
  mysqli_result::fetch_row   每次返回结果集的一条,即一个一维的数字数组.