2016-04-25 25 views
-1

放缓查询解决方案在与GEOM领域的地理空间索引地理空间搜索,我的时间查询增加anormaly当我要ORDER BY距离,是否有替代语法OU技巧,以避免? 注意我知道这个职位:https://explainextended.com/2011/02/11/late-row-lookups-innodb/ 但这一招不能与查询波纹管实现:限制与ORDER BY对地理空间的MySQL 5.7

没有为了这个查询通过采取0.005s

SELECT 
ST_Distance_Sphere(Point(2.34, 48.85), geom) as distance 
FROM testgeo1 
WHERE ST_Contains(ST_MakeEnvelope(
        Point((2.34+(500/111)), (48.85+(500/111))), 
        Point((2.34-(500/111)), (48.85-(500/111))) 
       ), geom) 
    LIMIT 500 

说明:

+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref | rows | filtered | Extra  | 
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-------------+ 
| 1 | SIMPLE  | testgeo1 | NULL  | range | sp_index  | sp_index | 34  | NULL | 2609 | 100.00 | Using where | 
+----+-------------+----------+------------+-------+---------------+----------+---------+------+------+----------+-------------+ 

这一个ORDER BY需要0.16s

SELECT 
    ST_Distance_Sphere(Point(2.34, 48.85), geom) as distance 
    FROM testgeo1 
    WHERE ST_Contains(ST_MakeEnvelope(
         Point((2.34+(500/111)), (48.85+(500/111))), 
         Point((2.34-(500/111)), (48.85-(500/111))) 
        ), geom) 
ORDER BY distance 
     LIMIT 500 

解决方案,建议,替代语法和技巧,欢迎..

+0

声称提供证据@Rick乌尔链接进入到本地主机..你可以解决它,请 – jess

+0

(对不起...)在HTTP的设计:// MySQL的。 rjweb.org/doc.php/latlng可能会更快。 –

+0

@Rick乌尔metheod看起来有趣,但我会保持最新的Mysql的标准方法,我贴了,这样是为了wihout通过,它只是指向一个共同的mysql的错误非常有效,我在寻找一个简单的替代语法/伎俩,请参阅此说明:https://mariadb.com/kb/en/mariadb/improvements-to-order-by/谢谢anayway – jess

回答

0

如果有成千上万那个信封内的点,...

  • 第一个查询(无ORDER BY)会选择它在信封中找到的第一个500。
  • 第二个查询(用ORDER BY)必须找到所有点在信封中,计算距离的每一个,排序结果,再交付500

这是一个简单的事实,寿命约LIMIT有和没有ORDER BY。它与SPATIAL或5.7没有任何关系。

请了什么,我做

SELECT COUNT(*) 
    FROM testgeo1 
    WHERE ST_Contains(ST_MakeEnvelope(
       Point((2.34+(500/111)), (48.85+(500/111))), 
       Point((2.34-(500/111)), (48.85-(500/111))) 
      ), geom) ; 
+0

输出是1277,我有100万行在表中,不知道什么点.. – jess

+0

它必须计算“ST_Distance_Sphere”1277次。唉,这不足以说明我的观点。请张贴'EXPLAIN SELECT ...' –

+0

我编辑我的帖子,并添加解释查询,我不知道它是一个“通过错误的常见命令”与MySQL,我想测试相同的mariadb,但我不知道该死MySQL 5.7功能尚未实现 – jess