空间索引可以是多列索引的一部分吗?

use*_*951 8 mysql index

这里的手册非常不清楚,甚至没有提供一些示例 SQL 语句:http : //dev.mysql.com/doc/refman/5.6/en/column-indexes.html

改写问题的另一种方法如下:

我们知道我们可以有一个多列的索引。如果这些列的索引是不同类型的呢?说第一列是spatial,另一列是fulltextsearch,等等。我们可以在mysql中这样做吗?(奖励:如果您碰巧知道,我们可以在 mongodb 中这样做吗)

假设你有一个 myisam 表

它有一个包含点的 LATLONG 列

它有一个 FULLTEXT 列,其中包含“业务”中的单词

您想先按 LATLONG 查询,然后在匹配的 LATLONG 中根据 FULLTEXT 列进行过滤。

我想您将需要多列索引。

但是什么是 SQL 命令?

我们知道,如果可能,mysql 将始终首先使用全文搜索索引。

这个查询:

SELECT BusinessID as ID ,  
  111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary 
use index (LatLong_2)
WHERE
    MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)=1  
    AND Prominent >15 
    AND MATCH FullTextSearch AGAINST ('sea*' IN BOOLEAN MODE)
    ORDER BY
  Distance
LIMIT
  0, 45
Run Code Online (Sandbox Code Playgroud)

需要很长时间,而这个查询:

SELECT BusinessID as ID ,  
  111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary 
use index (LatLong_2)
WHERE
    MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)=1  
    AND Prominent >15 
    AND MATCH FullTextSearch AGAINST ('sea*' IN BOOLEAN MODE)
    ORDER BY
  Distance
LIMIT
  0, 45
Run Code Online (Sandbox Code Playgroud)

更快,因为我告诉 mysql 使用 latlong_2 索引,这是一个空间查询。

好吧,假设我想要一个多列索引。Latlong_2 和全文搜索。他们是不同的类型。LatLong_2 是空间索引,FULLTEXTSEARCH 是全文搜索索引。我应该运行什么 SQL 命令?

ype*_*eᵀᴹ 4

不,你不能。

MySQL 中的索引可以是

  • 单列BTREE或多列索引。

  • 索引HASH(仅适用于MEMORY表),可以跨越多个列。

  • 索引SPATIAL(仅适用于MyISAM表)。
    (更新:从 5.7 版开始,它们也可用于 InnoDB 表。

  • 索引FULLTEXT(适用于MyISAM5.6.4+InnoDB表),可以跨越CHAR,VARCHARTEXT类型的多个列。

您不能组合这些类型。