0

私は2つの再帰関数を持っています:

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

不要なステートメントを呼び出さないため、2 つ目は高速になるはずです。準備済みステートメントの考え方は、一度準備する必要があるということです。しかし、それを見つける最善の方法はプロファイリングです。

簡単な方法は次のとおりです。

$start = microtime(true);

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

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

特に頻繁に実行される場合、2番目の関数は間違いなくはるかに高速です。それがプリペアド ステートメントが発明された主な理由です。SQL サーバーは、クエリを一度だけ解析して最適化する必要があります。しかし、最初のソリューションでは、準備されたステートメントさえ必要ありません。したがって、私の意見では、プロファイリング テストは、2 番目のテストがどれだけ速いかを調べるためだけに必要であり、それが速いかどうかを調べるためではありません。

于 2012-08-16T10:11:46.053 に答える
0

「テンプレート」を(prepare()メソッドで)準備してから、値をテンプレートに送信し、反復ごとにクエリを実行するため、2番目のバリアントは高速です。

于 2012-08-16T10:13:56.617 に答える