2011-12-12 31 views
0

當使用ROUND()函數時,MySQL是否使用任何索引?MySQL - ROUND()是否利用索引?

考慮這個查詢:

SELECT CPRID,ROUND(Dist*1000) AS `Distance` 
FROM CPRaw_ID1 
GROUP BY ROUND(1000*Dist) 
ORDER BY ROUND(Dist*1000) 

將MySQL的使用還是對Dist列我的指數?

+0

您可以在查詢開始時使用'EXPLAIN'來查看它是否使用了任何索引。 – hafichuk

+0

你能解釋一下你試圖用你的查詢來達到什麼嗎? – hafichuk

+0

啊,查詢只是爲了演示..我只是考慮改變從一個浮點數到一個詮釋 – Simon

回答

4

首先,您可以使用EXPLAIN來查看Dist中的索引是否將用於查詢。我做了一個實驗,發現事實並非如此。

其實,建議是avoid using functions in where clause。另外,這解釋了how mysql uses indexes

在您發佈的查詢,我想你可以嘗試創建另一個表,並把查詢結果:

SELECT CPRID,ROUND(Dist*1000) AS `Distance` 
FROM CPRaw_ID1 

到該臨時表,並在距離建立索引。然後,該索引將用於加速查詢。

-3

不,它不會,你也有一個錯誤的查詢。

+0

謝謝,你能解釋不好的查詢? – Simon

+0

請解釋查詢不好的原因。 – idstam

+0

實際上問題在您的查詢中的「group by」語句中存在我沒有看到任何理由說明爲什麼您仍然需要將每個值乘以1000,您可以直接使用「Group By Dist」相信會做出同樣的事情。在上面的查詢中,這意味着每次數據庫遇到不同的值時,如果數據庫中的數據很少,那麼他將首先將它們乘以1000,然後繼續對這些值進行分組,否則將無法觀察它會如何影響其性能目標的數據庫是在最快的時間內爲每個查詢提供答案... –

0

,如果你的存儲公里的價值觀和你想將它轉換爲米,我認爲這個查詢就足夠了:

SELECT CPRID, ROUND(Dist*1000, 2) AS `Distance` 
FROM CPRaw_ID1 
GROUP BY Dist 
ORDER BY Dist 
以這種方式

你會可以,如果你定義的索引使用索引Dist。 ROUND函數中的第二個參數將標識您需要的小數位數,如果將其設置爲0,則不會有小數,它會自動舍入值。

+0

您的查詢將引發錯誤,並且答案不是OP的問題的答案。 – newtover