如何在我的mysql表上进行更快速的查询?

时间:2015-06-08 20:45:12

标签: mysql optimization query-optimization

我有下表 I have the following table

正如您所见,它有1868155行。我试图制作一个实时图表,但这是不可能的,因为几乎任何查询都会持续1或2秒。

例如,此查询

SELECT sensor.nombre, temperatura.temperatura
FROM sensor, temperatura
WHERE sensor.id = temperatura.idsensor
ORDER BY temperatura.fecha DESC, idsensor ASC
LIMIT 4

应该表明这一点 enter image description here

我已经尝试了一切,使用索引(可能不正确),只使用我需要的字段而不是*等,但结果是一样的!

这些是表的索引。 Indexes of the table

解释查询 Explain of the query

EDITED EXPLAIN QUERY 2 这是实现

后的查询说明
ALTER TABLE temperatura
ADD INDEX `sensor_temp` (`idsensor`,`fecha`,`temperatura`)

使用内部联接语法进行查询

SELECT s.nombre, t.temperatura
FROM sensor s
INNER JOIN temperatura t
ON s.id = t.idsensor
ORDER BY t.fecha DESC, t.idsensor ASC
LIMIT 4

这是我的整个传感器Sensor table

2 个答案:

答案 0 :(得分:2)

尝试以下方法:

ALTER TABLE temperatura
ADD INDEX `sensor_temp` (`idsensor`,`fecha`,`temperatura`)

我还建议使用现代连接语法:

SELECT s.nombre, t.temperatura
FROM sensor s
INNER JOIN temperatura t
ON s.id = t.idsensor
ORDER BY t.fecha DESC, t.idsensor ASC
LIMIT 4

如果性能仍然不够好,请在进行上述更改后再次报告EXPLAIN。

尝试#2

在仔细查看您尝试做的事情后,我相信下一个查询可能会更有效:

SELECT
s.nombre, t.temperatura
FROM temperatura t
LEFT OUTER JOIN temperatura later_t
ON later_t.idsensor = t.idsensor
AND later_t.fecha > t.fecha
INNER JOIN sensor s
ON s.id = t.idsensor
WHERE later_t.idsensor IS NULL
ORDER BY t.idsensor ASC

您也可以尝试:

SELECT
s.nombre, t.temperatura
FROM temperatura t
INNER JOIN (
    SELECT
    t.idsensor,
    MAX(t.fecha) AS fecha
    FROM temperatura t
    GROUP BY t.idsensor
) max_fecha
ON max_fecha.idsensor = t.idsensor
AND max_fecha.fecha > t.fecha
INNER JOIN sensor s
ON s.id = t.idsensor
ORDER BY t.idsensor ASC

根据我的经验,如果您要查找最新记录,则上述两个查询中的一个将起作用。哪种方法效果最好取决于各种因素,所以请尝试两者。

让我知道这些表演的效果,以及他们是否仍能获得您想要的数据。此外,您运行的任何查询,至少运行3次,并报告所有3次。这将有助于准确衡量给定查询的速度,因为各种外部因素都会影响查询的速度。

答案 1 :(得分:1)

无法优化<html> <head> <style></style> <script type="text/javascript"> function editEmail(){ var demo = document.getElementById('email'); demo.readonly = false; demo.disabled = false; demo.value=" "; return false;} function editMob(){ var demo = document.getElementById('mobile'); demo.readonly = false; demo.disabled = false; demo.value=" "; return false;} </script> </head> <body> <h3>Edit profile</h3><h3>${userName}</h3> <form action="/ChangeProfile" method="post"> <table> <tr> <td><label>Email ID</label></td> <td><input type="text" id="email" name="emailId" value="${emailId}" disabled readonly></td> <td><label><a href="#email" id="Aemail" onclick="editEmail()">edit</a></label></td> </tr> <tr> <td><label>Mobile</label></td> <td><input type="text" id="mobile" name="mobileNO" value="${mobileNO}" disabled readonly /></td> <td><label><a href="#mobile" id="Amobile" onclick="editMob()">edit</a></label></td> </tr> <tr> <td><input type="submit" id="confirm" value="Confirm" /></td> </tr> </table> </form> </body> </html> ASC的混合,如

DESC

您尝试了覆盖索引:

ORDER BY t.fecha DESC, t.idsensor ASC

然而,这个覆盖指数可能更好:

INDEX `sensor_temp` (`idsensor`,`fecha`,`temperatura`)

然后,如果您愿意以不同的顺序获取传感器,请使用

INDEX `sensor_temp` (`fecha`,`idsensor`,`temperatura`)

这将为最后ORDER BY t.fecha DESC, t.idsensor DESC 提供最多 4个传感器:

fecha