【已解决】mongodb 保存小说内容用什么数据类型
发布于 7 年前 作者 dkvirus 6870 次浏览 来自 问答

最近在练习小说爬虫。

// mongoose Schema 结构
const ChapterSchema = new mongoose.Schema({
    title: { type: String, required: true },            // 章节名称
    href: { type: String, required: true },             // 章节地址
    sort: { type: Number, required: true },             // 章节序号,取数据时排序用
    belong_novel: { type: String, required: true },     // 所属小说
    belong_author: { type: String, required: true },    // 所属作者
    content: { type: String },                          // 小说内容
});

小说内容用 String 类型定义的,sort 字段表示小说章节排序,如 “第一章 xxx” 的 sort 就是 1,依次类推。

抓了 2800 多章节小说,在取数据时根据 sort 进行排序,每次要花了4-5分钟才行。我现在很纳闷 3000 条不到的数据算大数据量吗??为啥取的这么慢,最终猜测是不是我用 String 定义字段接收导致的??问下大佬们是用什么类型接收长字符串的,或者怎么样能缩短查询时间。

7 回复

buffer 应该更合理

@liuJianHui88 今天将小说内容换成 buffer 字段,取数据时一如既往的慢…

考虑下将小说内容给移出去呗

给 content 加个文本索引试试

ChapterSchema.index({
  content: 'text',
  sort: 1
})

然后用 Redis 缓存数据。 另外也可以考虑上 Elasticsearch

  1. 章节名和内容分表存放
  2. 加索引

我是这样做的,几个g的小说,没遇到啥性能的问题

加缓存

来自酷炫的 CNodeMD

@wangchaoduo 多谢道友:

分表之后速度杠杠滴,因为分表之前直接根据小说名字查所有 3000 多章节,每章节里又有 6000 多字的小说内容,Mongdb 默认一条文档一条文档的找,确实是慢。

试了下只建索引不分表,依然查询缓慢,建表是主要步骤,之后再建索引可以提升查询速度。

贴上看到的一篇介绍索引非常棒的文章:MongoDB索引原理

回到顶部