为 table 创建好的索引

Creating good indexes for table

我正在使用 MariaDB (MySQL) table,其中包含有关某些地图点(纬度和经度)和数量的信息。

我正在做很多查询来检索其中的一些点,我想优化查询使用索引。不知道怎么做才好。

我的查询是这样的:

SELECT p.id, p.lat, p.lon, p.quantity 
FROM Points p 
WHERE ((p.lat BETWEEN -10.0 AND 50.5) AND 
       (p.lon BETWEEN -30.1 AND 20.2) AND 
       (100 <= p.quantity AND 2000 >= p.quantity)) 
ORDER BY p.name DESC;

所以,查询涉及的列有:latlonquantity

谁能帮帮我?

这里你要的是空间索引。您将需要更改 table 的模式(通过将 latlon 变成单个 POINTGEOMETRY 值)来支持它,并使用查询该值的特定函数。完成此操作后,您可以使用 CREATE SPATIAL INDEX 创建空间索引;该索引将允许您针对该值执行各种高度优化的查询。

在 MySQL in the "Spatial Data Types" section of the MySQL manual 中有更多关于使用空间类型的信息。

当你有多个范围条件时,即使你在所有列上都有一个标准的B树索引,你也只能得到一个索引来优化第一个范围条件。

WHERE ((p.lat BETWEEN -10.0 AND 50.5)              -- index on `lat` helps
   AND (p.lon BETWEEN -30.1 AND 20.2)              -- no help from index
   AND (100 <= p.quantity AND 2000 >= p.quantity)) -- no help from index

您可以索引 lat 或您可以索引 lon 或者您可以索引 quantity 但您的查询将只能使用 B 树索引来优化其中之一这些条件。

这就是为什么@achraflakhdhar 的答案是错误的,也是为什么@duskwuff 的答案建议使用空间索引。

空间索引不同于 B 树索引。空间索引旨在帮助解决此类情况,您需要二维范围条件。

抱歉,这听起来会导致您的项目进行一些返工,但如果您希望对其进行优化,这就是您必须要做的。

折腾你已有的索引,并添加这些:

INDEX(lat, lon),
INDEX(lon, lat),
INDEX(quantity)

提供一些讨论here