场景是目前有个Mongo的collection中的name字段,name字段长度正常在4-10个中文左右,25W数据量。如果我用startswith匹配name查询的话性能会有怎样的压力呢?
如果给name字段加上全文索引又会有什么样的好处和坏处呢?
怪我咯2017-04-18 09:40:12
如果有普通索引的情況下,前綴固定的查詢是可以用到索引的。但不知道你說的startswith是什麼方法,如果是驅動裡面的,具體還要看是什麼驅動及它的文檔怎麼說。我所指的前綴固定是正規表示式以^
開頭的匹配,例如:
db.collection.find({name: /^张/})
如果看一下執行計劃,是能看到IX_SCAN
的:
db.collection.find({name: /^张/}).explain(true)
全文索引就是另一個東西了。簡單來說,可以不考慮前綴是否固定,但是全文索引的基本單位是词
不是字。所以下面這段話:
一師 是 個 好學校
搜尋的時候可以直接找你要的詞,例如:
db.collection.find({ $text: { $search: "好学校" } })
但是直接搜尋「校」很可能是搜不到的:
db.collection.find({ $text: { $search: "校" } }) // 无结果
當然這跟不同的分詞引擎怎麼分法有關,例子只是為說明全文索引的限制。
另外冠詞,量詞等沒有實際意義的詞也是會被過濾掉的,例如「個」:
db.collection.find({ $text: { $search: "个" } }) // 无结果
另外可能你也注意到了上面的查詢根本沒提到name
這個字段,因為一個集合上面只能有一個全文索引。