2017-11-08 13 views
1

MySQLとクエリは実行の面で非常に高速ですが、何とか私のものは非常に遅いです。大きなテーブルのクエリが非常に遅い

ハードウェア:

  • RAM => 8ギガバイト
  • デュアルコアプロセッサ
  • のWindows Server
  • タスクマネージャ:メモリの30%台= 16で

総レコード、 83,410

テーブル構造:

CREATE TABLE `test_result` (
    `parameter_id` varchar(45) NOT NULL, 
    `parameter_value` varchar(5000) DEFAULT NULL, 
    `test_id` varchar(45) NOT NULL, 
    `package_id` varchar(45) DEFAULT NULL, 
    `client_id` varchar(45) NOT NULL, 
    `added_by` varchar(45) DEFAULT NULL, 
    `added_on` varchar(45) DEFAULT NULL, 
    `modify_by` varchar(45) DEFAULT NULL, 
    `modify_on` varchar(45) DEFAULT NULL, 
    `test_result_status` varchar(45) DEFAULT NULL, 
    `analysis_comment` varchar(5000) DEFAULT NULL, 
    `report_id` varchar(45) NOT NULL, 
    PRIMARY KEY (`report_id`,`client_id`,`test_id`,`parameter_id`), 
    KEY `ehr_test_result_index` (`report_id`,`client_id`,`test_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
/*!40101 SET character_set_client = @saved_cs_client */; 

クエリ:だから

SELECT parameter_id,parameter_value 
FROM test_result 
WHERE client_id = 14274 and report_id = 266432 and test_id = 21; 

、私は、私は、クエリを再実行する場合= 16秒:(

をexeucteにかかる時間を単一のテーブルに対してクエリを実行しています、それはとり4秒、3秒後 (キャッシュが使用されているか、何らかの索引作成のように見えます)

このクエリを最適化するにはどうすればよいですか? parameter_id、client_id、report_id、test_idを数値型に変換する必要がありますか?

+0

返される行の数はいくつですか?クエリとインデックスは大丈夫です。 –

+2

結果をSHOW INDEX FROM test_resultおよびEXPLAIN SELECTのテキストとして送信してください。 –

+0

この表は、VARCHAR以外のMySQLデータ型*その他*を認識していない人が実装したようです。これらの列のいずれかがMySQL整数データ型でサポートされている範囲内の* integer *値を格納している場合は、その列(BIGINT、INT、またはSMALLINT)に整数データ型を使用します。また、add_onおよびmodify_onのようにDATETIMEデータ型を使用できます。 – spencer7593

答えて

0

インデックスは絶対に重要です。数値インデックスは処理するのがはるかに簡単で、フィールド自体はずっと小さくなっています。あなたは現在持っています:

`parameter_id` varchar(45) 
`test_id` varchar(45) 
`client_id` varchar(45) 
`report_id` varchar(45) 

つまり、各インデックスフィールドは45 x 4 = 180バイトです。あなたがテキストとして格納しなければならない場合は、(32ビット整数に相当する典型的な数値フィールドの場合)7バイトになります。もちろん、実際の32ビット整数(INT)として格納するのはわずか4バイトです。 4×4 = 16バイト。つまり、適切な値を見つけるために読むのは1/10くらいですが、数値とテキストの間で変換するのではなく、単純な整数であることに関連した他の最適化があります。私はそれがHUGEのクエリ時間に違いがあると確信しています。

PRIMARY KEYには同じシーケンスの2番目のKEYのすべてが含まれているため、2番目のインデックスは不要です。

+0

説明をありがとう、はい、idsは整数でなければならない、私は確認し、確認します、ありがとう:) – Ashutosh

関連する問題