场景是目前有个Mongo的collection中的name字段,name字段长度正常在4-10个中文左右,25W数据量。如果我用startswith匹配name查询的话性能会有怎样的压力呢?如果给name字段加上全文索引又会有什么样的好处和坏处呢?
学习是最好的投资!
如果有普通索引的情况下,前缀固定的查询是可以用到索引的。但是不知道你说的startswith是什么方法,如果是驱动里面的,具体还要看是什么驱动及它的文档怎么说。我所指的前缀固定是正则表达式以^开头的匹配,比如:^开头的匹配,比如:
^
db.collection.find({name: /^张/})
如果看一下执行计划,是能看到IX_SCAN的:
IX_SCAN
db.collection.find({name: /^张/}).explain(true)
全文索引就是另一个东西了。简单地说,可以不考虑前缀是否固定,但是全文索引的基本单位是词不是字。所以下面这段话:
词
一师 是 个 好学校
搜索的时候可以直接找你要的词,比如:
db.collection.find({ $text: { $search: "好学校" } })
但是直接搜“校”很可能是搜不到的:
db.collection.find({ $text: { $search: "校" } }) // 无结果
当然这跟不同的分词引擎怎么分法有关,例子只是为说明全文索引的局限性。另外冠词,量词等没有实际意义的词也是会被过滤掉的,比如“个”:
db.collection.find({ $text: { $search: "个" } }) // 无结果
另外可能你也注意到了上面的查询根本没提到name rrreee
name
🎜一师 是 个 好学校🎜
如果有普通索引的情况下,前缀固定的查询是可以用到索引的。但是不知道你说的startswith是什么方法,如果是驱动里面的,具体还要看是什么驱动及它的文档怎么说。我所指的前缀固定是正则表达式以
^
开头的匹配,比如:^
开头的匹配,比如:如果看一下执行计划,是能看到
IX_SCAN
的:全文索引就是另一个东西了。简单地说,可以不考虑前缀是否固定,但是全文索引的基本单位是
词
不是字。所以下面这段话:搜索的时候可以直接找你要的词,比如:
但是直接搜“校”很可能是搜不到的:
当然这跟不同的分词引擎怎么分法有关,例子只是为说明全文索引的局限性。
另外冠词,量词等没有实际意义的词也是会被过滤掉的,比如“个”:
另外可能你也注意到了上面的查询根本没提到
如果看一下执行计划,是能看到name
rrreeeIX_SCAN
的:🎜 rrreee 🎜全文索引就是另一个东西了。简单地说,可以不考虑前缀是否固定,但是全文索引的基本单位是词
不是字。所以下面这段话:🎜 🎜搜索的时候可以直接找你要的词,比如:🎜 rrreee 🎜但是直接搜“校”很可能是搜不到的:🎜 rrreee 🎜当然这跟不同的分词引擎怎么分法有关,例子只是为说明全文索引的局限性。另外冠词,量词等没有实际意义的词也是会被过滤掉的,比如“个”:🎜 rrreee 🎜另外可能你也注意到了上面的查询根本没提到
name
这个字段,因为一个集合上面只能有一个全文索引。🎜