1

我有一个 Table foo 记录鸟类的目击记录。foo_id 是它的PK,其他关注的列是s_date、纬度和经度。species_id 是它的 FK。我有关于 s_date、纬度和经度、species_id 的索引。表 foo 有 2000 万条记录并且还在增加。以下查询为我提供了给定纬度/经度的前 10 个最新物种目击事件。查询花费了太多时间(有时超过 10 分钟)。如何优化它?我正在使用mysql。

SELECT species_id, max(s_date) 
FROM foo 
WHERE latitude >= minlat 
    AND latitude <= maxlat 
    AND longitude >= minlon 
    AND longitude <= max lon 
GROUP BY species_id 
ORDER BY MAX(s_date) DESC LIMIT 0, 10;
4

1 回答 1

0

我了解您在提到的字段上有单独的索引。您可能想尝试在以下位置添加复合索引(又名多列索引)(latitude, longitude)

CREATE INDEX ix_foo_lat_lng ON foo (latitude, longitude);

您可能希望EXPLAIN在查询上运行以查看 MySQL 正在使用的索引。引用MySQL 手册 :: MySQL 如何使用索引

假设您发出以下SELECT语句:

mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

col1如果和上存在多列索引col2,则可以直接获取相应的行。col1如果和上存在单独的单列索引col2,优化器将尝试使用索引合并优化,或者通过确定哪个索引找到较少行并使用该索引来获取行来尝试找到最严格的索引。

您可能也有兴趣查看以下演示文稿:

作者描述了如何使用 MySQL 中的Haversine 公式按邻近度排序并将搜索限制在定义的范围内。他还描述了如何避免对此类查询进行全表扫描,在纬度和经度列上使用传统索引。


1 个 PDF 版本

于 2010-09-23T19:13:13.780 回答