优化mysql中的查询

时间:2016-02-09 22:14:13

标签: mysql


在过去的几个小时里,我一直在摸不着头脑,为查询找到优化,这似乎花费了很多时间:

SELECT d.deviceID ,e.latitude, e.longitude,MAX(e.timestamp) as timestamp 
FROM Device as d INNER JOIN EventData as e ON d.deviceID=e.deviceID 
WHERE e.accountID='$account' AND e.timestamp<=$time AND (e.deviceID IN (SELECT deviceID FROM DeviceList WHERE accountID='$account')) 
GROUP BY (e.deviceID);

所以我要查询一组设备,并为每个设备查询最后一个相关事件      请注意, $ account / $ time 是从$ _POST获得的变量 编辑:表格结构:

CREATE TABLE IF NOT EXISTS `Device` (
      `deviceID` varchar(32) NOT NULL,
      `equipmentType` varchar(40) DEFAULT NULL,
      `description` varchar(128) CHARACTER SET utf8 DEFAULT NULL

);
CREATE TABLE IF NOT EXISTS `DeviceList` (
  `accountID` varchar(32) NOT NULL,
  `groupID` varchar(32) NOT NULL,
  `deviceID` varchar(32) NOT NULL,
);

CREATE TABLE IF NOT EXISTS `EventData` (
  `accountID` varchar(32) NOT NULL,
  `deviceID` varchar(32) NOT NULL,
  `timestamp` int(10) unsigned NOT NULL,
  `statusCode` int(10) unsigned NOT NULL,
  `latitude` double DEFAULT NULL,
  `longitude` double DEFAULT NULL,
  `gpsAge` int(10) unsigned DEFAULT NULL,
  `speedKPH` double DEFAULT NULL
);

1 个答案:

答案 0 :(得分:2)

根本不需要Device表。此外,使用简单的JOIN可以避免IN [子查询]:

SELECT
  e.eviceID,
  e.atitude,
  e.ongitude,
  MAX(e.timestamp) AS timestamp
FROM EventData e
JOIN DeviceList d
  ON e.deviceID = d.deviceID
WHERE e.deviceID   = :account
  AND e.timestamp <= :time
GROUP BY deviceID;

此外,您应该使用预准备语句而不是将用户控制的值放入查询中,但这是一个单独的主题。

相关问题