【发布时间】:2014-10-14 01:21:21
【问题描述】:
我有以下疑问:
SELECT COUNT( Siret ) AS `NbEntr` , `Villes`.`Latitude` AS `Latitude` , `Villes`.`Longitude` AS `Longitude` , ( 6371 * ACOS( COS( RADIANS( 47.29473000 ) ) * COS( RADIANS( `Latitude` ) ) * COS( RADIANS( `Longitude` ) - RADIANS( - 2.35991000 ) ) + SIN( RADIANS( 47.29473000 ) ) * SIN( RADIANS( `Latitude` ) ) ) ) AS `distance`
FROM `Villes`
INNER JOIN `Liste_Etablissements` ON `CodeInsee` = `Code_Insee`
GROUP BY `Code_Insee`
HAVING distance <=30
大公式用于在定义的半径内获取某个点附近的所有城市 (https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql)
这里是查询的解释:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| 1 | SIMPLE | Liste_Etablissements | ALL | Code_Insee | NULL | NULL | NULL | 5596799 | Using temporary; Using filesort
| 1 | SIMPLE | Villes | eq_ref | PRIMARY | PRIMARY | 15 | outilgeoloc.Liste_Etablissements.Code_Insee | 1 |
问题是,当我在 PhpMyAdmin 中执行此查询时,执行需要 6 秒,这很好(我认为?)因为主表大约有 5 000 000 行,但是当我用我的 PHP 代码执行它时,它执行大约需要 30/40 秒。
当我在查询执行期间查看该过程时,我发现它在整个 30/40 秒内都处于“复制到临时表”状态,但使用 Phpmyadmin,它处于“发送数据”状态。
我已将 tmp_table_size 和 max_heap_table_size 设置为 256Mo,但查询执行时间仍然在 30/40s 左右。
那么我可以做些什么来加快查询的执行时间呢?我可以绕过“复制到临时表”步骤吗?
【问题讨论】:
-
部分问题是执行距离计算的成本:创建一个边界框,以便您仅使用 WHERE 子句选择特定纬度和经度之间的行意味着您只计算距离对于您的数据库表的一个子集 - stackoverflow.com/questions/5236921/…
标签: php mysql sql phpmyadmin