私のテーブル構造は次のとおりです。
CREATE TABLE IF NOT EXISTS
commodity_data
(
dataid
bigint(20) unsigned NOT NULL AUTO_INCREMENT,
commodity
smallint(6) NOT NULL,
market
smallint(6) NOT NULL,
quantity
float NOT NULL,
price_min
mediumint(9) NOT NULL,
price_max
mediumint(9) NOT NULL,
price_modal
mediumint(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 分以上かかります。