为 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;
所以,查询涉及的列有:lat
、lon
和quantity
。
谁能帮帮我?
这里你要的是空间索引。您将需要更改 table 的模式(通过将 lat
和 lon
变成单个 POINT
或 GEOMETRY
值)来支持它,并使用查询该值的特定函数。完成此操作后,您可以使用 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
我正在使用 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;
所以,查询涉及的列有:lat
、lon
和quantity
。
谁能帮帮我?
这里你要的是空间索引。您将需要更改 table 的模式(通过将 lat
和 lon
变成单个 POINT
或 GEOMETRY
值)来支持它,并使用查询该值的特定函数。完成此操作后,您可以使用 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