这里的手册非常不清楚,甚至没有提供一些示例 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 命令?
不,你不能。
MySQL 中的索引可以是
单列BTREE
或多列索引。
索引HASH
(仅适用于MEMORY
表),可以跨越多个列。
索引SPATIAL
(仅适用于MyISAM
表)。
(更新:从 5.7 版开始,它们也可用于 InnoDB 表。
索引FULLTEXT
(适用于MyISAM
5.6.4+InnoDB
表),可以跨越CHAR
,VARCHAR
或TEXT
类型的多个列。
您不能组合这些类型。
归档时间: |
|
查看次数: |
1335 次 |
最近记录: |