空間インデックスを複数列インデックスの一部にすることはできますか?


8

ここにあるこのマニュアルは非常に不明確であり、いくつかのサンプルSQLステートメントも提供していません。http//dev.mysql.com/doc/refman/5.6/en/column-indexes.html

質問を言い換える別の方法は次のとおりです。

複数の列を持つインデックスを作成できることはわかっています。それらの列のインデックスが異なるタイプである場合はどうですか?最初の列が空間的で、もう1つが全文検索などであるとします。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

このクエリは長い時間がかかります:

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

代わりに、空間クエリであるlatlong_2インデックスを使用するようにmysqlに指示するため、より高速です。

まあ、私は複数の列のインデックスが欲しいと言います。Latlong_2およびFULLTEXTSEARCH。彼らは別のタイプです。LatLong_2は空間的で、FULLTEXTSEARCHは全文検索インデックスです。どのSQLコマンドを実行する必要がありますか?

回答:


3

いいえ、できません。

MySQLのインデックスは、

  • BTREEシングルまたはマルチカラムインデックス。

  • HASH(のみのために使用可能なインデックスMEMORYのテーブルが)、それはいくつかの列にまたがることができます。

  • SPATIAL(のみで使用可能なインデックスMyISAMテーブル)。

  • FULLTEXT(のために利用可能な指標MyISAMと5.6.4+ InnoDBいくつかの列にまたがることができるテーブル)CHARVARCHARまたはTEXTタイプ。

これらのタイプを組み合わせることはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.