1

これは、質問が一般的すぎることを除いて、mysqlユニオンと複数のクエリの重複した質問である可能性があり、この質問は特定のケースです。

まず、性能面でどちらが優れているかを考えている2つの選択肢があります。最初のものは、分離されたクエリで前と次の行を取得しています。以下は疑似コードです。

sql->query("SELECT * FROM tbldata WHERE id < 3 ORDER BY id DESC LIMIT 1");
$prev = sql->getRecord();
sql->query("SELECT * FROM tbldata WHERE id > 3 ORDER BY id LIMIT 1");
$next = sql->getRecord();

もう 1 つの解決策は、UNION でクエリを 1 つだけ使用することです。

sql->query("(SELECT * FROM tbldata WHERE id > 3 ORDER BY id DESC LIMIT 1) UNION
            (SELECT * FROM tbldata WHERE id < 3 ORDER BY id LIMIT 1)");
$row = sql->getRecords();
if (count($row) > 1) {
   $prev = $row[0];
   $next = $row[1];
} elseif (count($row) == 0) {
} elseif ($row[0]->id > 3) {
   $next = $row[0];
} else {
   $prev = $row[0];
}

このタイプの問題のベストプラクティスはどれですか?

4

3 に答える 3

1

推測する必要がある場合、UNION はおそらく全体的に高速です。これは、データベースへの要求の数を減らすためですが、これは推測であり、多くの要因に依存することを強調し、それを知る唯一の方法は、コードとチェック。

実際には、おそらくほとんど違いはありません。データベースサーバーへの接続が非常に遅いなど、異常な状況がない限り。

私の提案は、コードを変更する理由があるまで、コードをよりすっきりと読みやすくするものを使用することです。システムのプロファイリングで、これがシステムのボトルネックであることが示されるまで。

于 2013-09-05T06:00:38.747 に答える
1

私の経験でUNIONは、他のものより速いと思います。

そして、これも試してみてください。

SELECT * , IF( id >3, 1, 0 ) AS NextFlag, IF( id <3, 1, 0 ) AS PrevFlag FROM tbldata
WHERE id <= 3+1
HAVING NextFlag =1
OR PrevFlag =1
ORDER BY id DESC
LIMIT 2 
于 2013-09-05T07:04:24.270 に答える
-1
$sql->query('SELECT t.*
             FROM table t
             WHERE t.id IN ('.($id-1).', '.($id+1).')');
$rows = sql->getRecords();

$next = $prev = false;

if (is_array($rows) && $rows) {
    $next = $rows[0];

    if (isset($rows[1])) {
        $prev = $rows[1];         
    } elseif ($rows[0]->id < $id) {
        $prev = $next;
        $next = false;
    }
}

PRIMARY インデックスを持つ 1 つのリクエスト (id が PRIMARY KEY の場合)。UNION または 2 つの要求よりも優れています。

于 2013-09-05T06:06:54.967 に答える