数据库性能优化因素

查询速度变慢,写入失败或超时
硬盘速度:机械磁盘,固态SSD,IO瓶颈
内存容量:
网络连接:连接过多,网卡无法支撑更多的网络连接,千兆,高速高并发的写入
索引算法:数据到达一亿或量很大,高并发的读写,可以在软件上读写分离,主从复制,主节点如果支持高并发的写,可以多部署几个从节点实现从节点的读分散
文档建模:数据建模是否合理,是否合理添加了索引
锁机制:数据的一致性、安全性,共享锁,排它锁…
监控日志:数据的采集和持久化,数据目录或其他磁盘分区

MongoDB索引

  1. 索引设计参考关系型数据库索引
  2. 大量数据查询,为了提升性能可以借助索引index
  3. 索引主要是解决查询性能的问题,新的索引提升并发插入写入
  4. 索引有独立的存储文件格式
  5. 为了提升性能可以使用独立磁盘分区存储索引
  6. 索引默认存储在磁盘上
  7. 查询数据时评估是否使用索引
  8. 使用索引会读取索引数据到内存中
  9. 索引算法使用到了 B-tree 算法
  10. 尽量使用索引长住内存,加速查询
  11. 索引过多也会影响性能,增加维护和存储成本

MongoDB索引类型

  1. Single Field 单字段索引
  2. Compound Index 复合索引 组合索引
  3. Multikey Index 多键值索引,处理数组字段
  4. Geospatial Index 地理位置索引 经纬度坐标
  5. Text Indexs 文本索引 一般用ES
  6. Hashed Indexs 哈希索引,处理哈希字段
  7. Partial Indexs b部分索引 3.2版本增加,为满足过滤条件表达式的文档建立索引
  8. Sparse Indexs 稀疏索引 跳过无字段的文档
  9. TTL Index TTL索引 生存周期 例如:临时数据

索引Index海量数据加速查询

index索引
加速数据的查询
数据结构:平衡多叉树,B-树,B+树
独立的索引文件,保存在磁盘上
索引数据会加载到内存中
新增数据、修改数据、删除数据 需要维护索引
索引碎片,重建索引 ,比较耗费时间
合理创建索引,经常索引搜索、排序条件的字段

查询计划Query Plan

怎么知道哪些索引用没有用,那个是最好的,查询的时候如何计划和实施

MongoDB索引类型

  1. Single Field 单字段索引
  2. Compound Index 复合索引 组合索引
  3. Multikey Index 多键值索引,处理数组字段
  4. Geospatial Index 地理位置索引 经纬度坐标
  5. Text Indexs 文本索引 一般用ES
  6. Hashed Indexs 哈希索引,处理哈希字段
  7. Partial Indexs b部分索引 3.2版本增加,为满足过滤条件表达式的文档建立索引
  8. Sparse Indexs 稀疏索引 跳过无字段的文档
  9. TTL Index TTL索引 生存周期 例如:临时数据

索引Index海量数据加速查询

index索引
加速数据的查询
数据结构:平衡多叉树,B-树,B+树
独立的索引文件,保存在磁盘上
索引数据会加载到内存中
新增数据、修改数据、删除数据 需要维护索引
索引碎片,重建索引 ,比较耗费时间
合理创建索引,经常索引搜索、排序条件的字段

查询计划Query Plan

怎么知道哪些索引用没有用,那个是最好的,查询的时候如何计划和实施

Explain函数分析查询语句性能

explain函数解释器分析mongodb命令执行情况
mongodb提供db.collection.explain()方法, cursor.explain()方法和explain命令,以返回查询计划和查询计划执行统计信息。
explain()返回结果是查询计划
格式为阶段树
每个阶段将其结果(文档和索引键)传递给父节点
叶节点访问集合和索引
内部节点操作指节点产生的文档和索引键
根节点是mongo DB从中派生结果集的最后阶段

解释器命令

db.users.explain().find({age:18})

MongoDB索引过滤器

Index filter索引过滤器
2.6版本增加的特性
mongodb为查询形状筛选最佳的所有
此索引过滤器会为某个query Shape保存
当查询优化器执行查询时,会查找其对应的索引过滤器,并使用此索引

MongoDB查询计划竞赛

有很多查询计划,走这个索引或另外一个索引,选择最优的查询方案
查询计划竞赛机制
MongoDB优化器为查询请求产生多个执行计划
并行执行所有的执行计划
保留执行最快的Query Plan查询计划,其他丢弃
缓存最优的执行计划Plan Cache Flushes
后期多次调用同一个查询使用缓存的查询计划
每次查询都会优先查找匹配的查询计划
没有执行重新生成的过程
查询计划可以更新,也可以删除PlanCache.clear()

MongoDB创建索引

db.users.createIndex(keys,options)
db.users.createIndex({name:1})
1.升序索引 -1降序索引
Options参数
Background后台创建索引,不阻塞主线程
Unique 唯一索引
Name 索引名字
Sparse 默认flase,true只引用包含该字段的文档
expireAfterSeconds TTL多久时间后失效

db.users.createIndex({‘name’:1})
 db.users.createIndex({id:1,age:-1})


数据比较大的时候,主张后台创建索引,性能考量
也可以为集群创建索引

sh.enableSharding(“test”)
 sh.shardCollection(“test.MS”,{“id”:1})
 db.users.createIndex({‘name’:1},{background:true})
 db.users.getIndexs()

删除索引

db.users.dropIndex({name:1})
db.users.dropIndex(“name_1”)

createIndex() 可选参数列表

mongodb使用索引优化查询 mongodb 索引性能_数据

mongoDB索引限制

从2.6版本开始,如果现有的所有字段的值超过索引键的限制,MongoDB中不会创建索引
集合中索引不能超过64个
索引名的长度不能超过125个字符
符合索引最多可以有31个字段
索引存储在内存中(RAM)应该确保索引的大小不超过内存的限制
如果文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引集合

文本搜索用ES

MongoDB索引算法

索引通常能够极大的提高查询的效率
如果没有索引,mongodb必须扫描全部集合,并选取那些符合查询条件的记录
这种扫描全集合的查询操作效率非常低,特别是在处理大量的数据时。查询要花费几十秒甚至几分钟,严重影响网站的性能
索引是特殊的数据结构,B-Tree
索引存储在一个易于遍历读取的数据集合中
索引是对数据库表中一列或多列的值进行排序的一种结构

面试题

Mango DB索引算法
影响数据库性能的因素
如何查看数据库锁?
mongodb索引种类和差异
什么是查询计划?
查询计划竞赛
索引过滤机制