场景是目前有个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這個字段,因為一個集合上面只能有一個全文索引。
name
如果有普通索引的情況下,前綴固定的查詢是可以用到索引的。但不知道你說的startswith是什麼方法,如果是驅動裡面的,具體還要看是什麼驅動及它的文檔怎麼說。我所指的前綴固定是正規表示式以
^
開頭的匹配,例如:如果看一下執行計劃,是能看到
IX_SCAN
的:全文索引就是另一個東西了。簡單來說,可以不考慮前綴是否固定,但是全文索引的基本單位是
词
不是字。所以下面這段話:搜尋的時候可以直接找你要的詞,例如:
但是直接搜尋「校」很可能是搜不到的:
當然這跟不同的分詞引擎怎麼分法有關,例子只是為說明全文索引的限制。
另外冠詞,量詞等沒有實際意義的詞也是會被過濾掉的,例如「個」:
另外可能你也注意到了上面的查詢根本沒提到
name
這個字段,因為一個集合上面只能有一個全文索引。