MySQL的处理常规B树索引最喜欢的实现:该指数可以帮助只在索引中最左边的列的范围条件。
我使用的比喻是一本电话簿。如果我搜索一个特定的姓氏,像“Smith,John”这样的名字对可以帮助你。我对姓氏“史密斯”的搜索很快,在史密斯内搜索“约翰”很快。
但是如果我搜索了一系列条件,如“所有的人都姓始于‘S’”,然后我得到的电话号簿的一个子集,但不是所有的命名人“约翰”的排序在一起。它们分散在我根据姓氏选择的子集中。
这是因为这个原因,MySQL的检索B树索引到第一个范围条件,再没有任何进一步的使用索引。您仍然可以为其他维度创建条件,但它将对通过第一维匹配的所有行执行手动搜索。
换句话说,即使你有(lat, long)
一个复合索引,MySQL不会使用索引的long
部分:
select ... from tableName
where lat >= 14.1232 and lat <=13.123 /* index-assisted */
and lng >=-80.123 and lng <=-79.232 /* full scan */
and name like '%greg%' /* pattern search never uses index anyway */
(顺便说一句,你的LAT条件永远是你真正的已经写了,但我会假设你的意思是要颠倒的数字。)
由于两者都搜索一定范围的值,因此经纬度为&时效率低下。
因此,MySQL有另一种类型的索引,它不是B树索引。这是一个SPATIAL
索引,它支持多种范围条件。
CREATE TABLE mytable (
name TEXT NOT NULL,
coord POINT NOT NULL,
SPATIAL INDEX (coord)
);
INSERT INTO mytable (name, coord)
VALUES ('name', ST_GeomFromText('POINT(14.0 -80)'));
SELECT name FROM mytable
WHERE MBRContains(
ST_GeomFromText('Polygon((
13.123 -80.123,
14.1232 -80.123,
14.1232 -79.232,
13.123 -79.232,
13.123 -80.123))'),
coord);
是的,这是更复杂的,但它是唯一的方法,你可以得到真正的索引优化的纬度/经度搜索。
阅读更多关于它的地方:http://dev.mysql.com/doc/refman/5.7/en/using-spatial-data.html
听起来像你已经有了它的工作。你是否在lat&lng列中添加了索引,或者你在问什么? – mba12
即时通讯只是想知道如何处理其查询的顺序...我敢肯定,查询的第一部分(索引纬度)缩小了,但查询的第二部分呢? (索引lng) – rikkitikkitumbo