MyScale vs. Zilliz

本文是 MyScale 向量数据库对比系列的第二篇。在上一篇文章中,我们对 MyScale 和 Pinecone 进行了全面比较,这次将深入对比 MyScale 和 Zilliz。
在上一篇文章中,我们对向量数据库的关键概念和 MyScale 进行了介绍,在此不会赘述太多。接下来我们先介绍一下 Zilliz。

01 什么是 Zilliz

Zilliz 是一款构建于开源 Milvus 项目之上的强大云原生向量数据库,专为高性能相似度搜索和机器学习应用而设计。区别于用户自托管 Milvus,Zilliz 提供全托管云服务,并提供免费版和按需付费两种模式,尤其适合需要弹性扩展向量存储,且希望免除基础设施管理负担的用户。

在本博客中,我们将对 MyScale 和 Zilliz 的云服务进行全方位比较,帮助您选择更适合自身需求的向量数据库。首先,我们来比较一下两者的托管服务。

02 托管方式对比

数据库的托管方式是选择解决方案时需要考虑的关键因素,因为它直接影响到数据库的性能、可扩展性和运维管理。强大的托管选项能够确保数据库轻松应对不同的负载、保持高可用性并简化维护工作。

MyScale 和 Zilliz 都提供了灵活的托管方式,包括开源版本、云托管服务和本地部署方案。云托管服务提供免费版和付费版,我们稍后将详细介绍。

对于本地部署,Docker 镜像是一种常见的选择,它可以简化部署流程并提供环境一致性。例如,启动 MyScale Docker 镜像的方式如下:

docker run --name MyScale --net=host myscale/MyScale:1.6

对于 Zilliz,我们可以使用 Docker compose 如下:

curl <https://github.com/milvus-io/milvus/releases/download/v2.0.2/milvus-standalone-docker-compose.yml> -o docker-compose.yml
docker-compose up -d

03 核心功能对比

在这一部分,我们将深入比较 MyScale 和 Zilliz 两款数据库的核心功能,包括查询语言、API 支持、元数据支持以及支持的数据类型。

查询语言和 API 支持

Zilliz 和 MyScale 都为 Python、Node.js 和 Go 等多种编程语言提供了客户端 SDK。此外,Zilliz 还支持 C++、.NET(部分支持)、RESTful API 和 Ruby。

然而,MyScale 最大的优势在于其对 SQL 的全面支持。您可以使用熟悉的 SQL 查询语言与 MyScale 交互,无论是操作向量数据、传统结构化数据,还是两者混合的数据,都能获得无缝衔接的体验。

元数据支持

Zilliz 支持在元数据过滤中使用正则表达式,并在最新版本中引入了基于 Milvus 2.4 的标量反向索引功能。

MyScale 则通过与 ClickHouse 深度集成来实现强大的元数据过滤能力。ClickHouse 是一款以高性能著称的列式数据库,其强大的索引和并行处理能力为 MyScale 的元数据过滤提供了坚实的基础。这使得 MyScale 能够在处理海量数据集时依然保持高效的过滤性能。此外,MyScale 还采用了预过滤策略,在进行向量搜索之前先对数据集进行初步筛选,进一步提升了搜索性能和准确性。

数据类型支持

MyScale 和 Zilliz 都支持存储和查询向量数据。Zilliz 的最新版本还增加了对稀疏向量和二进制向量的支持。然而,MyScale 凭借其对 SQL 的全面支持,能够处理所有 SQL 数据类型,包括向量数据和其他结构化数据。

例如,以下示例展示了 MyScale 中包含向量数据(`body_vector`)和其他数据类型(在此示例中为`UInt64`和`String`)的表结构:

CREATE TABLE default.wiki_abstract_mini(
    `id` UInt64,
    `body` String,
    `title` String,
    `url` String,
    `body_vector` Array(Float32),
    CONSTRAINT check_length CHECK length(body_vector) = 1024
)
ENGINE = MergeTree
ORDER BY id
SETTINGS index_granularity = 128;

索引方式

MyScale 和 Zilliz 都支持多种向量索引算法,包括 HNSW、IVF(及其变体)以及 FLAT 等。Zilliz 提供了自动索引功能,可以根据数据特征和查询模式自动选择和调整索引策略,并利用动态缓存和动态量化等技术优化索引性能。

而 MyScale 除了支持 Zilliz 已有的索引算法,还引入了多尺度树图(MSTG)算法,这是一种结合了层次化树聚类和基于图搜索的创新算法。MSTG 在搜索速度和资源消耗方面都表现出色,超越了许多现有算法。

过滤向量搜索和全文搜索

MyScale 通过 MSTG 算法和位掩码索引技术优化了过滤向量搜索。位掩码技术可以高效地处理大规模数据集上的过滤条件,而 ClickHouse 的高性能索引和并行处理能力进一步增强了 MyScale 的过滤效率。此外,MyScale 还采用了预过滤策略,在进行向量搜索之前先对数据集进行筛选,确保只处理最相关的数据,从而显著提升了搜索性能和准确性。

Zilliz 同样利用位掩码索引技术来管理和应用大规模数据集上的过滤条件,从而高效地执行复杂的过滤操作。



得益于对 Tantivy 搜索引擎的支持,MyScale 和 Zilliz 都具备强大的全文搜索能力,这在向量数据库中并不常见。两种数据库都支持混合搜索,即将向量搜索和全文搜索结合起来,提供更精准的检索结果。MyScale 通过 `HybridSearch()` 函数简化了混合搜索的操作,用户可以轻松地组合全文搜索和向量搜索的结果。

多向量搜索

MyScale 和 Zilliz 都支持多向量搜索,允许用户使用多个向量进行查询。此外,Zilliz 还提供了分组搜索功能,可以将存储在多个向量中的实体在搜索结果中进行分组,从而获得更综合的结果。 

MyScale 则可以通过 SQL 中的 `GROUP BY` 子句实现类似的分组搜索功能,使用户能够高效地聚合和分组搜索结果,更方便地处理和分析大规模数据集。

地理搜索

地理搜索功能对于地图、GIS、物流配送等众多应用场景至关重要。MyScale 提供了一系列地理空间函数来支持地理搜索,例如计算地球上两点之间距离的函数:

greatCircleDistance(lon1Deg, lat1Deg, lon2Deg, lat2Deg)

而 Zilliz 目前暂不支持地理搜索功能。

LLM API 集成

MyScale 和 Zilliz 都支持与 OpenAI、LLamaIndex、LangChain 等主流 LLM API 集成,并支持 Cohere 模型和 DSPy 进行自动提示工程。以下是一个将 LangChain 与 MyScale 集成的代码示例:

from langchain_community.vectorstores import MyScale

docsearch = MyScale.from_documents(docs,embeddings)
output= docsearch.similarity_search("How LLMs operate?",3)

04 定价对比

价格和性能是选择向量数据库时需要考虑的两个关键因素。在上一节中,我们详细比较了 MyScale 和 Zilliz 的核心功能,本节将重点关注两者的价格。

免费版

Zilliz 的免费版支持创建两个 Collection,每个 Collection 最多可存储 50 万个 768 维向量。

MyScale 的一个免费 Pod 则提供高达 500 万个 768 维向量的存储空间,相当于 Zilliz 免费版的 10 倍,或者说 5 个 Zilliz Collection 的总容量。这使得 MyScale 对于需要管理更大数据集但预算有限的用户更具吸引力。

付费版

免费版适用于实验和测试,但对于生产环境,我们通常需要付费版提供的更高性能和更大容量。

Zilliz 和 MyScale 都提供了两种付费托管模式:

注意:Zilliz 的物理节点称为 CU,而 MyScale 的物理节点称为 Pod。
  • 容量优化:旨在最大化每个物理节点的存储容量。MyScale 的每个 Pod 提供 1000 万个向量的存储容量,而 Zilliz 的每个 CU 最多支持 500 万个向量
  • 性能优化:适用于对性能(低延迟、高 QPS)有较高要求的应用场景。MyScale 的每个 Pod 在性能优化模式下最多支持 500 万个向量,而 Zilliz 的每个 CU 最多支持 150 万个向量。

在了解这两种模式之前,我们还需要介绍下 Zilliz 的 Serverless 版本定价方式。

Zilliz 提供了 Serverless 部署选项,根据实际使用的计算资源(虚拟 CU)和存储容量收费。下表列出了 Zilliz 无服务器模式下,每月执行 100 万次读取和 100 万次写入操作,不同存储容量对应的费用:

向量容量每小时费用(美元)每月费用(美元)
100 万0.0964.8
500 万0.21151.2
1000 万0.31223.2
2000 万0.47338.4
4000 万0.74532.8
8000 万1.15828
注意: 以上价格仅供参考,实际费用可能因地区、用量和其他因素而有所差异。


Capacity-Optimized 版本

在 Capacity-Optimized 版本下,Zilliz 每个 CU 提供 500 万个向量的存储容量,而 MyScale 每个 Pod 提供 1000 万个向量。这意味着在相同存储容量下,MyScale 所需的物理节点数量更少,从而降低了成本。

下表比较了 Zilliz 和 MyScale 在容量优化模式下,不同存储容量对应的费用:

向量容量Zilliz (美元/小时)计算单元 (CUs)MyScale (美元/小时)Pods
1000 万0.27620.0941
2000 万0.5540.192
4000 万1.180.384
8000 万2.2160.768

可以看出,在容量优化模式下,MyScale 的每小时成本始终低于 Zilliz。

Performance-Optimized 版本

在性能优化模式下,MyScale 每个 Pod 提供 500 万个向量的存储容量,而 Zilliz 每个 CU 仅提供 150 万个向量。尽管 MyScale 的单节点容量更高,但 Zilliz 在计费时存在一些不合理之处。

例如,存储 1000 万个向量理论上需要 6.67 个 CU (1000 / 150 = 6.67),但 Zilliz 实际收取 8 个 CU 的费用。同样地,存储 2000 万个向量理论上需要 13.33 个 CU,但 Zilliz 收取了更高的费用。

向量容量Zilliz (美元/小时)CUs (实际)CUs (理论)MyScale (美元/小时)Pods
500 万0.5543.330.171
1000 万1.186.670.332
2000 万2.21613.330.674
4000 万3.842826.671.338
8000 万7.685653.332.6716

这种计费方式导致 Zilliz 在性能优化模式下的成本难以预测,并且可能高于 MyScale。

05 基准测试

为了公平比较 MyScale 和 Zilliz 的性能,我们选取了以下两种 Zilliz 配置进行基准测试:

  • 2024-容量优化:1 个计算单元 (CU)
  • 2024-性能优化:4 个计算单元 (CUs)

吞吐量

每秒查询数 (QPS) 是衡量向量数据库性能的重要指标。根据基准测试结果:

  • MyScale (MSTG) 在单个计算单元的 Zilliz 节点上表现优异,展现出更高的 QPS。这意味着在相同硬件资源下,MyScale(绿色) 能够处理更多查询请求。
  • 采用多个计算单元的 Zilliz (4 CUs) 在 QPS 方面优于 MyScale。这是因为 Zilliz(橙色)通过增加计算资源来提升性能。



平均查询延迟

除了吞吐量和精度,查询延迟也是评估向量数据库性能的重要指标。我们对比了 MyScale 和 Zilliz 在不同线程数下的平均查询延迟和 P95 延迟。

  • MyScale 在单个计算单元的 Zilliz 节点上表现出色,平均查询延迟更低。这意味着在相同硬件资源下,MyScale 能够更快地返回查询结果。
  • 随着线程数增加,MyScale 和 Zilliz 的平均查询延迟都呈上升趋势,但 MyScale 的延迟增幅更小,始终保持在较低水平。这表明 MyScale 在高并发场景下具有更好的性能稳定性。
  • 当线程数达到 16 个时,采用 4 个 CU 的 Zilliz 在平均查询延迟方面略优于 MyScale。这是因为 Zilliz 通过增加计算资源来提升性能。

P95延迟

P95 延迟是指 95% 的查询请求都能在该时间内得到响应,用于衡量系统的稳定性和可靠性。

  • 在 P95 延迟方面,MyScale 和 Zilliz 的表现趋势与平均查询延迟相似。
  • 当线程数较低时,MyScale 的 P95 延迟优于 Zilliz,尤其是在单个计算单元的配置下。这表明 MyScale 在处理大部分查询请求时,能够提供更稳定和可预测的响应时间。
  • 当线程数超过 8 个时,采用 4 个 CU 的 Zilliz 在 P95 延迟方面开始优于 MyScale。这再次说明了增加计算资源可以提升 Zilliz 的性能上限。

数据导入时间

数据导入时间是评估向量数据库效率的重要指标,它直接影响着系统的可用性和用户体验。

根据基准测试结果,MyScale 在数据导入速度方面明显优于 Zilliz。这意味着使用 MyScale 可以更快地将数据导入数据库,从而更快地开始查询和分析数据。

每月成本比较

成本是选择向量数据库时需要考虑的关键因素之一。我们对比了 MyScale 和 Zilliz 在不同配置下的月度成本。

  • 对于单个 CU 的配置,Zilliz 的月度成本与 MyScale 相当,但 MyScale 仍然更具成本效益。这是因为 MyScale 在相同硬件资源下提供了更高的性能和更快的导入速度。
  • 采用 4 个CU 的 Zilliz 比 MyScale 昂贵得多。虽然多 CU 的 Zilliz 可以提供更高的性能,但其成本也随之大幅增加。

结论:MyScale - 兼顾性能与成本效益的更优选择

Zilliz 和 MyScale 都是强大的向量数据库解决方案,但面向的用户群体和应用场景有所不同。Zilliz 功能丰富,但成本略高;而 MyScale 则在性能和成本效益之间取得了完美平衡,是更具吸引力的选择。

Zilliz 固然拥有多向量搜索、稀疏向量支持等前沿功能,但这些功能尚处于测试阶段,稳定性和可靠性仍待观察。此外,Zilliz 的定价较高,对于预算有限的用户来说可能难以承受。

MyScale 则在提供强大功能的同时,保持了极具竞争力的价格,在性价比方面表现出色。各项基准测试结果表明,MyScale 在高并发、大规模数据场景下,性能表现优异,而成本却远低于 Zilliz。

*MyScale Benchmark: MyScale Vector Database Benchmark

<think>我们正在讨论如何使用SQLAlchemy连接MyScale数据库MyScale是一个基于ClickHouse的云数据库服务,因此我们可以使用支持ClickHouse的SQLAlchemy方言。 目前,有一个名为`clickhouse-sqlalchemy`的库可以用于在SQLAlchemy中操作ClickHouse。由于MyScale兼容ClickHouse协议,我们可以使用这个库来连接。 步骤: 1. 安装必要的库:`clickhouse-sqlalchemy` 和 `sqlalchemy`。注意,我们可能需要指定版本以确保兼容性。 2. 创建连接字符串。MyScale提供了连接所需的信息(如用户名、密码、主机和端口),这些信息可以在MyScale控制台中找到。 3. 使用SQLAlchemy创建引擎并连接。 示例代码: ```python from sqlalchemy import create_engine # 连接字符串格式: 'clickhouse://<username>:<password>@<host>:<port>/<database>' # 请替换以下信息为你的MyScale集群的实际信息 username = 'your_username' password = 'your_password' host = 'your_host' # 例如:'xxx.myscale.com' port = 443 # MyScale通常使用HTTPS端口443 database = 'default' # 默认数据库,或者你创建的数据库 # 创建连接字符串 connection_str = f'clickhouse://{username}:{password}@{host}:{port}/{database}' # 创建引擎 engine = create_engine(connection_str) # 测试连接 try: with engine.connect() as connection: print("成功连接到MyScale数据库!") # 可以执行一个简单查询,例如: result = connection.execute("SELECT version()") for row in result: print(f"ClickHouse 版本: {row[0]}") except Exception as e: print(f"连接失败: {e}") ``` 注意事项: - 确保网络可以访问MyScale服务,可能需要设置安全组或防火墙规则。 - MyScale的密码是你在创建集群时设置的,如果忘记可以在控制台重置。 - 由于MyScale是基于ClickHouse的,所以大部分ClickHouse的SQL语法和特性都可以使用。 另外,`clickhouse-sqlalchemy`库有两种连接方式:HTTP和原生TCP。MyScale推荐使用HTTP(或HTTPS)连接,因为他们的服务通常通过HTTPS暴露。上面的示例使用的是HTTP连接(因为端口是443,且clickhouse驱动默认使用HTTP)。如果你使用原生TCP端口(如9000),则连接字符串需要指定`clickhouse+native`驱动,但MyScale通常不开放9000端口,所以建议使用HTTP/HTTPS。 因此,也可以显式指定使用HTTP: ```python # 使用HTTP连接 connection_str = f'clickhouse+http://{username}:{password}@{host}:{port}/{database}' ``` 但上面第一种方式(仅使用`clickhouse://`)在最新版本的驱动中也会默认使用HTTP。 如果遇到驱动问题,可以尝试安装以下版本: ``` pip install clickhouse-sqlalchemy==0.2.4 sqlalchemy==1.4.0 ``` 因为不同版本之间可能有兼容性问题。 参考:[^1] MyScale官方文档,[^2] clickhouse-sqlalchemy文档 相关问题: 1. 如何安装`clickhouse-sqlalchemy`? 2. MyScale数据库连接信息在哪里获取? 3. 使用SQLAlchemy连接MyScale时常见错误有哪些? 4. 如何通过SQLAlchemy ORM操作MyScale数据库?</think>### 使用 SQLAlchemy 连接 MyScale 数据库 MyScale 是基于 ClickHouse 的云数据库服务,需要通过 ClickHouse 的 SQLAlchemy 方言进行连接。以下是详细步骤: #### 1. **安装依赖库** ```bash pip install sqlalchemy clickhouse-sqlalchemy ``` #### 2. **创建连接引擎** ```python from sqlalchemy import create_engine # MyScale 连接参数(从控制台获取) host = "your_cluster_id.myscale.com" # 集群地址 port = 443 # HTTPS 端口 username = "your_username" # 控制台用户名 password = "your_password" # 控制台密码 database = "default" # 默认数据库 # 创建引擎(使用 HTTPS 协议) engine = create_engine( f"clickhouse+http://{username}:{password}@{host}:{port}/{database}" ) ``` #### 3. **执行 SQL 查询** ```python # 创建测试表 with engine.connect() as conn: conn.execute(""" CREATE TABLE IF NOT EXISTS test_table ( id Int32, data String ) ENGINE = MergeTree() ORDER BY id """) # 插入数据 conn.execute("INSERT INTO test_table VALUES (1, 'Hello'), (2, 'MyScale')") # 查询数据 result = conn.execute("SELECT * FROM test_table") for row in result: print(row) # 输出: (1, 'Hello'), (2, 'MyScale') ``` #### 4. **使用 ORM(可选)** ```python from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class TestTable(Base): __tablename__ = 'test_table' id = Column(Integer, primary_key=True) data = Column(String) # 查询示例 from sqlalchemy.orm import sessionmaker Session = sessionmaker(bind=engine) session = Session() results = session.query(TestTable).filter(TestTable.id > 1).all() for r in results: print(r.data) # 输出: MyScale ``` #### 关键注意事项: 1. **连接协议**:必须使用 HTTPS (`端口 443`) 2. **认证信息**:在 [MyScale 控制台](https://console.myscale.com) 获取 `host/username/password` 3. **表引擎**:需指定 ClickHouse 表引擎(如 `MergeTree`) 4. **连接池**:建议启用连接池提高性能: ```python engine = create_engine(..., pool_size=10, max_overflow=20) ``` > **重要提示**:MyScale 不完全兼容标准 SQLAlchemy ORM,复杂操作建议使用原生 SQL [^1]。 --- ### 常见问题解决 1. **连接超时**: ```python engine = create_engine(..., connect_args={"http_timeout": 10}) ``` 2. **SSL 证书错误**: ```python engine = create_engine(..., connect_args={"verify": False}) # 生产环境不推荐 ``` 3. **数据类型映射**:需使用 ClickHouse 特有类型(如 `Int32` 代替 `Integer`) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值