2017-10-12 157 views
1

我有下面的SQL查询并想知道是否有方法来优化查询。MySQL上的SQL查询优化

SELECT * FROM LogEntry WHERE UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(updateTime) > 10; 

将增加对录入指数提高的东西更多的性能可以做,以提高性能

+0

查询中的错误?这只会排除最近10秒内的行;那几乎不是全部桌子? –

回答

5

是。你需要想办法去除列上的功能。所以,如果我有逻辑正确的:

SELECT le.* 
FROM LogEntry le 
WHERE le.updateTime < NOW() - interval 10 second; 

这可以再取上LogEntry(updateTime)指数的优势。

有很好的理由明确列出返回的列。这只会对性能产生很小的影响 - 除非行大小相当大。

+0

“不要隐藏函数内部的索引列('updateTime')('UNIX_TIMESTAMP'和'-')”是一个重要的规则是优化。 –

0

的第一件事我会做的就是删除您选择*,然后选择特定的列

+0

这通常是有用的,但对Gordon的优化来说性能几乎没有那么重要。 –

0

除了优化请求之外,您还可以考虑对表进行分区。例如,您可以在updateTime上对表LogEntry进行分区。如果您的表格中有大量数据,它会大大加快您的请求速度。

注意:要在updateTime上对表进行分区,updateTime必须是主键的一部分。

+0

分区将无济于事。优化器无法在该表达式中看到“unixTime”。所以,它不能做任何修剪。 –

+0

我的建议是除了Gordon的优化之外,对表格进行分区 –

+0

在这种情况下,分区对性能没有帮助。 (此外,由于只有10秒被排除[也许这是一个错误],整个表将被扫描。) –