数据库性能优化因素
查询速度变慢,写入失败或超时
硬盘速度:机械磁盘,固态SSD,IO瓶颈
内存容量:
网络连接:连接过多,网卡无法支撑更多的网络连接,千兆,高速高并发的写入
索引算法:数据到达一亿或量很大,高并发的读写,可以在软件上读写分离,主从复制,主节点如果支持高并发的写,可以多部署几个从节点实现从节点的读分散
文档建模:数据建模是否合理,是否合理添加了索引
锁机制:数据的一致性、安全性,共享锁,排它锁…
监控日志:数据的采集和持久化,数据目录或其他磁盘分区
MongoDB索引
- 索引设计参考关系型数据库索引
- 大量数据查询,为了提升性能可以借助索引index
- 索引主要是解决查询性能的问题,新的索引提升并发插入写入
- 索引有独立的存储文件格式
- 为了提升性能可以使用独立磁盘分区存储索引
- 索引默认存储在磁盘上
- 查询数据时评估是否使用索引
- 使用索引会读取索引数据到内存中
- 索引算法使用到了
B-tree
算法 - 尽量使用索引长住内存,加速查询
- 索引过多也会影响性能,增加维护和存储成本
MongoDB索引类型
- Single Field 单字段索引
- Compound Index 复合索引 组合索引
- Multikey Index 多键值索引,处理数组字段
- Geospatial Index 地理位置索引 经纬度坐标
- Text Indexs 文本索引 一般用ES
- Hashed Indexs 哈希索引,处理哈希字段
- Partial Indexs b部分索引 3.2版本增加,为满足过滤条件表达式的文档建立索引
- Sparse Indexs 稀疏索引 跳过无字段的文档
- TTL Index TTL索引 生存周期 例如:临时数据
索引Index海量数据加速查询
index索引
加速数据的查询
数据结构:平衡多叉树,B-树,B+树
独立的索引文件,保存在磁盘上
索引数据会加载到内存中
新增数据、修改数据、删除数据 需要维护索引
索引碎片,重建索引 ,比较耗费时间
合理创建索引,经常索引搜索、排序条件的字段
查询计划Query Plan
怎么知道哪些索引用没有用,那个是最好的,查询的时候如何计划和实施
MongoDB索引类型
- Single Field 单字段索引
- Compound Index 复合索引 组合索引
- Multikey Index 多键值索引,处理数组字段
- Geospatial Index 地理位置索引 经纬度坐标
- Text Indexs 文本索引 一般用ES
- Hashed Indexs 哈希索引,处理哈希字段
- Partial Indexs b部分索引 3.2版本增加,为满足过滤条件表达式的文档建立索引
- Sparse Indexs 稀疏索引 跳过无字段的文档
- 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索引限制
从2.6版本开始,如果现有的所有字段的值超过索引键的限制,MongoDB中不会创建索引
集合中索引不能超过64个
索引名的长度不能超过125个字符
符合索引最多可以有31个字段
索引存储在内存中(RAM)应该确保索引的大小不超过内存的限制
如果文档的索引字段值超过了索引键的限制,MongoDB不会将任何文档转换成索引集合
文本搜索用ES
MongoDB索引算法
索引通常能够极大的提高查询的效率
如果没有索引,mongodb必须扫描全部集合,并选取那些符合查询条件的记录
这种扫描全集合的查询操作效率非常低,特别是在处理大量的数据时。查询要花费几十秒甚至几分钟,严重影响网站的性能
索引是特殊的数据结构,B-Tree
索引存储在一个易于遍历读取的数据集合中
索引是对数据库表中一列或多列的值进行排序的一种结构
面试题
Mango DB索引算法
影响数据库性能的因素
如何查看数据库锁?
mongodb索引种类和差异
什么是查询计划?
查询计划竞赛
索引过滤机制