Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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
MySQL-使用ORDER BY相当于非常差的性能_Mysql - Fatal编程技术网

MySQL-使用ORDER BY相当于非常差的性能

MySQL-使用ORDER BY相当于非常差的性能,mysql,Mysql,使用一个包含170万英国邮政编码的表的MariaDB数据库,我试图确定与给定纬度和经度集最近的邮政编码,如下所示: MariaDB [dev]> SELECT COUNT(*) as total, postcode, ( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53

使用一个包含170万英国邮政编码的表的MariaDB数据库,我试图确定与给定纬度和经度集最近的邮政编码,如下所示:

MariaDB [dev]> SELECT COUNT(*) as total, postcode, ( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53.18526) ) * sin( radians( latitude ) ) ) ) AS distance FROM uk_postcodes LIMIT 1;
+---------+----------+--------------------+
| total   | postcode | distance           |
+---------+----------+--------------------+
| 1751331 | AB10 1AA | 276.23821854757585 |
+---------+----------+--------------------+
1 row in set (0.35 sec)
UPDATE uk_postcodes SET latlng = GeomFromText(CONCAT('POINT(',latitude,' ', longitude, ')'));
在本例中,我加入了
COUNT(*)
,以显示表中的记录数量。贴现
COUNT(*)
将导致查询在0.01秒内执行

我需要获取最近的邮政编码,因此我添加了
orderby
语句:

MariaDB [dev]> SELECT postcode, ( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53.18526) ) * sin( radians( latitude ) ) ) ) AS distance FROM uk_postcodes ORDER BY distance LIMIT 1;
+----------+---------------------+
| postcode | distance            |
+----------+---------------------+
| CH5 3PF  | 0.13513453795504218 |
+----------+---------------------+
1 row in set (2.33 sec)
返回正确的结果,但需要很长时间

Google Geocode API可以立即返回最近的邮政编码:


如何立即从数据库返回结果?

以上是我在sql代码注释中的建议,以防性能有所提高:

    SELECT postcode
, min(( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53.18526) ) * sin( radians( latitude ) ) ) )) AS distance
FROM uk_postcodes GROUP BY postcode;

下面是我在sql代码注释中的建议,以防性能有所提高:

    SELECT postcode
, min(( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53.18526) ) * sin( radians( latitude ) ) ) )) AS distance
FROM uk_postcodes GROUP BY postcode;

我已经设法解决了性能问题

表结构
空间索引 latlng油田具有空间索引,其填充方式如下:

MariaDB [dev]> SELECT COUNT(*) as total, postcode, ( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53.18526) ) * sin( radians( latitude ) ) ) ) AS distance FROM uk_postcodes LIMIT 1;
+---------+----------+--------------------+
| total   | postcode | distance           |
+---------+----------+--------------------+
| 1751331 | AB10 1AA | 276.23821854757585 |
+---------+----------+--------------------+
1 row in set (0.35 sec)
UPDATE uk_postcodes SET latlng = GeomFromText(CONCAT('POINT(',latitude,' ', longitude, ')'));

SQL查询
结果
我已经设法解决了性能问题

表结构
空间索引 latlng油田具有空间索引,其填充方式如下:

MariaDB [dev]> SELECT COUNT(*) as total, postcode, ( 3959 * acos( cos( radians( 53.18526 ) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(-3.01984) ) + sin( radians(53.18526) ) * sin( radians( latitude ) ) ) ) AS distance FROM uk_postcodes LIMIT 1;
+---------+----------+--------------------+
| total   | postcode | distance           |
+---------+----------+--------------------+
| 1751331 | AB10 1AA | 276.23821854757585 |
+---------+----------+--------------------+
1 row in set (0.35 sec)
UPDATE uk_postcodes SET latlng = GeomFromText(CONCAT('POINT(',latitude,' ', longitude, ')'));

SQL查询
结果
发生这种情况的原因是ORDER BY强制mysql扫描整个表以查找正确的记录,而没有ORDER的另一个查询只会获取它看到的第一条记录。@Jeff,除了不使用
ORDER BY
,没有其他方法可以解决这个问题吗?最好的办法是使用索引来只扫描感兴趣的记录。。。但如果我理解您的查询意图,我怀疑它必须扫描整个表。。。我对你的查询的理解是:找到离___________;最近的邮政编码。@Jeff,是的,没错。你对邮政编码区域的表示是什么?矩形还是一个点?是否使用几何体类型来存储值?发生这种情况的原因是ORDER BY强制mysql扫描整个表以查找正确的记录,而另一个没有ORDER的查询只是获取它看到的第一条记录。@Jeff,除了不使用按顺序排序之外,没有别的办法了吗?最好的办法是使用索引只扫描感兴趣的记录。。。但如果我理解您的查询意图,我怀疑它必须扫描整个表。。。我对你的查询的理解是:找到离___________;最近的邮政编码。@Jeff,是的,没错。你对邮政编码区域的表示是什么?矩形还是一个点?是否使用几何图形类型来存储值?