首页 > 数据库 >第20篇:Milvus与数据库系统的比较与整合

第20篇:Milvus与数据库系统的比较与整合

时间:2024-06-20 23:28:15浏览次数:13  
标签:20 数据库 高维 Milvus 数据库系统 数据 image 向量

随着大数据和人工智能技术的迅猛发展,数据库技术也在不断进化。关系型数据库(RDBMS)作为传统的数据管理工具,已经在数据存储和处理领域占据了重要地位。而近年来,向量数据库(如Milvus)专为处理高维向量数据而设计,特别适用于大规模、高维数据的相似性搜索和分析。本文将详细比较Milvus与传统关系型数据库系统的优缺点及适用场景,并探讨如何进行两者的数据整合,以发挥各自的优势。

文章目录

一、关系型数据库与向量数据库的比较

1.1 关系型数据库(RDBMS)

关系型数据库(RDBMS)基于关系模型,通过表格来存储和管理数据。常见的关系型数据库包括MySQL、PostgreSQL、Oracle等。

优点
  1. 数据完整性:关系型数据库通过外键约束、事务管理等机制保证数据的一致性和完整性。
  2. 复杂查询能力:支持复杂的SQL查询,包括多表连接、子查询、聚合等操作。
  3. 事务支持:ACID(原子性、一致性、隔离性、持久性)事务保证数据操作的可靠性。
  4. 广泛应用:适用于大多数传统业务应用,如财务管理、客户关系管理(CRM)等。
缺点
  1. 扩展性差:关系型数据库的扩展性有限,难以处理超大规模的数据。
  2. 性能瓶颈:在处理高并发、大量复杂查询时,可能出现性能瓶颈。
  3. 高维向量处理能力不足:不适用于处理高维向量数据和相似性搜索。

1.2 向量数据库(如Milvus)

向量数据库专为处理高维向量数据而设计,通过向量相似性搜索实现快速检索。Milvus是一个开源的向量数据库,支持大规模、高维向量数据的管理和检索。

优点
  1. 高效相似性搜索:针对高维向量数据进行优化,提供高效的相似性搜索功能。
  2. 水平扩展:支持分布式存储和计算,具有良好的扩展性。
  3. 多种索引支持:支持多种索引类型(如IVF、HNSW),根据数据特性选择最优索引。
  4. 易于集成:与大数据和机器学习工具(如Apache Spark、TensorFlow)集成方便。
缺点
  1. 事务支持不足:缺乏关系型数据库的ACID事务支持,数据一致性保障较弱。
  2. 查询能力有限:不支持复杂的SQL查询,仅适用于相似性搜索和简单过滤。
  3. 数据结构单一:主要针对向量数据,无法处理复杂的数据关系和多表操作。

1.3 比较总结

特性 关系型数据库 向量数据库(如Milvus)
数据完整性
复杂查询能力
事务支持 ACID 基本不支持
扩展性 一般
性能 一般(高并发、大数据量下)
高维向量处理能力
适用场景 传统业务应用 高维数据相似性搜索

二、Milvus与数据库系统的整合

数据整合的方法

为了充分利用关系型数据库和向量数据库的各自优势,可以通过以下几种方式进行数据整合:

  1. 联合查询:在应用层通过代码实现跨数据库的联合查询,将关系型数据库中的结果与Milvus中的向量数据进行整合。
  2. 数据同步:定期或实时将关系型数据库中的数据同步到Milvus,进行向量化处理并存储在Milvus中。
  3. 消息队列:通过消息队列(如Kafka)实现数据的实时传输和处理,将关系型数据库中的更新数据实时发送到Milvus进行处理。

三、详细应用示例

为了更好地理解和应用Milvus与关系型数据库的整合,以下是一个详细的应用示例,展示如何将两者结合在一起,处理图像搜索应用。

场景描述

在一个图像搜索应用中,用户上传一张图像,系统会返回与该图像相似的图像列表。图像的元数据(如图像ID、描述、标签等)存储在关系型数据库中,图像的特征向量存储在Milvus中。

数据库设计

  1. 关系型数据库表结构(MySQL为例):
CREATE TABLE images (
    image_id INT AUTO_INCREMENT PRIMARY KEY,
    image_url VARCHAR(255) NOT NULL,
    description TEXT,
    tags VARCHAR(255)
);
  1. Milvus集合结构
from pymilvus import connections, Collection, CollectionSchema, FieldSchema, DataType

# 连接到Milvus服务器
connections.connect("default", host="localhost", port="19530")

# 定义Milvus集合的字段
fields = [
    FieldSchema(name="image_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=512)
]

# 创建Milvus集合
schema = CollectionSchema(fields, "image_embeddings")
collection = Collection("image_embeddings", schema)

数据同步

通过定期任务将MySQL中的图像数据同步到Milvus,并生成图像特征向量。

安装依赖包

pip install pymysql pymilvus numpy opencv-python

代码实现

import pymysql
import numpy as np
import cv2
from pymilvus import connections, Collection

# 连接到MySQL数据库
db = pymysql.connect(host="localhost", user="root", password="password", database="image_db")
cursor = db.cursor()

# 查询图像数据
cursor.execute("SELECT image_id, image_url FROM images")
rows = cursor.fetchall()

# 连接到Milvus服务器
connections.connect("default", host="localhost", port="19530")

# 加载Milvus集合
collection = Collection("image_embeddings")

# 图像特征提取函数
def extract_features(image_path):
    image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    sift = cv2.SIFT_create()
    keypoints, descriptors = sift.detectAndCompute(image, None)
    if descriptors is None:
        return np.zeros((1, 512), dtype=np.float32)
    return np.mean(descriptors, axis=0).astype(np.float32)

# 插入数据到Milvus
for row in rows:
    image_id, image_url = row
    embedding = extract_features(image_url)
    collection.insert([{
   "image_id": image_id, "embedding": embedding.tolist()}])

print("Data synchronized to Milvus successfully.")
流程图

标签:20,数据库,高维,Milvus,数据库系统,数据,image,向量
From: https://blog.csdn.net/wjm1991/article/details/139844768

相关文章

  • TMS320F28377D学习日志:day2点亮LED
    文章目录一、28377开发板的led电路分析二、28377的GPIO相关寄存器介绍2.1前言2.2GPySET寄存器介绍2.3GPyCLEAR寄存器介绍三、程序介绍3.1引入库3.2配置GPIO引脚功能3.2.1GPIO_SetupPinMux函数3.2.1GPIO_SetupPinOptions函数3.3系统初始化3.4循环程序参考文......
  • 都2024年了,现在互联网行情怎样?
    都2024年了,互联网行情是怎样的?很直白的说,依旧是差得很,怎么说?我刚在掘金上看到一个掘友写的文章,他是四月领了大礼包,据他的描述如下:互联网行情依旧是差得很,很多的招聘平台都是已读不回,当然还有很多奇葩的HR。加上AI大模型越来越多,甚至说阿里都要用AI来代替20%的人工工作,需要传......
  • 6.20-合并二叉树
    617.合并二叉树题意描述:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null......
  • buildroot-2020.05生成不了bluez相应工具的解决方法
    使用buildroot-2020.05编译生成bluez时,无法生成bluetoothctl、hciconfig等工具,发现其默认使用的bluez版本为5.54,而我们验证改为5.52版本时才能生成这些工具,故做了如下修改:1.bluez5_utils a.修改package/bluez5_utils/bluez5_utils.mk文件,将   BLUEZ5_UTILS_VERSION=......
  • 2024华为OD机试真题- 计算三叉搜索树的高度-(C++/Java/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述定义构造三叉搜索树规则如下:每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入。查找的规则是:1.如果数小于节点的数减去500,则将数插入节点的左子树2.如果数大于节点的......
  • 2023 Jiangsu Collegiate Programming Contest, National Invitational of CCPC (Huna
    题目思路来源乱搞ac题解枚举gcd,gcd一定是x的因子,由于lcm+gcd=x,有lcm/gcd+1=x/gcd,还有lcm/gcd>=1枚举lcm/gcd=y,显然如果gcd>1,让gcd和lcm同除以gcd即可,所以可以认为gcd=1,问题转化为,大小为k的集合,k个不同的数,满足gcd=1,且lcm=y的方案数,然后写了个大暴力容斥,没想到过了…......
  • NOI2019 Day1
    就准备这样面对你的NOI吗?问题:对拍,极限数据,构造数据。不要老觉得过了大洋里就可以万事大吉跑路了。自己觉得写不完的东西,一定不要上来就写。读题。读题。读题。实在改不了就每题都先写个暴力验证题意。学会放题。一个题实在想不明白就退而求其次。保持冷静。尽量一遍写对......
  • MGM320H5S LEC0101
    MGM320H5SLEC0101Financial Statement Analysis and InterpretationCourseOutline-Winter 2024CourseDescriptionThiscoursewillprovideanunderstandingof financialreports,andtheirusefor investment andmanagement decisions. Cases will be......
  • 2024年 Java 面试八股文(20w字)
    第一章-Java基础篇1、你是怎样理解OOP面向对象   难度系数:⭐面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征:继承:继承是从已有类得到继承信息创建新类的过程封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口多态性:多态性是指允......
  • Java面试八股文2024最新版
    一、java基础1、java有哪几种数据类型?基本数据类型:byte(1),char(2),short(2),int(4),long(8),double(8),float(4),boolean(1)引用数据类型:各种类和接口,枚举,数组2、 面向对象和面向过程的区别?面向对象和面向过程都是一种开发思想。面向过程就是根据解决问题所需要的步骤,具体化的一步一步的去实现......