我有一个表foo,它记录了鸟类的踪迹。 foo_id是它的PK,其他相关的列是s_date,纬度和经度。 species_id是它的FK。我有关于s_date,纬度和经度,species_id的索引。表foo有2000万条记录并且还在增加。 以下查询给出了给定纬度/经度的十大最新物种目击。查询占用了太多时间(有时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;
答案 0 :(得分:0)
我知道您在提到的字段上有单独的索引。您可能想尝试在(latitude, longitude)
上添加复合索引(也称为多列索引):
CREATE INDEX ix_foo_lat_lng ON foo (latitude, longitude);
您可能希望在查询上运行EXPLAIN
以查看MySQL正在使用的索引。引自MySQL Manual :: How MySQL Uses Indexes:
假设您发出以下
SELECT
声明:mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
如果
col1
和col2
上存在多列索引,则可以直接获取相应的行。如果col1
和col2
上存在单独的单列索引,优化程序将尝试使用Index Merge optimization,或尝试通过确定哪个索引找到更少的行并使用来查找限制性最强的索引该索引用于获取行。
您可能还有兴趣查看以下演示文稿:
作者介绍了如何使用MySQL中的Haversine Formula按邻近顺序排序,并将搜索限制在一个定义的范围内。他还介绍了如何使用纬度和经度列上的传统索引来避免对此类查询进行全表扫描。