MongoDB 慢查询优化
什么是慢查询
慢查询是指执行时间较长的查询操作。
通常,数据库查询都会迅速的完成,但当表的数据量非常庞大(例如数十万行或更多)时 ,频繁地从这些表中查询会增加数据库的负担。这可能导致硬件资源的过度使用,例如CPU占用率较高、内存使用率过大、系统负载过高。因此,查询操作会变得“慢”,单次查询耗时数百毫秒甚至数秒钟。
为了优化查询性能,我们可以采取一些措施,例如:
- 索引优化:创建适当的索引以加速查询。
- 查询优化:编写高效的查询方式,避免不必要的计算和数据传输。
- 硬件优化:增加服务器的硬件资源,以处理更大的数据集。
- 多集群存储数据:参考应用数据多集群存储与行记录多集群存储,增加纵向能力,减轻业务持续增长对单一数据库持续带来压力。
索引优化
在 HAP 社区中,有一位同学以自己见解写了一篇 MongoDB的索引优化 帖子,这里作为引用,大家可以参考。
索引的基本知识与索引创建管理也可以参考 HAP 帮助文档。
查询优化
对于数十万行或更多数据量的工作表,在做批量筛选、查询时,要注重查询方式,提前创建查询条件中涉及到的字段索引。
通常,最佳的查询方式是精确查询,比如使用 “等于” 条件。尤其是当字段值不重复且已建立索引时, 这种查询方式的效率极高。
另外,也有一些查询方式是不会走索引的:
-
筛选条件中,不等于、不包含、开头不是等否定条件,都不会走索引
-
筛选条件中包含、为空的筛选条件,不走索引
-
筛选条件中,增加 “或” 的筛选条件,不走索引
-
工作表右上角的搜索功能为正则查询方式,不走索引
-
选项类型字段,如果单个选项值占比高,搜索不会走索引
-
文本字段勾选了支持拼音排序时,排序索引不生效
对于数据量庞大的工作表,尽量减少使用以上列举的大批量查询条件,可以降低数据库负载。
硬件优化
-
扩容 CPU 核数:
- MongoDB 是一个多线程应用程序,因此增加 CPU 核数可以提高并发处理能力。
- 选择高性能的多核 CPU,以便更好地处理查询和写入操作。
-
扩容内存:
- 内存对 MongoDB 性能至关重要。增加内存可以提高缓存效率,减少磁盘 I/O。
- MongoDB 使用内存作为工作集缓存,因此足够的内存可以减少磁盘读取次数,提高查询性能。
-
使用高性能 SSD 磁盘:
- SSD 磁盘比传统的机械硬盘(HDD)更快,具有更低的访问延迟和更高的吞吐量。
- MongoDB 的默认存储引擎是 WiredTiger,它对 SSD 磁盘的支持非常好。
慢查询索引优化实践
查找日志
在 MongoDB 进程占用 CPU 较高的情况下,通常是大量慢查询语句占用,可以通过查看 MongoDB 日志,找到对应慢查询语句,进一步优化。
- HAP 单机模式
- HAP 集群模式
MongoDB 日志默认路径:/data/hap/script/volume/data/logs/mongodb.log
如自定义过数据路径,请在实际的数据路径下寻找
请到部署 MongoDB 的服务器上寻找 mongodb.log 文件
由官方部署通常会在如下路径:/data/logs/mongodb/mongodb.log
日志分析示例
在日志最新的内容中,可以看到很多的日志内容,这里挑选两个示例进行分析