0

これが私を悩ませていることです:1つまたは2つのクエリを使用する方がエレガントですか(処理されるデータの量とクエリの数)。

次の偽の構造を使用しましょう。

CREATE TABLE myobj (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(64),
  color varchar(64) DEFAULT NULL,
  price float,
  description text,
  dateofcreation varchar(8) DEFAULT NULL
  PRIMARY KEY (id)
) 

レコード一覧(物名、色、価格)のページを表示したい

List (name, color, price)
      apple, red,    5.00
      brick, orange, 1.00
      corn,  yellow, 2.00

が定義されている場合$_REQUEST['id']は、選択したレコードの詳細 (名前、色、価格、説明、作成日) の合計を表示したいと思いますid

最後に質問:

リスト ビューに 1 つのクエリを使用する方が高速ですか?

SELECT name, color, price FROM myobj

詳細ビューの 1 つのクエリが続きます

SELECT * FROM myobj WHERE id=[id_provided]

また

合計 1 件のクエリ

SELECT * FROM myobj

結果セットの現在の行の ID が http 要求で提供された ID と一致する場合、詳細ビューの値を PHP に保存しますか?

2 つのクエリの方が洗練されていると思いますが、処理時間の点でどれくらい効率的でしょうか (複数の db 接続と無駄なデータを含む重い結果セット)。

4

4 に答える 4

3

これは本当に多くのこと、行数とそのサイズに依存すると思います。

2回の呼び出しにはかなりのオーバーヘッドがあります。ただし、追加データのサイズに応じて、説明フィールドのサイズよりも大きな影響がある場合とない場合があります。「テキスト」の説明フィールドがない場合は、1回の呼び出しの方が明らかに高速です。

しかし、あなたはこれが偽物だと言いました-それで、誰があなたの実際の質問について言うことができます。

于 2013-02-27T16:45:23.787 に答える
1

これはユーザーインターフェイスの質問です。最初に3つの列をレンダリングしてから、詳細を取得しますか?その場合は、レンダリングまでの時間を最小限に抑える必要があります。これは、2つのクエリを使用することを意味します。返されるデータが少ないため、単純なクエリの方がわずかに高速です。

誰かが見る前にすべての詳細を入力する場合は、2番目のフォームを使用してください。それはありそうもないようです。

*さらに重要なことに、この種のクエリで使用することは悪い習慣だと思います。両方のクエリの列のリストを明示的に含める必要があります。

于 2013-02-27T17:12:00.207 に答える
1

必要なデータ量によって異なります。

一般的に - クエリが少ないほど良いです。

「マスター」テーブルと「ディテール」テーブルがあるとしましょう。

100 の「マスター」行がある場合、それらの「詳細」を取得するには 100 のクエリが必要になります。

このような場合-結合ですべてのデータを取得し、ツリー構造(配列)のようなものを構築して、「foreach」ループで表示します。

于 2013-02-27T16:46:28.883 に答える
0

これを見てみましょう。リストビューの最初の提案は

   SELECT name, color, price FROM myobj

これは、a と同じように、完全なテーブル スキャンになりSELECT * FROM myOBJ ます。つまり、o(n) です。

次に、SELECT * FROM myobj WHERE id=[id_provided] このフィールド (id) はインデックス化されているため、複雑さは一定です。その行をすぐに取得します。

ただし、すべてのアイテムの詳細を表示しようとしているように見えます。すべての行を反復処理して、それぞれの詳細を取得しようとしていると思います。n レコードの定数検索は O(n) になります。

すべてのレコードの詳細を取得している場合、select *一度だけではないのはなぜですか?

于 2013-02-27T16:47:20.670 に答える