【已解决】mongodb 保存小说内容用什么数据类型
最近在练习小说爬虫。
// 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
- 章节名和内容分表存放
- 加索引
我是这样做的,几个g的小说,没遇到啥性能的问题
加缓存
来自酷炫的 CNodeMD
@wangchaoduo 多谢道友:
分表之后速度杠杠滴,因为分表之前直接根据小说名字查所有 3000 多章节,每章节里又有 6000 多字的小说内容,Mongdb 默认一条文档一条文档的找,确实是慢。
试了下只建索引不分表,依然查询缓慢,建表是主要步骤,之后再建索引可以提升查询速度。
贴上看到的一篇介绍索引非常棒的文章:MongoDB索引原理