0

PHP および mysql(i) スクリプトの速度と複雑さについて何も知らないので、次の質問がありました。

私は3つのテーブルを持つデータベースを持っています:

  • 約9つのフィールドを持つ「製品」。「長い」コンテンツ テキストなど、製品のデータを含む。
  • 2 つのフィールドを持つ「カテゴリ」。カテゴリの名前を含む
  • 2 つのフィールドを持つ「Productcategories」。どの製品にどのカテゴリがあるかを含めます。各製品は 1 ~ 3 のカテゴリの一部です。

ページネーションを設定するために (最後のページが何か知りたいので、row_count が必要です)、それを行うための最も十分な方法は何か、または製品の量 (50、100、500) によって異なります。 ?)。返される結果は、選択したカテゴリによって異なります。

"SELECT * FROM `productcategories` 
JOIN products ON products.proID = productcategories.proID 
WHERE productcategories.catID =$category";

アイデア 1:

  • すべてではなく、1 つのフィールドのみを選択する 1 つのクエリ。次に、mysqli_num_rows() を使用して、ページネーションの合計行数をカウントします。
  • 実際に表示される 5 つまたは 10 の製品 (LIMIT を想定) を直接選択する 2 番目のクエリ。

アイデア 2:

  • 行数に mysqli_nuw_rows() を使用し、後で表示する行を除外する 1 つのクエリ (上記) のみ。

どれが一番いいのかわからない。より少ないデータを選択する必要があるため、アイデア1の方が高速に見えますが、必要な2つのクエリが速度に大きく影響するかどうかはわかりません。「大量」のデータを収集するのと、クエリを実行するのとでは、どちらが最速ですか? 私の考えが完全に間違っている場合は、遠慮なく訂正してください。

4

2 に答える 2

2

一般に、できるだけ少ないデータを返すことがベスト プラクティスと考えられているため、簡単な答えは 2 つのクエリを使用することです。ただし、MySQL は、limit 句なしで返される行数を返すことができる 1 つの興味深い関数を提供します。

FOUND_ROWS()

すべての dbms がこれを実装しているわけではないので、注意して使用してください。

例:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();
于 2013-07-24T21:04:57.260 に答える
0

select count(1) as count...行の総数に使用します。次に、必要に応じてページネーションlimit 0,10などでデータを選択します。

また、合計数については、追加情報を表示するためにのみ使用されるため、productsまたはテーブルに結合する必要はありません。categories

"SELECT count(1) as count FROM `productcategories` WHERE catID=$category";

次に、データの場合:

"SELECT * FROM `productcategories` 
JOIN categories ON categories.catID =  productcategories.catID 
JOIN products ON products.proID = productcategories.proID 
WHERE productcategories.catID=$category limit 0,10";

ただし、* を実際に必要なフィールドに置き換える方がよいでしょう。

于 2013-07-24T20:57:33.063 に答える