1

私のテーブル構造は次のとおりです。

CREATE TABLE IF NOT EXISTS commodity_data(
dataidbigint(20) unsigned NOT NULL AUTO_INCREMENT,
commoditysmallint(6) NOT NULL,
marketsmallint(6) NOT NULL,
quantityfloat NOT NULL,
price_minmediumint(9) NOT NULL,
price_maxmediumint(9) NOT NULL,
price_modalmediumint(9 ) ) NOT NULL,
date日付 NOT NULL,
modifiedタイムスタンプ NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY ( dataid)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7059415 ;

このテーブルの SELECT には、「商品」、「市場」、および「日付」の 1 つ以上を検索対象とする WHERE 句があります。

私のORDER BYは、price_min、price_max、またはprice_modal、そして時には他のほとんどのフィールドによるものです。

テーブルは最終的に 1,000 万行を超え、1 日あたり約 5 ~ 1 万行ずつ拡大し続けます。

私のサーバーは現在、VPS デュアル 2.4Ghz xeon、4GB RAM です。

現在、唯一のインデックスは「dataid」フィールドにあります。

インデックスの設定が役立つことを読みましたが、これらは商品、市場、および日付に基づいている必要があると思いますが、これを行うより良い方法がない限り、先に進む前にこれが正しいかどうかを確認したかった. テーブルのサイズは約 600MB になり、さらに大きくなります。

「商品」および「市場」フィールドは、他のテーブルの商品および市場の ID を参照します。LEFT JOIN を使用するか、より高速な場合は、これらのテーブルを PHP の配列に読み込みます (単純な 1 レベルの連想配列 id => name)。約 300 の商品と 2,000 の市場があります。

現在、SELECT に時間がかかりすぎています。たとえば、WHERE 句を含む COUNT クエリには 1 分以上かかります。

4

2 に答える 2

2

クエリのテキストの前にEXPLAINを使用して選択クエリを実行すると、MySQLは、クエリ実行プランに関するオプティマイザからの情報と、クエリを高速化するための推奨インデックスを表示します...

于 2012-05-06T09:18:28.160 に答える