簡體   English   中英

MySQL選擇查詢以擴大表優化

[英]MySQL Select Query to Widen Table Optimization

我有一個具有以下配置的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圖表中,我正在運行SELECT查詢,該查詢將所有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

結果正好是我想要的(三個表分別帶有TIME的表和一個Temp和RH列的表),但是看起來查詢花費的時間比給出結果要長得多。

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

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

當我放入第三個監視設備時,查詢時間大約為2.5秒(現在可以了,但是隨着收集的數據越來越多,並且越來越多的設備最終需要一次顯示在圖表中,它將會變得越來越多余)非常快)。

我看過很多人在嘗試優化查詢的帖子,但找不到與我使用相同方法進行查詢的任何帖子(也許我做的不好。。。)。 人們為了提高性能所做的其他事情,我嘗試了多種索引方法,確保檢查,分析和優化了PHP MyAdmin中的表,嘗試了其他幾種查詢方法,更改了表的排序字段/順序等,但是還沒有找到另一種方法來獲得我需要的結果,這更快。

我的表的總行數不到100,000,而我的查詢速度似乎比預期的要長得多,這是基於我看到的對具有數千萬條記錄的表進行查詢的許多人的結果。

關於優化查詢的任何建議?

也許答案是類似多個MySQL查詢,然后以某種方式將它們合並到PHP中(我試圖找出一種方法來執行此操作,但無法使其正常工作)?

把東西翻過來; 性能會好很多:

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM