2017-07-15 54 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 

多個監測設備發送數據時,總是精確的一分鐘,但不是所有的顯示器都是永遠在線。我正在使用PHP查詢數據庫並將數據格式化爲Google折線圖。

要將數據導入到Google Chart中,我正在運行一個SELECT Query,它將所有MON_ID的結果放在一行上。

我目前使用的查詢是:

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 

的結果正是我想要的(表時間,然後爲每個3個監視器的溫度和相對溼度列),但好像查詢所花費的時間比應該給出的結果要長得多。

打開全表或選擇只有一個監測設備的所有行大約需要0.0006秒(不能要求比這更好)。

如果我用2個監視設備進行查詢,大約需要0.09秒(仍然不錯,但增加的百分比很大)。

當我放入第三個監視設備時,查詢時間大約爲2.5秒(現在可以,但是隨着更多的數據被收集並且更多的設備最終需要同時處於圖表中)會很快變得過快)。

我看了很多帖子,其中人們試圖優化他們的查詢,但找不到與我一樣的查詢(可能我這樣做的方式很糟糕......)。從人們爲提高性能所做的其他事情我嘗試了多種索引方法,確保檢查,分析和優化PHP MyAdmin中的表,嘗試了其他幾種查詢方法,更改了表的排序字段/順序等,但一直無法找到另一種方式來獲得我需要的結果,而這種結果更快。

我的表總共有100,000行以下的總數,看起來好像我的查詢速度比我預期的更長,應該是基於我看到對擁有數千萬條記錄的表進行查詢的許多人。

任何建議的方式來優化我的查詢?

也許答案就像多個MySQL查詢,然後以某種方式將它們合併到PHP中(我試圖找出一種方法來做到這一點,但無法讓它工作)?

+0

請爲每個表格提供'SHOW CREATE TABLE',以便我們能夠更輕鬆地爲您提供幫助。 –

+0

這種問題是設計不佳的症狀 – Strawberry

+0

裏克,我添加了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

非常感謝你Rick!所有三個組合的查詢速度下降到0.0012。 –