0

MIN値とMAX値を取得するための本当に簡単なクエリは、次のようになります。

SELECT  MAX(value_avg)
      , MIN(value_avg) 
FROM value_data 
WHERE value_id = 769 
  AND time_id BETWEEN 214000 AND 219760;

そして、これがvalue_dataテーブルのスキーマです。

CREATE TABLE `value_data` (
  `value_id` int(11) NOT NULL,
  `time_id` bigint(20) NOT NULL,
  `value_min` float DEFAULT NULL,
  `value_avg` float DEFAULT NULL,
  `value_max` float DEFAULT NULL,
  KEY `idx_vdata_vid` (`value_id`),
  KEY `idx_vdata_tid` (`time_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ご覧のとおり、クエリとテーブルは単純で、ここでは何も問題はありませんが、このクエリを実行すると、データを取得するのに約9秒かかります。このクエリのプロファイルも作成しましたが、99%の時間は「データの送信」です。

テーブルは本当に大きく、重さは約2 GBですが、問題はありますか?このテーブルは大きすぎるとは思いません、何か他のものに違いありません...

4

1 に答える 1

1

MySQL は、そのサイズのデータ​​ベースを簡単に処理できます。ただし、このクエリとおそらくテーブル全体のパフォーマンスを向上させることができるはずです。time_id列を に変更するUNSIGNED INT NOT NULLと、その列のデータとインデックスのサイズを大幅に減らすことができます。また、言及したクエリは、上の複合インデックスの恩恵を受ける可能性があります(value_id, time_id)。そのインデックスを使用すると、現在のようにクエリの 1 つだけではなく、両方の部分にインデックスを使用できます。

また、クエリの を使用して質問を編集してくださいEXPLAIN。インデックスについて私が期待することを確認する必要がありますが、常に役立つ情報です。

編集:

テーブルに定義されたインデックスがありませんPRIMARY。これは間違いなく状況を改善していません。の値(value_id, time_id)が一意である場合は、テーブルのインデックスの上で言及した新しい複合インデックスを作成する必要がPRIMARYあります。

于 2013-01-10T17:52:32.387 に答える