【问题标题】:PDO - prepared statementsPDO - 准备好的语句
【发布时间】:2012-08-16 18:17:44
【问题描述】:

我有两个递归函数:

1)

function getCategories($id)
{
    global $con;
    $select = $con->prepare('SELECT * FROM categories WHERE parent_category_id = :parent_category_id OR (parent_category_id IS NULL AND :parent_category_id IS NULL)');
    $select->bindValue(':parent_category_id', $id, PDO::PARAM_NULL || PDO::PARAM_INT);
    $select->execute();
    // fetching.........
    for() ... getCategories(.......);
}

2)

$select = $con->prepare('SELECT * FROM categories WHERE parent_category_id = :parent_category_id OR (parent_category_id IS NULL AND :parent_category_id IS NULL)');

function getCategories($id)
{
    global $select;
    $select->bindValue(':parent_category_id', $id, PDO::PARAM_NULL || PDO::PARAM_INT);
    $select->execute();
    // fetching.........
    for() ... getCategories(.......);
}

哪个更好/更快? 只准备一次声明会更好吗?

【问题讨论】:

  • 如何运行你的代码十万次迭代并找出哪个更快?
  • Is it better to preapre the statment one time only? - 你认为preparing语句的point究竟是什么?
  • PARAM_NULL || PARAM_INT - 您确定要执行逻辑 OR,而不是按位 OR (|)。此外,使用全局变量是自找麻烦。
  • @Crozin 你在那里绝对正确,但 FTR PDO::PARAM_NULL || PDO::PARAM_INT == PDO::PARAM_NULL | PDO::PARAM_INT == 1 == PDO::PARAM_INT - 所以它仍然可以按预期工作,但这只是因为它是那个特定的组合。任何其他组合都会有效地导致PDO::PARAM_INT(我假设它将被强制转换为整数)编辑实际上考虑一下,bindValue() 甚至不接受一点面具 - 如果这样做就没有任何意义。

标签: php mysql pdo prepared-statement


【解决方案1】:

第二个应该更快,因为您不会调用不需要的语句。准备好的语句的想法是你必须准备一次。但最好的找出方法是分析。

这里有一个简单的方法:

$start = microtime(true);

for ($i = 0; $i < 1000000; $i++){
     //your code here
}

echo microtime(true) - $start;

【讨论】:

    【解决方案2】:

    您的第二个函数肯定要快得多,尤其是当它经常执行时。因为这是发明预准备语句的主要原因:您的 SQL 服务器只需解析和优化一次查询。但是在您的第一个解决方案中,您甚至不需要准备好的语句。因此,在我看来,分析测试只需要找出 第二个速度有多快,而不是找出它是否更快。

    【讨论】:

      【解决方案3】:

      第二个变体更快,因为您准备“模板”(使用prepare() 方法),然后将值发送到模板并在每次迭代中执行查询。

      【讨论】:

        猜你喜欢
        • 2010-11-30
        • 1970-01-01
        • 2011-07-13
        • 2017-09-29
        • 2014-07-20
        • 2016-12-30
        • 2010-11-05
        相关资源
        最近更新 更多