【问题标题】:MySQL - Does ROUND() make use of indexes?MySQL - ROUND() 是否使用索引?
【发布时间】:2011-12-12 05:26:18
【问题描述】:

MySQL 在使用ROUND() 函数时是否使用任何索引?

考虑这个查询:

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

MySQL 还会在Dist 列上使用我的索引吗?

【问题讨论】:

  • 您可以在查询开始时使用EXPLAIN 来查看它是否正在使用任何索引。
  • 您能解释一下您要通过查询实现的目标吗?
  • 啊,这个查询只是为了演示......我只是在考虑从浮点数更改为整数

标签: mysql indexing rounding


【解决方案1】:

首先您可以使用EXPLAIN 来查看Dist 上的索引是否会在查询中使用。我做了一个实验,发现不是。

实际上,建议是avoid using functions in where clause。另外,这解释了how mysql uses indexes

在您发布的查询中,我认为您可以尝试创建另一个表并放入查询结果:

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

进入该临时表并在距离上建立索引。然后使用索引来加速查询。

【讨论】:

    【解决方案2】:

    如果您以公里为单位存储值并且您想将其转换为米,我认为这个查询就足够了:

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

    以这种方式,如果您为 Dist 定义索引,您将能够使用该索引。 ROUND 函数的第二个参数将识别您需要的小数位,如果您将其设置为 0,则不会有小数,它会自动将值四舍五入。

    【讨论】:

    • 你的查询会报错,答案不是OP问题的答案。
    【解决方案3】:

    不,它不会,而且你的查询也很糟糕。

    【讨论】:

    • 请解释查询错误的原因。
    • 实际上问题存在于查询中的“group by”语句中“Group By Dist”,我相信这会做出同样的事情。在上面的查询中,这意味着每次数据库遇到不同的值时,他首先将它们乘以 1000,然后再继续对值进行分组,如果您的数据库中的数据很少,您将不会观察到它如何影响它的性能目标db 的目的是在尽可能快的时间内为每个查询提供答案...
    • ... 在您的查询中,它似乎也阻碍了该目标,您在上面的评论中说您想将值从浮点数转换为整数,那么为什么不这样做“ROUND(Dist , 0)" 将立即对值和上面的语句进行舍入,即使您将其乘以整数 1000,它仍将再次转换回浮点数,因为您同时乘以 int 和 float。跨度>
    • 以及为什么我说它不会将您的索引用于 Dist 列的另一件事,这仅仅是因为在您的查询中仍有评估过程,因此无论出于何种原因,到那时它都会是一个不同的值,在某些情况下不再是索引的一部分让我们说数据库将使用索引,但它现在将无用,因为在 group by 执行其工作之前发生的过程在处理时间上很昂贵。请注意“Round”是一个函数,里面有一个过程。我希望这是有道理的。 :)
    • 在您使用函数之前,手动验证您期望的结果 "ROUND(Dist*1000)" 我认为这会为您返回错误的结果,它可能只是删除了您的值的小数点例如 49.505 它会变成 49505 这真的是你的目标吗?
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多