Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据与WHERE共享的计算优化MySQL ORDER_Sql_Mysql_Optimization_Sql Order By_Where - Fatal编程技术网

根据与WHERE共享的计算优化MySQL ORDER

根据与WHERE共享的计算优化MySQL ORDER,sql,mysql,optimization,sql-order-by,where,Sql,Mysql,Optimization,Sql Order By,Where,我有一个MySQL SELECT查询,它在WHERE子句中使用毕达哥拉斯计算距离,将结果限制在某个半径内 我还在ORDERBY子句中使用完全相同的计算,首先按最小距离对结果进行排序 MySQL是否计算两次距离(一次用于WHERE,另一次用于ORDER BY) 如果有,我如何优化查询,使其只计算一次(如果可能的话)?您可以为其选择,将其放入HAVING子句,并在ORDER BY子句中使用,那么计算肯定只进行一次,但我想这会更慢,因为它必须处理更多数据。计算本身并没有那么昂贵。您可以选择它,将它放在

我有一个MySQL SELECT查询,它在WHERE子句中使用毕达哥拉斯计算距离,将结果限制在某个半径内

我还在ORDERBY子句中使用完全相同的计算,首先按最小距离对结果进行排序

MySQL是否计算两次距离(一次用于WHERE,另一次用于ORDER BY)


如果有,我如何优化查询,使其只计算一次(如果可能的话)?

您可以为其选择,将其放入HAVING子句,并在ORDER BY子句中使用,那么计算肯定只进行一次,但我想这会更慢,因为它必须处理更多数据。计算本身并没有那么昂贵。

您可以选择它,将它放在HAVING子句中,并在ORDER BY子句中使用它,那么计算肯定只进行一次,但我想这会更慢,因为它必须处理更多的数据。计算本身并不昂贵

MySQL是否计算两次距离(一次用于WHERE,另一次用于ORDER BY)

不,如果以完全相同的方式写入,则不会执行两次计算。但是,如果您的目标是提高应用程序的性能,那么您可能希望从更大的角度来看问题,而不是专注于这个小细节,因为它最多会给您带来两个不同的因素。更严重的问题是,您的查询妨碍了索引的有效使用,并将导致完全扫描

我建议您更改数据库,以便使用几何图形类型并在数据上创建一个新的几何图形。然后可以使用快速查找位于圆的边界框内的点。一旦你找到了这些点,你可以只在这些点上进行更昂贵的距离测试。如果您的表很大,并且典型的搜索只返回一小部分行,那么这种方法将大大加快速度

如果无法更改数据模型,则仍然可以首先使用边界框复选框来提高性能,例如
,其中x介于10和20之间,y介于50和60之间。“边界框”复选框将能够使用索引,但由于R树索引仅在几何体类型上受支持,因此您必须使用标准B树索引,该索引对于这种类型的查询效率不高(但仍比您当前所做的要好得多)

MySQL是否计算两次距离(一次用于WHERE,另一次用于ORDER BY)

不,如果以完全相同的方式写入,则不会执行两次计算。但是,如果您的目标是提高应用程序的性能,那么您可能希望从更大的角度来看问题,而不是专注于这个小细节,因为它最多会给您带来两个不同的因素。更严重的问题是,您的查询妨碍了索引的有效使用,并将导致完全扫描

我建议您更改数据库,以便使用几何图形类型并在数据上创建一个新的几何图形。然后可以使用快速查找位于圆的边界框内的点。一旦你找到了这些点,你可以只在这些点上进行更昂贵的距离测试。如果您的表很大,并且典型的搜索只返回一小部分行,那么这种方法将大大加快速度


如果无法更改数据模型,则仍然可以首先使用边界框复选框来提高性能,例如
,其中x介于10和20之间,y介于50和60之间。“边界框”复选框将能够使用索引,但由于R-树索引仅在几何体类型上受支持,因此您必须使用标准B-树索引,该索引对于这种类型的查询效率不高(但仍比您当前所做的要好得多)。

您能举一个查询示例吗?这将有助于解决问题。你能举一个查询的例子吗?如果使用lothave而不使用聚合函数通常是一个错误,那么这将对lothave有所帮助。事实上,我想不出哪种情况下它不会是一个错误。我会支持这个计算,因为它并不昂贵。现在,IO绑定的可能性比CPU绑定的可能性大得多。我会选择WHERE超过订单的+限制。您不必这样排序。使用have而不使用聚合函数通常是错误的。事实上,我想不出哪种情况下它不会是一个错误。我会支持这个计算,因为它并不昂贵。现在,IO绑定的可能性比CPU绑定的可能性大得多。我会选择WHERE超过订单的+限制。马克·拜尔斯,虽然我原则上同意,但MySQL的空间特性有些有限,我认为在这种情况下不会有帮助。你应该仔细阅读文档,或者更好的是,用实际数据做一些基准测试。谢谢你的建议。我目前正在避免使用spatial stuff,以后可能会被迫使用它,但如果我这样做的话,我可能会切换到PostgreSQL,因为它对spatial stuff有更好的支持。此外,我已经实现了边界框优化,并且可以确认它提供了显著的改进。我只是担心,当我们在ORDER BY的半径内得到很多点时,距离会计算两次。@mark byers,虽然我原则上同意,但MySQL的空间特性有些有限,我认为在这种情况下不会有帮助。你应该仔细阅读文档,或者更好的是,用实际数据做一些基准测试。谢谢你的建议。我目前正在避免使用spatial stuff,以后可能会被迫使用它,但如果我这样做的话,我可能会切换到PostgreSQL,因为它对spatial stuff有更好的支持。此外,我已经实现了边界框优化,并且可以确认它提供了显著的改进。我只是担心当我们在半径范围内得到很多点时