【问题标题】:am i wasting server time if i call one method for each request for insertion如果我为每个插入请求调用一种方法,我会浪费服务器时间吗
【发布时间】:2013-06-03 18:15:33
【问题描述】:

我正在开发关于 OOP 概念的 PHP, 这是一个名为'connect'的类,它连接到数据库并将请求插入到数据库中_

class connect(){
        public function insert($column, $value)
            {
            $insert = mysqli_query($this->con, "INSERT INTO $tablename ($column)
    VALUES ('$value')");
            }/* end of insert method */
}/* end of class 'connect' */

我只想知道,如果我每次都通过为每个请求调用“插入”方法来插入,这会浪费时间还是浪费更多的服务器时间?或者我应该只使用一种方法来插入所有请求一次请求?;

$call = new connect("localhost", "root", "", "facebook","fb1");
$call->insert("username", "testInsert141");
$call->insert("username", "testInsert141");
$call->insert("username2", "testInsert142");
$call->insert("username3", "testInsert143");

【问题讨论】:

  • 您可以一次插入多行。因此,您必须一次获取每组值并只运行一次插入查询。参考:link
  • 我对你的术语 request 感到困惑。它们是在同一页面中的 AJAX 请求吗?他们是新服务页面上的 HTTP 获取请求吗?关于 SQL 执行,如果您使用一个或多个插入执行并没有太大区别(除非是数十万,我相信并非如此)。最重要的是连接,它需要一些时间来创建和销毁。您可以使用连接池。这将节省您的服务器时间,但同样,只有在交易数量相关的情况下。
  • 创建单独的函数来连接您的数据库。如果你一个接一个地调用这些插入函数,那么它会比单个插入查询花费一些时间。
  • sql事务怎么样?
  • 如果您可以接受某些查询失败而其他查询成功,那么您不需要事务。否则,如果您希望所有这些都成功,或者如果出现问题则不成功 - 那么您使用事务。

标签: php mysql class oop methods


【解决方案1】:

针对一个查询,您的方式会变慢。

查看此测试http://blog.cnizz.com/2010/05/31/optimize-mysql-queries-fast-mutliple-row-inserts/

更新:

mysqli 测试:

<?php
$s = microtime(true);
$mysqli = new mysqli("127.0.0.1", "root", "pass", "test", 3306);
for($i=0;$i<1000;$i++){
    $mysqli->query("INSERT INTO admin SET name='hello world'");
}
$e = microtime(true);
echo $e-$s;
?>

28.007468938828 - INNODB

0.19577789306641-MYISAM

<?php
$s = microtime(true);
$mysqli = new mysqli("127.0.0.1", "root", "pass", "test", 3306);
$sql = "INSERT INTO admin (`name`) VALUES ";
for($i=0;$i<1000;$i++){
    $sql.= "('hello world'),";
}
$sql = substr($sql,0,-1);
$mysqli->query($sql);

$e = microtime(true);

echo $e-$s;
?>

0.06469202041626 - INNODB

0.052706003189087-MYISAM

(在 Athlon X2 2.7MHz 上测试)

和在 Intel I3 2.4MHz 上的分数差不多

【讨论】:

  • 哎呀..那篇文章具有误导性且完全不正确,以至于令人痛苦。此外,还揭示了一个大谜团 - 为什么人们仍在使用 mysql_ 函数 - 这是因为垃圾文章和每个人都有权拥有博客。
  • 不,整篇文章的观点具有极大的误导性。是的,一个大查询将胜过 x 个小查询。为什么?因为 mysql 将对查询进行一次词法分析,而不是对其进行 10 次词法分析。这就是为什么聪明人发明了准备好的陈述。另一件事是使用 MyISAM 进行测试 - 虽然 MyISAM 有其目的,但它仍然不提供交易。如果您将 100 多个查询包装到单个事务中,则通过解析 csv 并插入它来进行插入会大大提高效率。这基本上使 MySQL 在单个 I/O 中执行 100 次写入。那个“基准”中有太多错误的东西。
  • 如果你在做这样的基准测试,你应该涵盖所有场景,因为有人会认为这是要走的路——而事实并非如此。通过在单个事务(使用 InnoDB)中创建 100 个插入并使用准备好的语句来运行您的基准测试。你会看到截然不同的结果。这就是你没有涵盖的场景。这就是人们在用大量数据膨胀数据库时使用的场景。
  • -->注:那么您是否认为将数据插入为“插入(“用户名”,“testInsert141”);”多次插入在 INNODB 事务中是好的
  • @GAURAVMAHALE - 您使用准备好的语句,然后您只需触发 INSERT 语句。它是:1) 更容易理解 2) 更容易使用 3) 更安全,因为准备好的语句使用命名参数和现有的 PHP 库对输入进行清理 4) 如果使用得当,速度会更快。
【解决方案2】:

我假设您指的是调用函数可能“成本高昂”的事实,与将所有命令转储到一个大文件中相比。

基本上,是的 - 这需要更多时间(理论上)。你应该担心这个时间吗?没有。

您应该担心的是代码中实际上会影响时间消耗的部分。在您的示例中,mysql 启动可能会占用您 90% 的处理时间,如果不是更多的话。因此,您应该确保只连接一次 mysql。

此外,当发送一个查询来执行所有插入时,mysql 端 上的插入查询可能会更快。然而,这也可能是微不足道的。确定这一点的最佳方法是测试和分析您的代码。

底线 - 您首先应该考虑让您的代码具有可读性和可维护性。然后进行分析以检测真正的瓶颈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多