0

我有两个递归函数:

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(.......);
}

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

4

3 回答 3

1

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

这是简单的方法:

$start = microtime(true);

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

echo microtime(true) - $start;
于 2012-08-16T10:10:21.967 回答
0

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

于 2012-08-16T10:11:46.053 回答
0

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

于 2012-08-16T10:13:56.617 回答