0

私のデータをmySQLテーブルにレイアウトするための最良の形式を考えています。これにより、phpでさらに利用される毎日の値の配列を収集するために最速の方法でクエリを実行できます。

これまでのところ、次のようにテーブルをレイアウトしました。

item_id    price_date     price_amount
      1    2000-03-01             22.4
      2    2000-03-01            19.23
      3    2000-03-01             13.4
      4    2000-03-01            14.95
      1    2000-03-02             22.5
      2    2000-03-02            19.42
      3    2000-03-02             13.4
      4    2000-03-02            13.95

item_id をインデックスとして定義します。

また、私は使用しています:

"SELECT DISTINCT price_date FROM table_name" 

日付の一意のリストを含む配列を取得します。

さらに、ループ内にあるコードの部分 (および最適化の質問の焦点) は、現在次のように記述されています。

"SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"

この 2 番目の "SELECT" ステートメントは、実際には、要求された各 item_id の毎日の価格を選択/配列に格納するループ内にあります。

すべてが現在機能しており、mySQL からデータを適切にプルしていますが、上記の「SELECT」ステートメントは両方とも、実行ごとに完了するまでに約 4 ~ 5 秒かかり、100 以上の製品をループして要約を作成すると、合計すると非常に非効率的/遅い情報システム。

結果をより速く取得するために、mySQL テーブルや SELECT ステートメントを構造化するより効率的な方法はありますか? おそらく、別の列に別のインデックスを定義していませんか? EXPLAIN コマンドを使用してクエリごとに情報を返しましたが、EXPLAIN 情報を使用してクエリの効率を高める方法がわかりません。

支援できる可能性のある mySQL ウィザードについて、事前に感謝します。

4

2 に答える 2

1

単一列インデックス

私は使っている:

  "SELECT DISTINCT price_date FROM table_name" 

日付の一意のリストを含む配列を取得します。

price_date列のインデックスを作成すると、このクエリをより効率的に実行できます。

ALTER TABLE table_name ADD INDEX price_idx (price_date);

複数の列インデックス

さらに、ループ内にあるコードの部分 (および最適化の質問の焦点) は、現在次のように記述されています。

  "SELECT price_amount FROM table_name WHERE item_id = 1 ORDER BY price_date"

item_id2 番目のクエリでは、列とprice_date列の両方をカバーするインデックスを作成する必要があります。

 ALTER TABLE table_name ADD INDEX item_price_idx (item_id, price_date);
于 2013-03-01T12:07:36.953 に答える
0

これが少し遅れていることはわかっていますが、これに出くわし、自分の考えをミックスに投入しようと思いました.

よく使われるインデックスは、クエリの高速化に非常に役立ちます (Explain は、特定のクエリに対してどのインデックスが選択されているか (存在する場合) に関する非常に素晴らしい結果を示しています)。ただし、効率的な PHP はさらに役立ちます。

あなたの場合、PHPは表示されませんが、日付のリストを提供し、その日付のすべてのアイテムをループして価格を取得するように見えます。次のようなことを行うと、より効率的になります。

item_id、price_amount を table_name から選択します。ここで、price_date = item_id、price_amount による注文

price_date、item_id、price_amount のインデックス (できれば一意のインデックス) を使用

複数の SQL 接続を伴うループではなく、結果の SQL を 1 つのループで処理します (これは、SQL サーバーが PHP ボックスから分離されている場合に特に当てはまります)。これは、外部ネットワーク接続にオーバーヘッドが生じる可能性があるためです。

ただし、単一のクエリで 4 ~ 5 秒は非常に遅いため (少なくとも 100 倍)、問題 (使用するキーがない非常に大きなテーブル) またはディスクの問題 (潜在的に) を示しています。

于 2014-06-12T09:49:55.080 に答える