PHP MySQL存储过程仍然输出缓慢(几乎崩溃浏览器)

Posted

技术标签:

【中文标题】PHP MySQL存储过程仍然输出缓慢(几乎崩溃浏览器)【英文标题】:PHP MySQL Stored Procedures still slow to output (almost crashes browser) 【发布时间】:2011-05-20 23:19:03 【问题描述】:

您好,几周前我在这里问了一个问题,关于为我的大约 5000 条记录的数据库加速 mysql 输出。我使用建议来使用 ob_start() 和存储过程。但是它仍然几乎使浏览器崩溃并且输出记录非常慢,任何想法如何优化它:

    ob_start();
    $conn = new Mysqli("xxxxxxxxxx", "xxxxxxxxx", "xxxxxxxxx", "xxxxxxxxxx");

    $result = $conn->query(sprintf("call list_products(%d)", 6000));

    while($row = $result->fetch_assoc())
        echo "<tr>";
        echo "<td>" . $row['xxxxxxx'] . "</td>";
        echo "<td>" . $row['xxxxx'] . "</td>";
        echo "<td>" . $row['xxxxx'] . "</td>";
        echo "<td>" . $row['xxxxxx'] . "</td>";
        echo "<td>" . $row['xxxx'] . "</td>";
        echo "<td>" . $row['xxx'] . "</td>";
        echo "<td>" . $row['xx'] . "</td>";
        echo "<td>" . $row['xxxx'] . "</td>";
        echo "</tr>";
    
    echo "</tbody>";
    echo "</table>";

    $result->close();   
    $conn->close();

    ob_end_flush();

【问题讨论】:

你确定有多少延迟是由 MySQL 和 php 造成的吗?例如,如果您直接从 MySQL 控制台调用存储过程,它返回结果的速度有多快?你的存储过程是做什么的——你能提供代码吗? MySQL 和 PHP 是在同一台服务器上,还是在不同的服务器上? 您可能还想查看mysql_query_unbuffered - 但请务必仔细阅读文档,因为有一些警告。 同一台服务器,我正在使用 phpMyAdmin,说我没有使用正确的上下文很痛苦!? 我认为上下文问题是PHPMyAdmin某些版本中的一个错误。看看这篇文章的公认答案及其 cmets:***.com/questions/2454071/… 【参考方案1】:

使用 ob 一点都不好,谁说这误导了你......你应该做的不是你如何输出数据,而是查看你的 mysql 查询以及如何优化它尽可能使用关键列来查找您循环的任何内容,尽量限制行数,使用索引当您想要优化数据库脚本时,所有这些都非常重要

您可以使用 EXPLAIN 词来找出瓶颈可能在哪里,您可能需要在哪里建立索引等等

【讨论】:

这是我上一个关于 Ob_start 的问题 是的,我明白这一点,但是 ob 所做的是将打印的内容保存到内存中,这将造成一个糟糕的瓶颈,这将使其无法对更多访问者进行扩展,尝试删除 ob 并查看它需要多快那么,我很确定是否有问题是查询不好 几乎一样。问题是我需要显示所有 5000 条记录,所以我真的想不出一种方法来限制或抵消结果。 如果您可以获得打印的查询,请将其复制,然后如果您有权访问 phpmyadmin,请在您刚刚复制的查询之前使用 EXPLAIN 运行查询并在此处发布您获得的内容 我运行这个:EXPLAIN list_products,它说 SP 不存在(!?)但我只是做了 SHOW PROCEDURE STATUS;它肯定出现了!

以上是关于PHP MySQL存储过程仍然输出缓慢(几乎崩溃浏览器)的主要内容,如果未能解决你的问题,请参考以下文章

如何php调用oracle存储过程返回的是一个结果集,该怎么从php页面中吧数据循环输出呀

PHP Apache 在执行存储过程时崩溃

PHP MySQL PDO 绑定输入/输出相同参数

MySQL不启动后崩溃问题,怎么解决

在 codeigniter 中处理存储过程输出参数

mysql存储过程输入一个输出一个值怎么办