我有下表
正如您所见,它有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
应该表明这一点
我已经尝试了一切,使用索引(可能不正确),只使用我需要的字段而不是*等,但结果是一样的!
这些是表的索引。
解释查询
EDITED 这是实现
后的查询说明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
这是我的整个传感器表
答案 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。
在仔细查看您尝试做的事情后,我相信下一个查询可能会更有效:
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