mysql buffer
php与mysql的连接有三种方式,mysql,mysqli,pdo。不管使用哪种方式进行连接,都有使用buffer和不使用buffer的区别。
什么叫使用buffer和不使用buffer呢?
客户端与mysql服务端进行查询操作,查询操作的时候如果获取的数据量比较大,那个这个查询结果放在哪里呢?
有两个地方可以放:客户端的缓冲区和服务端的缓冲区。
我们这里说的buffer指的是客户端的缓冲区,如果查询结果已经从服务端获取回来了,放置在了客户端的缓冲区,我们就称之为使用buffer。如果还是存放在服务端的缓冲区的话,我们就说没有使用buffer(unbuffer)。
使用buffer和不使用buffer有什么区别?
主要在内存方面,使用buffer会增加客户端的内存压力,当返回的数据结果特别大的时候可能会占用调用客户端(实际就是一个php进程)比较大的进程。不使用buffer自然对服务端(这里说的是提供mysql服务的服务器)压力更大。
具体可以参考:PHP查询MySQL大量数据的内存占用分析
php中三种模式是如何设置是否使用buffer的?
mysql默认的query是使用buffer的,而不使用buffer就需要使用mysql_unbuffer_query
mysqli默认的query是不使用buffer的,要使用buffer就需要设置MYSQLI_STORE_RESULT
pdo默认的quey是不使用buffer的,要使用buffer就需要设置MYSQL_ATTR_USE_BUFFERED_QUERY
大致相关代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
<?php $dbConfig = array ( 'host' => '10.128.11.101' , 'port' => '3306' , 'user' => 'test' , 'pass' => 'test' , 'db' => 'test' , ); $sql = 'select * from so_topic_app' ; //---------mysql----------// $db = mysql_connect( $dbConfig [ 'host' ], $dbConfig [ 'user' ], $dbConfig [ 'pass' ]); mysql_select_db( $dbConfig [ 'db' ], $db ); mysql_set_charset( 'utf8' , $db ); // mysql使用buffer $res = mysql_query( $sql , $db ); $data = array (); while ( $row = mysql_fetch_row( $res )) { $data [] = $row ; } // mysql不使用buffer $res = mysql_unbuffered_query( $sql , $db ); $data = array (); while ( $row = mysql_fetch_row( $res )) { $data [] = $row ; } mysql_close( $db ); //---------mysqli----------// $db = mysqli_connect( $dbConfig [ 'host' ], $dbConfig [ 'user' ], $dbConfig [ 'pass' ], $dbConfig [ 'db' ]); // mysqli不使用buffer $result = mysqli_query( $db , $sql ); $data = array (); while ( $row = $result ->fetch_array()) { $data [] = $row ; } // mysqli使用buffer $result = mysqli_query( $db , $sql , MYSQLI_STORE_RESULT); $data = array (); while ( $row = $result ->fetch_array()) { $data [] = $row ; } mysqli_free_result( $result ); mysqli_close( $db ); //---------pdo----------// $dsn = "mysql:dbname={$dbConfig['db']};host={$dbConfig['host']}" ; $pdo = new PDO( $dsn , $dbConfig [ 'user' ], $dbConfig [ 'pass' ]); // pdo不使用buffer $stmt = $pdo ->prepare( $sql ); $stmt ->execute(); $data = array (); $data = $stmt ->fetchAll(); // pdo使用buffer $pdo ->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true); $stmt = $pdo ->prepare( $sql ); $stmt ->execute(); $data = array (); $data = $stmt ->fetchAll(); |
后续
当然如果数据量非常大的话,大部分人还是会考虑使用分批次来提取和处理数据。所以实际上需要我们关注和使用mysql是使用buffer还是不使用buffer的场景非常少。
mysql buffer的更多相关文章
- 【MySQL】mysql buffer pool结构分析
转自:http://blog.csdn.net/wyzxg/article/details/7700394 MySQL官网配置说明地址:http://dev.mysql.com/doc/refman/ ...
- [MySQL] Buffer Pool Adaptive Flush
Buffer Pool Adaptive Flush 在MySQL的帮助文档中Tuning InnoDB Buffer Pool Flushing提到, innodb_adaptive_flushin ...
- MySQL buffer pool中的三种链
三种page.三种list.LRU控制调优 一.innodb buffer pool中的三种页 1.free page:从未用过的页 2.clean page:干净的页,数据页的数据和磁盘一致 3.d ...
- 关于MySQL buffer pool的预读机制
预读机制 两种预读算法 1.线性预读 2.随机预读 对预读的监控 一.预读机制 InnoDB在I/O的优化上有个比较重要的特性为预读,预读请求是一个i/o请求,它会异步地在缓冲池中预先回迁多个页面,预 ...
- MySQL · 引擎特性 · InnoDB Buffer Pool
前言 用户对数据库的最基本要求就是能高效的读取和存储数据,但是读写数据都涉及到与低速的设备交互,为了弥补两者之间的速度差异,所有数据库都有缓存池,用来管理相应的数据页,提高数据库的效率,当然也因为引入 ...
- MySQL与Oracle主键Query性能测试结果
测试结果总结如下: 1. 按主键读:SQL形式:SELECT * FROM table WHERE id=?. 1.1. 主键为数字.如果所有ID均不存在,纯比较SQL解析能力.MySQL解析SQL的 ...
- MySQL性能建议者mysqltuner.pl和pt-variable-advisor
[root@etch171 ~]# mysqltuner.pl --host >> MySQLTuner - Major Hayden <major@mhtx.net> > ...
- MySQL Hardware--NUMA与MySQL
MUMA架构 在单实例的MySQL服务器上,通过会为MySQL的Buffer Pool分配50%至70%甚至更高的内存,让MySQL 服务会尽可能多地占用系统资源.在基于NUMA系统中,内存被分配到各 ...
- mysql常规巡检
mysql常规巡检 目录 一.巡检脚本 二.下载巡检脚本 三.脚本执行说明 1.inspection.conf 使用说明 2.inspection_mysql.sh 使用说明 3.mysqltun ...
随机推荐
- sendfile Linux函数
现在流行的 web 服务器里面都提供sendfile 选项用来提高服务器性能,那到底 sendfile 是什么,怎么影响性能的呢? sendfile 实际上是 Linux 2.0+ 以后的推出的一个系 ...
- Docker 容器管理:rancher
Rancher:https://www.cnrancher.com/ 是一个开源的企业级全栈化容器部署及管理平台. 定位上和 K8s 比较接近,都是通过 web 界面赋予完全的 docker 服务编排 ...
- maven 使用-P指定环境打包,linux移动配置文件失败,windows成功!
问题描述: windows机器使用-P指定环境打包,最后组装文件组装成功,配置文件成功移动,linux下却只移动了jar包. windows: linux: ...
- 【BZOJ1814】Ural 1519 Formula 1 插头DP
[BZOJ1814]Ural 1519 Formula 1 题意:一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数.(n,m<=12) 题解:插头DP板子题,刷板 ...
- Android 使用MediaPlayer 播放 视频
http://pan.baidu.com/s/1lgKLS package cn.bgxt.surfaceviewdemo; import java.io.File; import android.m ...
- PHP生成页面二维码解决办法?详解
随着科技的进步,二维码应用领域越来越广泛,今天我给大家分享下如何使用PHP生成二维码,以及如何生成中间带LOGO图像的二维码. 具体工具: phpqrcode.php内库:这个文件可以到网上下载,如果 ...
- web.xml之context-param,listener,filter,servlet加载顺序及其周边
先以加载spring为例子看看加载顺序的作用: Spring加载可以利用ServletContextListener 实现,也可以采用load-on-startup Servlet 实现,但比如fil ...
- JavaWeb 后端 <三> 之 Response Request
1. 响应对象 Response(重点:HTTP协议响应部分) 查看
- Zookeeper可以干什么
在Zookeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, n ...
- JNUOJ 1184 - 科学计数法
花了半个小时,强行拗出一长串又臭又长的代码,把所有情况都分了(该分的,不该分的……都分了……) #include<cstdio> #include<cstring> #incl ...