php mysql 查询缓存_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   每次返回结果集的一条,即一个一维的数字数组.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果MySQL查询和更新比较频繁导致很慢,可能存在以下一些原因和解决方法: 1. 查询优化:可以通过创建合适的索引、优化查询语句、避免使用全表扫描等方式来改善查询性能。可以使用Explain语句来分析查询执行计划,找出潜在的性能问题。 2. 更新优化:可以使用批量更新或替换多个单独的更新语句,减少频繁的更新操作次数。 3. 缓存机制:可以使用缓存技术,如数据库缓存、应用程序缓存等,减少对数据库的直接访问,提高查询性能。 4. 分库分表:可以将数据库进行水平切分,将数据分散到多个数据库或数据表中,从而减少单个数据库的查询和更新负载,提高整体性能。 5. 硬件升级:如果系统的硬件配置较低,可能会导致性能问题。可以考虑升级硬件,如增加内存、更快的硬盘等,提升数据库服务器的性能。 6. 数据库参数调优:根据具体的场景和应用需求,对数据库的一些参数进行调整,如缓冲区大小、连接数、线程数等,以优化数据库的性能。 7. 代码优化:检查应用程序中的SQL语句、连接的使用情况和事务的操作等,尽量减少不必要的数据库访问和操作,优化代码逻辑。 8. 数据库备份和恢复:定期进行数据库备份,以防止数据丢失。同时,及时删除不需要的旧备份文件,避免对性能的影响。 总之,针对MySQL查询和更新频繁导致的性能问题,需要综合考虑数据库优化、硬件优化、缓存技术和代码优化等多个方面的因素,寻找最适合的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值