索引的强大作用和是否创建的索引越多越好

在经常查询字段上创建索引。
在大数据的情况下,在索引上查找可以提交10倍以上甚至1000倍的速度。
实际测试,不在索引上查找用时12秒左右。建立索引,在索引上查找速度提高只耗时1.1秒左右。当然索引也是一把双刃剑,在一个表上创建索引过多反而降低查询速度。
注意:
索引具有包含关系。
如:// 创建复合唯一索引 WpEstateDataCompletenessSchema.index({ real_estate_name: 1, city: 1 }, { unique: true });,实际创建的索引是这个形式:real_estate_name_1_city_1。因为有这个索引,实际上就不需要创建索引:WpEstateDataCompletenessSchema.index({ real_estate_name: 1 });了当然你要是按照city查询,需要创建索引WpEstateDataCompletenessSchema.index({ city: 1 });
若遇到两条记录的主键冲突导致无法插入数据时,重新创建符合唯一主键,需要先删除原来的索引,并且不能删除原来的主键后立即插入原来出问题的记录。要稍微等待下,来避免缓存问题导致的删除索引失败问题。
下面是一个例子,这个是原来以title作为主键(又叫唯一索引):

var Mongoose = require('mongoose');
var ArticleUrlModel = new Mongoose.Schema({

    title: {                         // 文章标题
        type: String,
        required: true,
        unique: true,
        index: true
    },
    url: {                           // 网址(文章地址或PDF文件地址或文章列表地址
        type: String,
        required: true
    },
    date: {                          // 发表时间(文章发表日期或公示日期 格式:2024-03-20)
        type: String,
        required: true,
    },
    name: {                         // 网页名称
        type: String,
        required: true
    },

    update_time: String,
    create_time: String
    

});



module.exports = ArticleUrlModel;

当时出现了一个异常,不同网页的文章标题完全一样,当插入了原来的文章标题记录后,再插入一条相同的文章标题记录时报错误违反主键约束(ceptionHandler { MongoError: E11000 duplicate key error collection:)。
如何处理呢?解决方案是:在title:和name上创建唯一复合主键。删除原来的索引,并注意缓存问题。
修改后的数据表结构:

var Mongoose = require('mongoose');
var ArticleUrlModel = new Mongoose.Schema({

    title: {                         // 文章标题
        type: String,
        required: true,
        index: true
    },
    url: {                           // 网址(文章地址或PDF文件地址或文章列表地址
        type: String,
        required: true
    },
    date: {                          // 发表时间(文章发表日期或公示日期 格式:2024-03-20)
        type: String,
        required: true,
    },
    name: {                         // 网页名称
        type: String,
        required: true
    },

    update_time: String,
    create_time: String
    

});
// 设置复合主键
ArticleUrlModel.index({ title: 1, name: 1 }, { unique: true });


module.exports = ArticleUrlModel;
        // 删除title字段的索引
        ArticleUrlModel.collection.dropIndex('title_1', function(err) {
            if (err) {
                console.log('Error dropping index:', err);
            } else {
                console.log('Index successfully dropped!');
            }
        });

注意:不能删除索引后立即插入原来冲突的记录。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值