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


8

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

重述该问题的另一种方法是:

我们知道我们可以有一个包含多列的索引。如果这些列的索引属于不同类型怎么办?说第一列是空间,另一列是fulltextsearch,等等。我们可以在mysql中这样做吗?(奖金:如果您碰巧知道,我们可以在mongodb中这样做)

假设您有一张myisam桌子

它具有包含点的LATLONG列

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

您要先按LATLONG查询,然后在匹配的LATLONG中要基于FULLTEXT列进行过滤。

我想您将需要多列索引。

但是,SQL命令是什么?

众所周知,如果可能的话,mysql将始终首先使用fulltextsearch索引。

该查询:

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

需要很长时间,而此查询:

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

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

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

Answers:


3

不,你不能。

在MySQL中,索引要么是

  • 一个BTREE单或多列索引。

  • 一个可以跨越几列的HASH索引(仅适用于MEMORY表)。

  • 一个SPATIAL索引(仅限MyISAM表)。

  • 一个FULLTEXT指数(可用于MyISAM和5.6.4+ InnoDB表),可跨越若干列CHARVARCHARTEXT类型。

您不能合并这些类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.