2017-10-12 84 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秒被排除[也許這是一個錯誤],整個表將被掃描。) –