我有一张约5kk记录的表
CREATE TABLE IF NOT EXISTS `termo` (
`id` int(11) NOT NULL auto_increment,
`date` timestamp NOT NULL default '0000-00-00 00:00:00' on update CURRENT_TIMESTAMP,
`sensor` varchar(16) NOT NULL,
`temp` float NOT NULL default '-255'
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=5466795 ;
索引
ALTER TABLE `termo` ADD PRIMARY KEY (`id`), ADD KEY `date_3` (`date`,`sensor`);
查询
select pressure, humidity, temp_a, voltage, aqua_temp, home_temp, home_hum, current from
(select temp as pressure from termo force index(date_3) where sensor='000461965E3901' order by date desc limit 0,1) as pressure,
(select temp as humidity from termo force index(date_3) where sensor='000461965E3903' order by date desc limit 0,1) as humidity,
(select temp as temp_a from termo force index(date_3) where sensor='000461965E3902' order by date desc limit 0,1) as temp_a,
(select temp as voltage from termo force index(date_3) where sensor='000461965E3904' order by date desc limit 0,1) as voltage,
(select temp as aqua_temp from termo force index(date_3) where sensor='000461965E3907' order by date desc limit 0,1) as aqua_temp,
(select temp as home_temp from termo force index(date_3) where sensor='000461965E3905' order by date desc limit 0,1) as home_temp,
(select temp as current from termo force index(date_3) where sensor='000461965E3911' order by date desc limit 0,1) as current,
(select temp as home_hum from termo force index(date_3) where sensor='000461965E3906' order by date desc limit 0,1) as home_hum
工作很慢......大约30秒。 请帮助优化。
解释看起来像
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY <derived2> system NULL NULL NULL NULL 1
1 PRIMARY <derived3> system NULL NULL NULL NULL 1
1 PRIMARY <derived4> system NULL NULL NULL NULL 1
1 PRIMARY <derived5> system NULL NULL NULL NULL 1
1 PRIMARY <derived6> system NULL NULL NULL NULL 1
1 PRIMARY <derived7> system NULL NULL NULL NULL 1
1 PRIMARY <derived8> system NULL NULL NULL NULL 1
1 PRIMARY <derived9> system NULL NULL NULL NULL 1
9 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
8 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
7 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
6 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
5 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
4 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
3 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
2 DERIVED termo index NULL date_3 3232 NULL 5193950 Using where
答案 0 :(得分:0)
我认为这可能是更好的方式,但只需INDEX
添加sensor
,因此IN
语句的工作速度更快。
SELECT termo.`sensor`, `temp`
FROM termo
JOIN (
SELECT `sensor`, MAX(`date`) as `lastTemp`
FROM termo
WHERE sensor IN ('000461965E3901', '000461965E3903', '000461965E3902',
'000461965E3904', '000461965E3907', '000461965E3905',
'000461965E3911', '000461965E3906')
GROUP BY sensor
) T
ON termo.`date` = T.`lastTemp`
AND termo.`sensor` = T.`sensor`
还要考虑使用复合INDEX (temp, date, sensor)
要使用正确的标签
SELECT
MAX(CASE WHEN termo.sensor = '000461965E3901' THEN temp END) as pressure,
MAX(CASE WHEN termo.sensor = '000461965E3903' THEN temp END) as humidity ,
MAX(CASE WHEN termo.sensor = '000461965E3902' THEN temp END) as temp_a,
MAX(CASE WHEN termo.sensor = '000461965E3904' THEN temp END) as voltage ,
MAX(CASE WHEN termo.sensor = '000461965E3907' THEN temp END) as aqua_temp ,
MAX(CASE WHEN termo.sensor = '000461965E3905' THEN temp END) as home_temp ,
MAX(CASE WHEN termo.sensor = '000461965E3911' THEN temp END) as current ,
MAX(CASE WHEN termo.sensor = '000461965E3906' THEN temp END) as home_hum
FROM termo
JOIN (
SELECT `sensor`, MAX(`date`) as `lastTemp`
FROM termo
WHERE sensor IN ('000461965E3901', '000461965E3903', '000461965E3902',
'000461965E3904', '000461965E3907', '000461965E3905',
'000461965E3911', '000461965E3906')
GROUP BY sensor
) T
ON termo.`date` = T.`lastTemp`
AND termo.`sensor` = T.`sensor`
答案 1 :(得分:0)
尝试修改这样的每个子选择。我知道这不是最好的方式。我稍后会发送一个较短的查询。
(SELECT temp AS pressure FROM termo WHERE id = (SELECT max(id) FROM termo WHERE sensor='000461965E3901'))
并添加密钥
ALTER TABLE `termo` ADD KEY `sensor` (`sensor`);