mongodb 慢查分析和索引优化
前言
MongoDB 作为一款非常流行的 NoSQL 数据库,由于其灵活的数据模型和易用性,被广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提高,数据库的性能问题逐渐显现出来,其中最常见的就是查询速度的下降,即我们常说的“慢查询”。
慢查询不仅会影响到应用的性能,还可能因此导致整个系统的响应速度下降,严重影响用户体验。因此,对 MongoDB 的慢查询进行分析,并通过优化索引等方法提高查询性能,是每一位使用 MongoDB 的开发者必须掌握的技能。
在接下来的文章中,我将详细介绍 MongoDB 的慢查询分析和索引优化的相关知识。
使用 Profiling 工具进行慢查日志收集
Profiling 工具
Profiling 是 mongodb 的查询分析工具,可以通过其收集 mongo 命令的执行信息。收集的信息将会记录在 system.profile 集合中。
可以通过以下命令来查看是否开启了 Profiling 工具:
1db.getProfilingStatus()
以下是一个返回的示例:
1{ was: 0, slowms: 100, sampleRa ...
mongodb 入门
前言
MongoDB 是一种专为快速开发互联网 Web 应用而设计的数据库,它的设计目标是简洁、灵活,并且能够作为 Web 应用开发栈的重要组成部分。在众多的非关系型数据库中,MongoDB 最接近关系型数据库的特性和表现,这使得它在处理复杂数据结构时,既具有非关系型数据库的灵活性,又不失关系型数据库的严谨性。
在接下来的文章中,我将从零开始,介绍 MongoDB 的基本使用,让各位读者能够顺利地入门这个强大的数据库。
为什么是 MongoDB
MongoDB 的优势很明显,它基于 Json 的数据模型十分贴合开发者的设计思维,灵活动态的 schema 能够极大简化数据库的设计流程。以下引用MongoDB 开发者团队的一次技术分享,你可以根据项目状况判断是否要选择 MongoDB。
如果你还在为是否应该使用 MongoDB 而发愁,不如做几个选择题来辅助决策:
应用不需要事务及复杂 join 支持新应用;
需求会变,数据模型无法确定,想快速迭代开发;
应用需要2000-3000以上的读写QPS(更高也可以);
应用需要TB甚至 PB 级别数据存储;
应用发展迅速,需要能快速水平扩展 ...
使用 docker 构建各种服务(持续更新)
前言
作为后端开发者,日常开发中总是需要依赖到各种各样的环境,如数据库、消息队列、配置中心,有时候还需要调试负载均衡和反向代理等。代码开发可能只是小问题,如何搞定开发环境才是比较麻烦的。
在 docker 出现之前,如果要用到数据库,可能就只能在本地装一个数据库,但如果是初学者的话,总是很容易在安装的时候四处碰壁,需要各种各样的问题,浏览器打开一篇又一篇的博客,搜索如何解决问题。但在 docker 出现之后,一切都可以简化了。不仅构建各种各样的依赖服务简化了,由于容器的隔离性质,各服务之间出现冲突的概率也降低了,这是后端开发者的福音!
这篇文章主要收集和汇总一些常用服务通过 docker 进行部署的方法。
Tips:虽然 docker 容器本身相对于虚拟机来说更加轻量化,但是每个容器依旧需要一些额外的内存和 CPU 资源来维护容器的运行状态和隔离机制。若是个人计算机的性能不是特别高的话,不建议启动太多的容器。你也可以在容器启动的时候,设置每个容器的 CPU 和 内存限制,确保资源的有效利用。
mysql
123456docker run --name mysql \ -p 3306: ...
go 面向对象
前言
在编程领域中,面向对象编程(OOP)是一种广泛使用的编程范式,它通过将数据和操作数据的函数封装成对象,以提高代码的可读性、可维护性和复用性。
Go 语言是一种静态类型、编译型的开源语言,其在语法上并不直接支持面向对象编程,但它提供了一种独特的方式来实现面向对象编程的一些核心理念,如封装、继承和多态。
在这篇文章中,我将探讨如何在 Go 语言中实现面向对象编程,展示一下如何通过 Go 语言的特性来实现面向对象编程。
面向对象思想
面向对象一般是跟面向过程相比较的,网上对这两个概念的介绍还是比较详细的,这里就简单的讲这两个概念分别表示什么。
面向过程,表示我们在编程时,解决一个问题会将其分成多个步骤,然后依次去实现这些步骤来达成目的。
面向对象,表示我们在编程时,会先将一个个事务抽象成对象的概念,然后赋予该对象一些属性和方法,之后让这些对象通过自己的方法,去达成最终的目的。
使用面向对象思想进行程序开发,主要的目的就是降低系统的耦合性,设计出易维护、易复用、易拓展的程序。
由于下面会出现面向对象的三个特性–封装、继承、多态,这里也简单介绍一下:
封装:也就是把客观事物封装成抽象的类, ...
消息队列之RabbitMQ
前言
在现代分布式系统和微服务架构中,消息队列扮演着至关重要的角色。它不仅能够实现系统之间的解耦,还能提供异步处理、负载均衡和削峰填谷等多种功能。RabbitMQ 作为业界广泛使用的消息代理之一,凭借其稳定性、灵活性和丰富的功能,成为了众多开发者和企业的首选。本文将深入探讨消息队列的基础知识,并逐步介绍 RabbitMQ 的基本概念、核心特性及其在 Go 语言中的应用,帮助你在项目中充分利用这一强大的工具。
消息队列
消息队列的作用
消息队列最主要的三个优势:解耦、异步、削峰。
解耦
解耦指的是系统各个部分可以独立开发、部署和维护,不需要直接互相依赖。通过消息队列,生产者和消费者可以独立运行,即使其中一个出现问题,也不会直接影响到另一个。
🌰举个例子:
假设有一个Web应用程序需要记录大量的日志信息,这些日志信息需要存储到不同的日志处理系统中,例如文件系统、数据库或云存储。
不使用消息队列:
Web 应用程序直接调用多个日志处理系统的 API;
每次记录日志时,Web 应用程序必须等待所有日志处理系统处理完毕;
使用消息队列;
Web 应用程序将日志消息发送到消息队列;
各个 ...
golang 并发
前言
在之前的 Go 语言入门 文章中,我们介绍了 Go 语言的基础知识和大部分数据结构。然而,有一个非常常用且重要的数据结构——通道(channel),我们并未进行详述。这是因为通道是 Go 语言中一个复杂且重要的特性,对其的介绍和理解需要投入更多的篇幅和精力。
因此,在这篇文章中,我将专门对通道进行详细介绍,并深入解析 Go 语言的并发是如何处理的。希望通过这篇文章,读者能够深入理解 Go 语言的并发模型,以及通道在其中的作用和使用方法。
并发
进程、线程和协程
我们首先区分一下并发和并行的概念。并发指的是能处理不同的任务,但这些任务并不是同时处理的。而并行指的是能够同时处理不同的任务。真正的并行,是需要靠多核应用来支持的。
接下来,我们介绍一下标题所说的三种’程’。
进程:
进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为"正在执行的程序",它是CPU资源分配和调度的独立单位。
进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的 ...
golang 入门
前言
最近比较空闲,重新回顾了一下 golang 的基础知识,再结合之前的笔记,汇总了下形成了这篇文章。
可以根据目录查看对应的内容,快速回顾一下基础知识。
使用的编辑器:goland
使用的 go 版本:go1.20
简介和入门知识
简介
golang 是由 google 开发的一门开源的编程语言,诞生于 2006年1月2日15点4分5秒(这是重点,要记的),与 2009 年 11 月开源,2012 年发布稳定版本。诞生之初的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++ 等编译语言的性能和安全性”。
这是一门天生支持并发的语言,可以很简单的通过语言特性来实现并发。除此之外,go 还具有以下特点:
属于编译型语言,性能优越,支持跨平台(交叉编译)
丰富的标准库
语言层面定义源代码的格式化(代码风格统一)
语法简单,开发效率高
自带 GC
go 语言的适用场景:
服务端开发
分布式系统、微服务
网络编程
区块链开发
云平台
go 文件结构
go 文件使用 .go 作为文件后缀。
所有的 go 文件都必须包含包名,通过 package 关键字指定,且同一个目 ...