2017-07-15 4 views
0

を広げるために:MySQLのクエリの選択は、私は次のように構成されたMySQLのテーブルを持っているテーブルの最適化

CREATE TABLE `MONITORING` ( 
`REC_ID` int(20) NOT NULL AUTO_INCREMENT, 
`TIME` int(11) NOT NULL, 
`DEVICE_ID` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
`MON_ID` varchar(10) COLLATE utf8_unicode_ci NOT NULL, 
`TEMPERATURE` float NOT NULL, 
`HUMIDITY` float NOT NULL, 
PRIMARY KEY (`REC_ID`), 
KEY `SelectQueryIndex` (`TIME`,`MON_ID`)) 
ENGINE=MyISAM AUTO_INCREMENT=102069 DEFAULT CHARSET=utf8 
COLLATE=utf8_unicode_ci 

複数の監視デバイスが正確に分には常に、データを送信ではなく、すべてのモニタは常にオンラインです。私はデータベースを照会し、Google Line Chartに入れるためにデータをフォーマットするためにPHPを使用しています。

Google Chartにデータを取得するには、すべてのMON_IDが1行で表示されるSELECTクエリを実行しています。 (表TIME、その後、3つのモニタのそれぞれの温度とRH列を持つ)

SELECT `TIME`, `H5-C-T`, `P-C-T`, `H5-C-H`, `P-C-H`, `A-T`, `A-H` FROM 
    (SELECT `TIME`, `TEMPERATURE` as 'H5-C-T', `HUMIDITY` as 'H5-C-H' FROM `MONITORING` where `MON_ID` = 'H5-C') AS TAB_1, 
    (SELECT `TIME` as `TIME2`, `TEMPERATURE` as 'P-C-T', `HUMIDITY` as 'P-C-H' FROM `MONITORING` where `MON_ID` = 'P-C') AS TAB_2, 
    (SELECT `TIME` as `TIME3`, `TEMPERATURE` as 'A-T', `HUMIDITY` as 'A-H' FROM `MONITORING` where `MON_ID` = 'Ambient') AS TAB_3 
    WHERE TAB_1.TIME = TAB_2.TIME2 AND TAB_1.TIME = TAB_3.TIME3 

結果は私が欲しいものを正確にですが、クエリのように思える:私は現在、使用しています

Queryがあります結果を出すために必要な時間よりもはるかに長い時間がかかります。

テーブル全体を開くか、1つの監視デバイスのすべての行を選択すると、約0.0006秒かかります(それよりもはるかに優れているとは限りません)。

私が2台のモニタリングデバイスでクエリを実行すると、約0.09秒かかります(まだ悪くはありませんが、かなり大きなパーセンテージの増加)。

私が第3の監視装置を置くと、クエリは約2.5秒になります(これは現在OKですが、より多くのデータが収集され、多くのデバイスが一度にチャートに入る必要があります。過度にかなり速くなる)。

私は人々が自分のクエリを最適化しようとしていたが、私と同じ方法でクエリをやっていたものは見つけられなかった(おそらく私は悪い方法をしている...)。私が複数のインデックスメソッドを試してみたところ、PHP MyAdminでテーブルをチェック、分析、最適化したり、他のいくつかのクエリメソッドを試したり、テーブルのソートフィールドや順序を変更したりしましたが、必要な結果を得る別の方法を見つけることができなかった。

私のテーブルの合計の行数は100,000を少し下回っています。私のクエリ速度は、何千万ものレコードを持つテーブルでクエリを実行した多くの人に基づいて予想されるよりも長くなっているようです。

クエリを最適化する方法についての推奨事項はありますか?

多分、答えは複数のMySQLのクエリのようなもので、どういうわけかPHPでそれらを一緒にマージします(これを行う方法を見つけようとしましたが、うまく動作しませんでした)。

+0

より簡単にお手伝いできるように、表ごとに 'SHOW CREATE TABLE'を提供してください。 –

+0

この種の問題は悪いデザインの症状です – Strawberry

+0

Rick、SHOW CREATE TABLEを追加しました。ストロベリー、私はいくつかの貧しいデザインがあるかもしれないことを理解しています。そのため、私はここで高度に熟練した人々の助けを求めています。 –

答えて

0

内側を裏返しにします。パフォーマンスはかなり良いでしょう:

SELECT h.`TIME`, 
     h.TEMPERATURE AS 'H5-C-T', 
     p.TEMPERATURE AS 'P-C-T', 
     h.HUMIDITY AS 'H5-C-H', 
     p.HUMIDITY AS 'P-C-H', 
     a.TEMPERATURE AS 'A-T', 
     a.HUMIDITY AS 'A-H' 
    FROM MONITORING AS h 
    JOIN MONITORING AS p ON h.TIME = p.TIME 
    JOIN MONITORING AS a ON a.TIME = h.TIME 
    WHERE h.`MON_ID` = 'H5-C' 
     AND p.`MON_ID` = 'P-C' 
     AND a.`MON_ID` = 'Ambient' 

そして、JOIN...ONシンタックスを使用してください。

TIMEとREC_IDの組み合わせは一意ですか?もしそうならば、InnoDBに切り替えてREC_IDを取り除き、KEY SelectQueryIndex (TIME,MON_ID)PRIMARY KEY(TIME, MON_ID)に変更すれば、パフォーマンスはさらに向上します。

また、InnoDBに切り替えることを検討する必要があります。

+0

ありがとうリック!その結果、クエリの速度は3つすべての組み合わせで0.0012にまで低下しました。 –

関連する問題