6

シナリオ例:

単一のサーバーを実行している MySQL -> HOSTNAME

そのサーバー上の 2 つの MySQL データベース -> USERS 、 GAMES 。

タスク -> GAMES.my_games_table から 10 個の最新のゲームをフェッチし、それらのゲームをプレイしているユーザーを USERS.my_users_table からフェッチします (参加しないと仮定)

Django と Python MySQLdb では、データベースごとに 1 つのカーソルを使用する方が望ましいのはなぜですか?

MySQLサーバーごとに1つで、データベースを切り替えることができる拡張カーソルの欠点は何ですか(たとえば、「use USERS;」をクエリすることにより)、対応するデータベースで作業します

MySQL接続は安価ですが、線形フローがあり、2つのカーソルを必要とする可能性のある複雑なトランザクションがない場合、単一の接続は多くの接続よりも優れているのではないでしょうか?

4

3 に答える 3

10

より短い答えは、「MySQL はそのタイプのカーソルをサポートしていません」であり、Python-MySQL もそうではありません。したがって、1 つの接続コマンドが好まれる理由は、それが MySQL の動作方法だからです。これは一種のトートロジーです。

ただし、より長い答えは次のとおりです。

  1. あなたの定義によると、「カーソル」は、その状態を維持できるRDMS内のテーブルとインデックスにアクセスするある種のオブジェクトになります。
  2. 定義によると、「接続」はコマンドを受け入れ、カーソルを割り当てるか再利用してコマンドのアクションを実行し、その結果を接続に返します。
  3. あなたの定義によれば、「接続」は複数のカーソルを管理する/管理することができます。
  4. 「接続」は高価で、「カーソル」は安価であるため、これがデータベースにアクセスするための推奨/パフォーマンスの高い方法であると考えています。

でも:

  1. cursorMySQL (およびその他の RDMS) のAは、操作を実行するためのユーザー アクセス可能なメカニズムではありません。MySQL (およびその他のもの) は、"set" として操作を実行します。つまり、SQL コマンドをコマンドの内部リストにコンパイルし、SQL コマンドの性質とテーブル構造に応じて、多数の複雑なビットを実行します。
  2. Acursorは、ストアド プロシージャ内 (およびそこでのみ) で使用される特定のメカニズムであり、開発者が手続き的な方法でデータを操作する方法を提供します。
  3. MySQL の「接続」は、一種の「カーソル」と考えられるものです。MySQL は、テーブル上を移動するだけのイテレータまたはポインタとして内部を公開しません。SQL やその他のコマンドを受け入れる「接続」として内部を公開し、それらのコマンドを内部アクションに変換し、そのアクションを実行し、その結果をユーザーに返します。
  4. これは、「セット」実行スタイルと「手続き型」実行スタイルの違いです (実際には、ユーザーであるあなたがアクセスできる制御の粒度、または少なくとも、RDMS がその内部を抽象化する方法に固有の粒度に関するものです)。 API 経由でそれらを公開する場合)。
于 2013-03-10T22:54:16.063 に答える
2

あなたが言うように、MySQL 接続は安価なので、あなたのケースでは、コードの編成とフロー以外に技術的な利点があるかどうかはわかりません。SQL 'USE' ステートメントを入念に追跡して、1 つのカーソルが現在どのデータベースと通信しているかを追跡するよりも、2 つのカーソルを管理する方が簡単な場合があります。他のデータベースとのマイレージは異なる場合があります -- Django はデータベースにとらわれないように努力していることを思い出してください。

また、同じサーバー上であっても、2 つの異なるデータベースが異なるアクセス資格情報を必要とする場合を考えてみましょう。このような場合、各接続が正常に認証されるように、2 つの接続が必要になります。

于 2013-03-08T19:56:55.390 に答える
0

データベースごとに 1 つのカーソルが必ずしも望ましいとは限りません。これは単なる既定の動作です。

理論的根拠は、異なるデータベースが異なるサーバー上にあることが多く、異なるエンジンを使用しており、異なる初期化オプションが必要であるということです。(そうでなければ、そもそもなぜ異なる「データベース」を使用する必要があるのでしょうか?)

あなたの場合、2 つのデータベースが単なるテーブルの名前空間 (SQL 用語で「スキーマ」と呼ばれるもの) であるが、同じ MySQL インスタンス上にある場合は、必ず単一の接続を使用してください。(そうするように Django を構成する方法は、実際にはまったく別の問題です。)

また、スレッドが 1 つしかなく、同時に 2 つのデータベース ワーカーを実際に必要としない場合は、1 つの接続が 2 つよりも優れていることも正しいです。

于 2013-03-14T22:15:29.047 に答える