2011-12-12 29 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