Python 全栈系列268 数据库浅析
以下从数据出发,介绍了数据与数据库的关系,操作数据库管理数据的方法。
其中,数据库的同步和异步操作是两种截然不同的操作方式,合理使用异步可以在大多数场景使数据库的性能直接翻倍。
应对访问量大的一个方法是部署集群,通过将读写分离,外部用户可以访问副本数据库,从而提升数据系统的处理能力。
最后,基于业务不同的需求,派生出了多种数据库。从SQL和NoSQL的分类,对各种数据库进行了介绍。
1 数据
“数据”是指通过观测、测量或计算收集的定量或定性的事实和信息。这些信息通常用来描述、分析或解释某个现象、情况或过程。数据可以是数字、文字、图像、视频、声音、二进制码等多种形式,取决于所使用的媒体和数据类型。
数据的分类
-
定量数据(Quantitative Data):
- 描述: 以数值形式表示的数据。
- 例子: 人的身高、体重、年龄、收入、温度等。
- 子分类:
- 离散数据: 只能取有限或可数的数值(如学生人数)。
- 连续数据: 可以取任意数值范围内的数值(如温度、身高)。
-
定性数据(Qualitative Data):
- 描述: 用来描述类别或特征的数据,不用数值表示。
- 例子: 性别、颜色、品牌、种类等。
- 子分类:
- 名义数据: 只是用来标识不同类别的标签,没有顺序关系(如性别、城市名)。
- 顺序数据: 除了标识不同类别外,还有自然的顺序(如教育程度:小学、中学、大学)。
数据的特点
- 规模: 数据可以是非常小的,比如单个数值;也可以是非常庞大的,比如包含数百万行的数据库。
- 结构化与非结构化:
- 结构化数据: 有固定的格式或结构(如数据库中的表格数据)。
- 非结构化数据: 没有固定格式(如电子邮件、社交媒体帖子、图像文件等)。
- 来源多样性: 数据可以来自各种来源,如传感器、实验、调查问卷、互联网、社交媒体等。
- 用途广泛: 数据可用于分析、决策、预测、建模、优化等各种应用。
数据的作用
数据是现代社会中非常重要的资源,广泛应用于科学研究、商业决策、工程设计、政府政策制定等多个领域。通过分析和解读数据,人们能够发现规律、做出预测,并优化决策过程。
简单来说,数据是信息的基本构成部分,通过适当的处理和分析,可以为人们提供有价值的洞察和结论。
2 数据与数据库的关系
数据与数据库之间的关系密切且相互依存。数据是构成数据库的基本单位,而数据库则是用于存储、管理和组织这些数据的系统。以下是对数据与数据库关系的详细解释:
1. 数据是什么?
数据是原始的、未经处理的信息。这些信息可以是任何形式的,例如数字、文本、图像、视频、音频等。数据本身并没有太多意义,只有通过整理、分析和解释后才能转化为有用的信息。
2. 数据库是什么?
数据库是一种用于存储和管理数据的有组织的集合。数据库使得数据可以以一种结构化的方式存储,并且易于检索、更新、删除和管理。数据库管理系统(DBMS, Database Management System)是专门的软件,用于管理数据库中的数据。
常见的数据库类型包括:
- 关系型数据库(如 MySQL、PostgreSQL、Oracle):数据以表格形式存储,具有行和列的结构。
- NoSQL 数据库(如 MongoDB、Cassandra):用于存储半结构化或非结构化数据,数据不一定按表格形式存储。
- 内存数据库(如 Redis):数据存储在内存中,以提供极快的读写速度。
- 时序数据库(如 InfluxDB):专门用于处理按时间顺序记录的数据。
3. 数据与数据库的关系
-
数据的存储:
- 数据库的主要功能是存储大量的数据,并为用户提供一种组织和管理数据的方式。数据被存储在数据库的表、文档、键值对或其他结构化形式中。
-
数据的组织:
- 数据库通过预先定义的模式或数据模型来组织数据。比如,关系型数据库使用表结构来组织数据,每个表有特定的列(字段),数据以行的形式存储。
-
数据的访问与管理:
- 数据库提供了各种工具和语言(如 SQL)来方便地访问、查询和操作数据。用户可以通过这些工具来插入新数据、更新现有数据、删除数据或进行复杂的查询。
-
数据的安全性:
- 数据库管理系统提供了一系列的安全机制来保护数据的完整性和机密性。这包括用户权限管理、加密、备份与恢复等功能。
-
数据的一致性与完整性:
- 数据库管理系统确保数据的一致性和完整性。通过事务管理和约束条件,数据库可以防止数据不一致的情况发生。
-
数据的分析与处理:
- 数据库不仅存储数据,还可以帮助分析和处理数据。通过数据库的查询功能,用户可以从大量数据中提取出有用的信息,生成报告或进行数据分析。
总结
- 数据是数据库的内容,数据库负责存储、管理和组织这些数据。
- 数据库为数据的存储提供了结构化的环境,并使数据的访问、管理和处理变得更加高效和安全。
通过数据库系统,用户可以有效地管理大量的数据,并从中提取有价值的信息,从而支持各种应用和决策过程。
3 数据库操作
人如何与数据库交互
人与数据库的交互通常通过中间层或工具进行,这些工具或系统提供了接口,让用户能够查询、修改、管理和维护数据库中的数据。以下是常见的交互方式:
1. 使用数据库管理工具
数据库管理工具提供了用户友好的图形化界面 (GUI) 或命令行界面 (CLI),让用户能够方便地与数据库进行交互。
-
图形化工具:
- phpMyAdmin: 用于管理 MySQL 或 MariaDB,提供图形化界面,可执行查询、创建表、备份等操作。
- pgAdmin: 用于管理 PostgreSQL 数据库,支持查询、表结构修改、数据库备份等。
- MySQL Workbench: 一个全面的 MySQL 数据库设计和管理工具。
这些工具允许用户通过点击和可视化操作,执行 SQL 查询、查看和管理数据,而不需要编写复杂的 SQL 语句。
-
命令行工具:
- 许多数据库也有自己的命令行工具,如 MySQL 的
mysql
CLI、PostgreSQL 的psql
。 - 用户可以直接在命令行中输入 SQL 查询语句,查看结果和执行数据操作。
- 许多数据库也有自己的命令行工具,如 MySQL 的
2. 通过 SQL 查询
SQL(Structured Query Language)是人与关系型数据库交互的主要方式。人们通过编写 SQL 查询语句与数据库通信。常见的 SQL 操作包括:
-
查询数据 (
SELECT
):SELECT * FROM employees WHERE department = 'HR';
-
插入数据 (
INSERT
):INSERT INTO employees (name, age, department) VALUES ('Alice', 30, 'HR');
-
更新数据 (
UPDATE
):UPDATE employees SET age = 31 WHERE name = 'Alice';
-
删除数据 (
DELETE
):DELETE FROM employees WHERE name = 'Alice';
-
创建表 (
CREATE TABLE
):CREATE TABLE employees ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100), age INT, department VARCHAR(50) );
通过编写 SQL,用户可以对数据库进行各种操作,如检索数据、修改表结构等。
3. 通过编程语言与数据库交互
人们还可以通过编写应用程序与数据库交互。许多编程语言提供了数据库驱动或库,用于与数据库通信。应用程序通过执行 SQL 查询来与数据库进行操作。
-
Python:
- 使用
sqlite3
模块与 SQLite 数据库交互,或通过psycopg2
与 PostgreSQL 数据库交互,或者通过mysql-connector-python
与 MySQL 数据库通信。
示例(使用
sqlite3
):import sqlite3 conn = sqlite3.connect('example.db') cursor = conn.cursor() # 执行 SQL 查询 cursor.execute("SELECT * FROM employees") rows = cursor.fetchall() for row in rows: print(row) conn.close()
- 使用
-
Java:
- 使用 JDBC(Java Database Connectivity)与数据库交互,通过 SQL 查询进行数据操作。
-
JavaScript (Node.js):
- 使用
mysql
、pg
等库连接 MySQL 或 PostgreSQL。
- 使用
4. 通过 RESTful API 与数据库交互
许多现代应用程序使用 RESTful API 来与数据库后端交互。API 将数据库操作封装为 HTTP 请求,使得用户或客户端应用可以通过网络发送请求与数据库进行交互。
-
GET 请求用于获取数据:
GET /api/employees
-
POST 请求用于插入数据:
POST /api/employees
API 可以隐藏数据库的具体实现,用户只需通过标准的 HTTP 请求来获取或修改数据。
5. 通过脚本自动化交互
用户可以编写脚本来与数据库进行批量交互。通过脚本可以自动化常见的数据库任务,如数据迁移、定期备份、批量数据导入/导出等。
-
Shell 脚本:
使用mysql
CLI 工具在 Linux 中执行 SQL 脚本:mysql -u username -p database_name < script.sql
-
Python 脚本:
编写 Python 脚本定时导入数据到数据库。
总结
人与数据库的交互方式多种多样,主要通过图形化工具、SQL 查询、编程语言、REST API 和自动化脚本等方式进行。选择哪种方式取决于用户的需求、技能水平和使用的场景。
4 数据库的同步操作与异步操作
在数据库操作中,同步操作和异步操作是两种主要的执行方式,各有优缺点。下面是它们的详细解释和比较:
1. 同步操作
同步操作是指在进行数据库操作时,应用程序必须等待数据库操作完成后才能继续执行后续的代码。这种方式的特点是:
- 阻塞:调用数据库的操作会阻塞当前线程,直到操作完成。
- 简单易用:逻辑简单,易于理解和实现。
- 适用场景:适用于对实时性要求不高的操作,或者在应用程序的复杂度较低时。
示例
import psycopg2
# 同步操作示例(使用 psycopg2 库连接 PostgreSQL)
def fetch_data_sync():
conn = psycopg2.connect("dbname=test user=postgres password=secret")
cur = conn.cursor()
cur.execute("SELECT * FROM my_table")
rows = cur.fetchall()
cur.close()
conn.close()
return rows
data = fetch_data_sync()
print(data)
2. 异步操作
异步操作允许应用程序在进行数据库操作时,继续执行其他任务而不必等待数据库操作完成。异步操作的特点包括:
- 非阻塞:数据库操作不会阻塞主线程,应用程序可以同时执行其他任务。
- 提高性能:可以提高应用程序的吞吐量和响应速度,特别是在处理大量I/O操作时。
- 复杂性:需要使用异步库或框架,编写和管理异步代码相对复杂。
示例
import asyncio
import asyncpg
# 异步操作示例(使用 asyncpg 库连接 PostgreSQL)
async def fetch_data_async():
conn = await asyncpg.connect(user='postgres', password='secret', database='test')
rows = await conn.fetch("SELECT * FROM my_table")
await conn.close()
return rows
async def main():
data = await fetch_data_async()
print(data)
asyncio.run(main())
比较
-
同步操作:
- 优点:实现简单,适合低并发或低复杂度的场景。
- 缺点:性能和响应能力受限,尤其在高并发场景下会造成线程阻塞。
-
异步操作:
- 优点:能够提高应用的性能和响应速度,适合处理高并发或大量I/O操作的场景。
- 缺点:实现复杂,需要管理异步任务的生命周期,调试可能较为困难。
选择
- 使用同步操作:如果你的应用程序不需要处理大量并发请求,或者你希望保持代码的简单性,使用同步操作可能是一个好的选择。
- 使用异步操作:如果你的应用程序需要高并发处理,或者有大量I/O操作的需求,异步操作将帮助提高性能和响应能力。
在实际应用中,选择同步或异步操作往往取决于应用的具体需求和复杂度。
5 数据库集群
分片和副本两种大模式。
数据库集群是一种通过将多个数据库实例组合在一起以提供更高的可用性、性能和可扩展性的架构。集群的实现方式可以根据不同的需求和数据库系统而有所不同。以下是关于数据库集群的一些主要概念和类型:
1. 集群的主要目标
- 高可用性:确保数据库服务在一个或多个节点故障的情况下依然能够正常运行。
- 负载均衡:分配查询和操作的负载,以提高性能和响应时间。
- 可扩展性:支持水平扩展,增加更多的节点来处理更大的数据量和用户请求。
- 灾难恢复:在发生灾难时,能够快速恢复数据和服务。
2. 集群的类型
2.1 主从复制(Master-Slave Replication)
- 主节点(Master):处理所有的写操作。
- 从节点(Slave):复制主节点的数据,处理只读操作。
- 优点:简单易用,适合读多写少的场景。
- 缺点:写操作只能在主节点上进行,主节点故障会导致写操作中断。
2.2 主主复制(Master-Master Replication)
- 主节点:多个主节点之间互相复制数据。
- 优点:提高了写操作的可用性和性能,支持读写分离。
- 缺点:数据冲突管理更复杂,通常需要额外的机制来解决冲突。
2.3 分片(Sharding)
- 数据分片:将数据按某种规则分布到多个节点上。
- 优点:支持水平扩展,可以处理更大的数据量和更高的查询负载。
- 缺点:管理复杂,需要处理跨分片查询和数据迁移。
2.4 高可用性集群(High Availability Clustering)
- 自动故障转移:一个节点故障时,其他节点能够自动接管服务。
- 负载均衡:动态分配负载以提高性能。
- 优点:提高了系统的可靠性和可用性。
- 缺点:通常需要复杂的配置和管理。
2.5 分布式数据库集群
- 分布式架构:数据分布在多个物理位置的节点上,通常具备自我修复和负载均衡能力。
- 优点:非常高的可扩展性和可靠性。
- 缺点:实现复杂,需要处理网络分区和数据一致性问题。
3. 集群管理和工具
- 负载均衡器:如 HAProxy、Nginx、LVS,用于分发客户端请求到不同的数据库节点。
- 故障转移工具:如 Corosync、Pacemaker、Keepalived,用于自动检测故障并进行节点切换。
- 监控工具:如 Prometheus、Grafana、Zabbix,用于监控集群的性能和状态。
4. 数据库集群的常见实现
- MySQL Cluster:提供了高可用性和分布式数据存储功能。
- PostgreSQL Cluster:通过工具如 Patroni 和 pgpool 实现高可用性和负载均衡。
- Cassandra:一个高可扩展性的分布式数据库,支持水平扩展和高可用性。
- MongoDB:提供了副本集和分片功能以支持高可用性和可扩展性。
5. 示例配置
MySQL 主从复制配置示例:
主节点配置(my.cnf):
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=testdb
从节点配置(my.cnf):
[mysqld]
server-id=2
relay-log=mysqld-relay-bin
log-bin=mysql-bin
read-only=1
从节点启动并指定主节点:
CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='replica_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4;
START SLAVE;
总之,数据库集群能够显著提高数据库系统的可靠性、性能和扩展性,但配置和管理可能会比较复杂。选择合适的集群架构和工具要根据具体的应用需求和技术条件。
6 常用数据库
每种数据库都应对着一类业务应用
6.1 SQL类数据库
结构化数据库的代表,适合存储表格数据,但不同的SQL库作用也是不同的。
6.1.1 传统SQL库
MySQL 和 PostgreSQL 是传统的关系型数据库,适合需要事务支持和复杂查询的应用。
单核吞吐能力:20k~50k 条/秒
多核+万兆带宽吞吐能力:100k~200k 条/秒
-
MySQL适用场景: Web应用、中小型企业应用
-
PostgreSQL适用场景:复杂查询、事务支持、GIS
简单理解:传统的SQL数据库非常强调操作的可靠性,适合用来存储关键的表格数据。例如企业注册信息,或者是交易记录。由于其支持表之间的关联,这使得数据的整理和存储看起来更清晰。但支持表关联本身是双刃剑:一方面,由于连表会产生大量的内存开销,有时会直接把服务器内存撑爆,造成停服;另一方面,由于分表存储比较方便,不断分工后会产生过多的表,最终会导致数据迷失。
理想应用:存储高可靠的结构化表格数据。表的级联不要超过3层。
还有一种特殊的传统SQL库: SQLite。这种数据库采用文件形式存在,依赖非常低,大量移动设备(手机)上都使用这种数据库。
6.1.2 列式SQL库
ClickHouse 和 Doris 是高性能的列式数据库,适合大规模数据分析和实时分析场景。
单核吞吐能力:100k~1M 条/秒
多核+万兆带宽吞吐能力:500k~5M 条/秒
- ClickHouse 适用场景:大规模数据分析、实时分析、日志分析
- Doris 适用场景:大规模数据分析、实时分析、日志分析
传统SQL数据库在使用上有一个非常严重的缺陷:统计非常慢。
简单理解:传统数据库是“行式”的,这意味着做任何的统计查询,都要将不相关的字段扫描一遍,效率很低;列式数据库是按列存储数据的,因此在统计时速度非常快。即使数据上亿条,执行许多统计的时间仍然低于1秒。
理想应用:备份与实时分析。由于列式数据库的吞吐能力很高,且压缩比也很高,非常适合将生产库(行式库)中的数据存储到列数数据库中。然后可以基于这个备份的数据库进行实时的统计分析。
还有一个常见的列式数据库HBase,更强调实时写入速度。
1. 数据模型
- 列式存储: HBase 使用列族(Column Families)来组织数据,每个列族包含多个列,每列可以存储不同的数据类型。这样的设计使得 HBase 能够高效地处理大规模数据集。
- 动态列: HBase 支持动态列,可以根据需要在运行时添加新的列,而无需修改数据表结构。
2. 查询方式
- NoSQL 查询: HBase 不支持 SQL 查询语言,它使用自己的 API 进行数据操作和查询。HBase 的查询方式更适合高吞吐量的随机读写操作,而不是复杂的 SQL 查询和分析。
3. 数据存储和处理
- 分布式存储: HBase 设计为分布式系统,可以水平扩展,处理大规模的数据集,支持高并发的数据访问。
- 高吞吐量: 适用于高吞吐量的写入和读取操作,特别是在需要实时数据存储的场景中表现良好。
6.1.3 总结
SQL类数据库的好处是普及率高,使用较为简单。在处理结构化数据时效率比较高,使用起来也比较简单。
SQL类数据库有一个共同的缺点: 结构比较固定,这会带来一系列的问题。
- 1 一旦业务发生变化,需要改表是非常繁重的变化。
- 2 不适合存储弹性比较大的文本字段,如新闻。
6.2 NoSQL类数据库
NoSQL类的数据库类型会比较多,主要可以分为文档、键值和图。
6.2.1 文档数据库
单核吞吐能力:20k~50k 条/秒
多核+万兆带宽吞吐能力:100k~200k 条/秒
MongoDB是这一类数据库的代表。MongoDB也采用和Mysql类似的B树索引和哈希索引,理论上查询差异不大,但MongoDB可以支持更复杂的查询条件。
主要特点:
-
半结构化数据: 数据以文档的形式存储,通常是JSON或BSON格式,文档可以包含嵌套的结构。
-
灵活性: 不需要预定义模式,适合存储和查询复杂的数据结构。
-
查询语言: 支持丰富的查询语言,适合复杂的查询操作。
适用场景:
-
内容管理系统
-
日志和事件数据存储
-
实时分析
简单理解:文档数据库存储的是一张张的单表,这个表对于数据结构不做限制,可json的数据基本上可以直接存储在上面。灵活性是最大的优势。
理想应用:一些吞吐结果为json的应用,比如爬虫或者web服务,使用mongo会比较方便。另外mongo不可以连表,适合将对应的数据维度汇聚在一张表上,所以更合适web类的应用。
还有一类以搜索为主的文档数据库,代表是es(Elasticsearch)
写入能力:~100k 条/秒
简单查询能力:1k~10k 秒
复杂查询能力:100~1k 秒
-
分布式系统: Elasticsearch 是一个分布式系统,可以跨多个服务器和节点水平扩展。这使得它能够处理大量数据和高并发的查询请求。
-
全文搜索引擎: Elasticsearch 最主要的功能是快速高效的全文搜索。它能够处理复杂的查询,并返回相关性排序的搜索结果,支持自然语言处理(如词干提取、同义词处理)。
-
NoSQL 数据库: Elasticsearch 是 NoSQL 数据库的一种,数据以 JSON 文档的形式存储,每个文档都是自包含的。这意味着 Elasticsearch 不使用传统关系型数据库的表结构,而是通过索引(Index)来存储和管理数据。
-
近实时搜索: Elasticsearch 提供了近实时(NRT,Near Real-Time)搜索能力,能够在数据写入后几秒钟内提供搜索功能。
-
分析引擎: 除了搜索功能外,Elasticsearch 还支持复杂的数据分析,可以用于实时数据分析、日志和指标的聚合、数据可视化等。
-
RESTful API: Elasticsearch 提供了丰富的 RESTful API,允许用户通过 HTTP 请求与 Elasticsearch 进行交互,执行各种操作,包括索引文档、执行搜索查询、管理集群等。
常见用途
- 日志管理和分析: 结合 Logstash 和 Kibana,Elasticsearch 常用于日志管理和分析系统,比如 ELK/Elastic Stack。
- 企业搜索: 用于实现企业内部文档、邮件等数据的搜索功能。
- 电商搜索: 提供商品搜索和推荐功能,支持复杂的过滤和排序需求。
- 监控和告警系统: 实时监控系统状态,并基于分析结果触发告警。
理想应用:进行全文匹配查询,日志的存储和查询
6.2.2 键值存储
单核吞吐能力:80k~100k 条/秒
多核+万兆带宽吞吐能力:100k~500k 条/秒
Redis是常见的键值存储数据库,使用内存进行IO。
持久化会降低读写性能:
- 启用 RDB 持久化后,写操作的吞吐量会下降约 30%。
- 启用 AOF 持久化后,写操作的吞吐量会下降约 50%。
主要特点:
-
简单数据模型: 数据以键值对的形式存储,键是唯一的标识符,值可以是任何类型的数据。
-
高性能: 适合读写频繁的场景,通常用于缓存、会话管理等。
-
扩展性: 水平扩展性强,适合大规模分布式系统。
适用场景:
-
缓存系统
-
会话管理
-
实时分析
简单理解:通过内存的高速读取特性与随机访问性能,减少对磁盘数据库的压力。
理想应用:实时统计web数据,例如用户的访问频次;保存用户的会话信息,使得用户可以在多个无状态的web服务间切换;缓存用户查询或者接口结果,避免重复发起耗时操作。
6.2.3 图数据库
Neo4j是主要的代表。性能与图本身的有关,大部分情况下
单核吞吐能力:1k~10k 条/秒
批量导入(neo4j-admin import)能力: 1M~5M
主要特点:
-
图结构: 数据以节点和边的形式存储,适合表示复杂的关系和网络结构。
-
查询语言: 支持图查询语言(如Cypher),适合复杂的图遍历和分析。
-
高性能: 适合处理复杂的关系查询,如社交网络分析、推荐系统等。
适用场景:
-
社交网络分析
-
推荐系统
-
知识图谱
简单理解:记录(实体)之间的关系是一张非常复杂的图,传统数据库无法完成。图库是专门用于记录和查询实体之间复杂关系的数据库。
理想应用:关联关系分析;企业股权关系等。
6.2.4 多模型数据库
ArangoDB 是一个多模型数据库,支持多种数据模型,包括文档、键值对和图。它是一个开源的NoSQL数据库,旨在提供灵活性和高性能的数据存储和查询解决方案。ArangoDB的设计目标是简化开发和维护,同时支持复杂的查询和数据操作。
性能参考对应的对标数据库。
多模型支持:
-
文档存储:类似于MongoDB,数据以JSON或BSON格式存储。
-
键值存储:类似于Redis,数据以键值对的形式存储。
-
图存储:类似于Neo4j,数据以节点和边的形式存储,支持复杂的图查询。
统一的查询语言:
- AQL(ArangoDB Query Language):一种类似于SQL的查询语言,支持文档、键值和图数据的查询。
高可扩展性:
- 支持水平扩展,适合大规模分布式系统。
事务支持:
- 支持ACID事务,适合需要事务一致性的应用。
灵活性:
- 不需要预定义模式,适合存储和查询复杂的数据结构。
适用场景
-
内容管理系统:存储和查询复杂的文档数据。
-
社交网络分析:处理复杂的社交关系和图数据。
-
实时分析:支持实时数据插入和查询。
-
物联网:存储和查询传感器数据和设备信息。
简单理解:ArangoDB是瑞士军刀,集成了集中基本模式的NoSQL数据库功能。
6.2.5 向量数据库
Milvus可作为向量数据库的代表:相似性检索
单核写入能力:100k~1M 条/秒
单核查询能力:1k~10k
Milvus 是一个开源的向量数据库,主要用于处理和管理高维向量数据。这些数据通常来源于机器学习和深度学习模型的嵌入向量,如图像、文本、音频等的特征表示。Milvus 专注于向量检索和相似性搜索任务,因此,它可以归类为以下类型的数据库:
-
- 向量数据库(Vector Database)
核心特性: Milvus 设计用于存储和检索高维向量数据,支持高效的相似性搜索和近似最近邻(ANN)搜索。它能够处理大量的高维向量,提供快速的查询响应。
应用场景: 适用于需要高效处理和检索向量数据的应用,如推荐系统、图像识别、语音识别、自然语言处理等。
- 向量数据库(Vector Database)
-
- 全文检索数据库(Full-Text Search Database)
核心特性: 虽然 Milvus 的主要功能是向量检索,但它也可以用于全文检索的任务,尤其是在与文本嵌入向量结合使用时。
应用场景: 当需要基于文本的语义相似性进行检索时,Milvus 可以与文本处理工具结合,处理类似于 Elasticsearch 的任务。
- 全文检索数据库(Full-Text Search Database)
简单理解:Milvus 提供高效的相似性搜索功能,通过近似最近邻(ANN)算法如 IVF、HNSW 等,能够在海量向量数据中快速找到相似项。
理想应用:作为深度学习中间过程的存储;相似性检索,例如以图查图。
6.2.6 时序数据库
InfluxDB可以作为时序数据库的代表。
单核写入能力:100k~1M 条/秒
单核查询能力:1k~10k
严格来说InfluxDB既可以作为是一种较为独立的类型(时间)数据库,属于NoSQL,且又是Column-Based(这意味着性能也比较高)
InfluxDB 是一个开源的时间序列数据库,专门设计用于处理和分析时间序列数据。时间序列数据指的是在时间上有序的数值数据点,例如传感器读数、监控数据、日志数据等。InfluxDB 由 InfluxData 开发,并在处理高频数据和实时数据分析方面表现出色。
主要特性
-
高性能写入和查询
- 写入吞吐量: InfluxDB 可以处理高频率的写入请求,适合需要快速插入大量时间序列数据的应用。
- 查询效率: 提供高效的查询引擎,支持复杂的聚合和分析操作,能够快速检索和处理时间序列数据。
-
时间序列优化
- 时间戳索引: 内建的时间戳索引优化了基于时间范围的查询性能,特别适合时间序列数据的查询和分析。
- 数据压缩: 使用高效的数据压缩算法,减少存储需求并提高读取速度。
-
灵活的数据模型
- Measurement: 类似于传统数据库的表,每个 measurement 存储一组相关的时间序列数据。
- Tag: 索引数据,用于对数据进行分类和过滤。
- Field: 存储实际的数据值,不用于索引,但可以进行聚合和查询操作。
-
支持 SQL-like 查询语言
- InfluxQL: 类似于 SQL 的查询语言,用于从数据库中提取数据,进行聚合、过滤和计算等操作。
- Flux: 强大的查询和数据分析语言,提供更复杂的功能和数据处理能力,支持流处理和跨多个数据源的查询。
-
内建的监控和警报
- 监控: 提供实时的监控数据,包括系统性能、数据写入和查询性能等。
- 警报: 可以设置警报规则,在满足特定条件时触发通知或执行自动操作。
-
水平扩展能力
- 集群模式: 支持水平扩展,通过增加节点来处理更大规模的数据集和更高的负载。
-
多种数据导入和导出方式
- 支持通过多种方式导入数据,如 HTTP API、CLI 工具、数据转储等。
- 支持数据导出到各种格式,包括 CSV、JSON 等。
-
使用场景
- 基础设施监控: 监控服务器、网络设备、应用程序等的性能数据。
- 应用程序监控: 跟踪应用程序的运行状态、错误率、响应时间等指标。
- IoT 数据分析: 处理和分析来自传感器和设备的实时数据。
- 日志分析: 存储和分析日志数据,进行故障排查和性能优化。
- 金融数据分析: 处理金融市场的数据,进行趋势分析和预测。
简单理解:时序数据库是按照时间顺序来对各种指标进行记录的,各种指标基本上以列的形式随时间轴存储,所以可以有非常好的存储和统计效率。
理想应用:对各种资源进行监控,对各服务、程序的状态进行监控;快速计算基于时间序列的指标。