MySQL용 Cloud SQL의 벡터 검색

이 페이지에서는 MySQL용 Cloud SQL 인스턴스에서 벡터 검색이 구현되는 방식을 설명합니다. Cloud SQL을 사용하면 벡터 임베딩을 저장하고, 벡터 색인을 만들고, 저장된 다른 데이터와 함께 벡터 검색을 실행할 수 있습니다.

벡터 임베딩 스토리지

원자성, 일관성, 격리, 내구성(ACID) 속성을 준수하는 테이블에 벡터 임베딩을 저장합니다. 테이블의 다른 관계형 데이터와 마찬가지로 기존 트랜잭션 시맨틱스로 테이블의 벡터 임베딩에 액세스할 수 있습니다.

표 행과 벡터 표현 간의 매핑을 설정하려면 벡터 임베딩을 저장할 열을 표에 만들어야 합니다. 열은 VECTOR 데이터 유형을 사용해야 합니다. 벡터 임베딩 열에는 열을 정의할 때 지정한 것과 크기가 정확히 동일한 벡터 임베딩만 저장할 수 있습니다. 벡터 임베딩을 저장하는 테이블의 행 수에는 제한이 없습니다.

Cloud SQL 인스턴스에 충분한 스토리지와 메모리가 있으면 자체 벡터 임베딩 열이 있는 테이블을 여러 개 사용할 수 있습니다.

데이터 복제는 다른 MySQL InnoDB 열과 마찬가지로 벡터 임베딩에 대해 동일하게 작동합니다.

벡터 임베딩 테이블, 열, DML 문의 제한 및 제약사항 목록은 제한사항을 참고하세요.

벡터 색인

벡터 임베딩에서 ANN 유사성 검색을 수행하려면 벡터 색인을 사용해야 합니다. Cloud SQL은 확장 가능한 최근접 이웃(ScANN) 알고리즘을 사용하여 벡터 색인을 만듭니다.

벡터 색인의 요구사항은 다음과 같습니다.

  • 테이블당 하나의 벡터 색인만 만들 수 있습니다.
  • 인스턴스에 벡터 임베딩이 있는 테이블이 여러 개 있는 경우 각각에 대한 벡터 색인을 만들 수 있습니다.
  • 벡터 색인을 만드는 경우 색인화된 테이블의 기본 키에 제약 조건을 추가할 수 없습니다.

검색 품질을 높이려면 기본 테이블에 대부분의 데이터를 로드한 후에만 벡터 색인을 만드세요. 기본 테이블에 1, 000개 미만의 삽입이 있는 경우 색인 생성이 실패합니다.

벡터 색인을 만들지 여부를 결정할 때 행 수가 적은 경우 대신 KNN 검색을 수행할 수 있는지 고려하세요. KNN 검색과 ANN 검색 중 어떤 검색을 사용할지는 벡터 임베딩의 차원 수에 따라 달라집니다. 임베딩 수가 많을수록 벡터 색인이 필요할 수 있습니다.

벡터 색인의 제한 및 제약사항 목록은 제한사항을 참고하세요. 벡터 색인 생성에 관한 자세한 내용은 벡터 색인 생성 및 관리를 참고하세요.

벡터 색인 업데이트

Cloud SQL은 벡터 색인을 실시간으로 업데이트합니다. 기본 테이블에서 DML 작업을 수행하는 트랜잭션은 연관된 벡터 검색 색인에도 변경사항을 전파합니다. 벡터 색인은 테이블의 다른 보조 색인과 동일한 방식으로 작동합니다. 벡터 색인은 트랜잭션 일관성이 완전히 보장되고 ACID를 준수합니다. 트랜잭션을 롤백하면 해당 롤백 변경사항이 벡터 색인에도 표시됩니다.

벡터 색인 복제

Cloud SQL은 연쇄 복제본을 비롯한 모든 읽기 복제본에 벡터 색인을 복제합니다. 벡터 임베딩이 있는 기본 인스턴스에서 새 읽기 복제본을 만들면 읽기 복제본이 기본 인스턴스에서 벡터 임베딩 설정을 상속합니다. 기존 읽기 복제본의 경우 각각에 벡터 임베딩 지원을 사용 설정해야 합니다.

복제 지연 영향 측면에서 벡터 색인을 만들고 유지보수하는 방법은 일반 MySQL 색인과 동일한 방식으로 수행됩니다.

지속성, 종료, 유지보수 영향

벡터 색인은 기본 테이블과 동일한 방식으로 유지되며 완전한 ACID를 지원합니다. 벡터 색인은 항상 기본 테이블 데이터와 동기화되며 가시성, 격리, 비정상 종료 안전성이 동일합니다. 인스턴스가 종료되거나 유지보수를 받는 경우 벡터 색인에는 영향을 미치지 않습니다.

색인 유지보수

기본 테이블에서 광범위한 DML 작업을 수행한 후 색인 생성 시 초기 데이터로 학습한 벡터 색인이 새 상태를 반영하지 않을 수 있습니다. 이로 인해 검색 품질에 영향을 미칠 수 있습니다.

이 색인은 두 부분으로 이루어집니다.

  • 색인 트리입니다. 이는 기존 데이터를 학습하여 빌드됩니다. 색인의 수명 주기 동안 변경되지 않습니다.
  • 색인이 사라집니다. 여기에는 모든 데이터 행이 포함됩니다. 색인 리프는 동기화되지 않습니다.

행이 한 리프에서 다른 리프로 이동하므로 많은 수의 DML 문을 실행한 후에는 색인 트리가 덜 효율적이 될 수 있습니다. 색인 트리를 새로고침하려면 색인을 다시 빌드해야 합니다.

벡터 색인이 있는 테이블에서 지원되지 않는 DDL 작업

벡터 색인이 있는 테이블에서는 다음 데이터 정의 언어 (DDL) 작업이 지원되지 않습니다.

  • 복사 알고리즘이 필요한 테이블 변경 작업
  • 테이블을 다시 빌드해야 하는 테이블 변경 작업
  • 기본 키 삭제 또는 변경
  • 테이블을 일반 테이블스페이스로 이동

벡터 검색

Cloud SQL은 인스턴스에서 근사 최근접 이웃(ANN) 및 K-최근접 이웃(KNN) 벡터 유사성 검색을 실행하는 데 사용하는 벡터 거리 함수를 제공합니다. 쿼리를 실행하면 쿼리 벡터가 데이터 세트의 벡터와 비교됩니다. 거리 함수는 코사인과 같은 유사성 측정항목을 사용하여 벡터 간 거리를 계산합니다. 벡터 간 거리가 가장 짧은 벡터가 가장 유사하며 검색 결과에 반환됩니다.

Cloud SQL은 사용자가 ANN 및 KNN 벡터 검색을 실행할 때 다음 함수를 사용하여 벡터 검색의 벡터 간 거리를 측정합니다.

  • 코사인: 두 벡터 간의 각도 코사인을 측정합니다. 값이 작을수록 벡터 간의 유사성이 높습니다.
  • 내적: 각도에 해당 벡터 크기의 곱을 곱하여 코사인을 계산합니다.
  • L2 제곱 거리: 각 측정기준의 제곱 거리를 더하여 두 벡터 간의 유클리드 거리를 측정합니다.

정확한 결과가 필요하거나 선택적 필터링을 추가하려는 경우 KNN 벡터 검색이 선호되는 검색 방법입니다. KNN 검색은 데이터 세트의 모든 임베딩과 쿼리 벡터의 거리 계산을 실행하여 최근접 이웃을 찾습니다. Cloud SQL의 KNN 검색은 정확한 검색을 제공합니다. KNN 검색은 벡터 색인을 사용하지 않으므로 작은 데이터 세트로 작업할 때 적합한 옵션입니다.

KNN 검색을 실행하려면 두 개의 벡터(검색할 쿼리 벡터와 데이터 세트의 후보 벡터)를 입력으로 사용하는 vector_distance 함수를 사용합니다. 이 두 벡터 사이의 거리를 계산합니다. SELECT 문에서 vector_distance를 사용합니다. 자세한 내용은 K-최근접 이웃(KNN) 검색을 참고하세요.

KNN의 성능이 좋지 않다면 나중에 벡터 색인을 빌드하고 애플리케이션에서 ANN 검색에 approx_distance를 계속 사용할 수 있습니다.

쿼리 효율성이 우려되는 경우 선호되는 검색 유형은 ANN 벡터 검색입니다. ANN 검색은 쿼리 벡터와 데이터 세트의 일부 벡터 간의 거리만 계산하여 유사성 검색 속도를 높입니다. 이를 위해 Cloud SQL은 데이터를 클러스터 또는 파티션으로 정리한 다음 쿼리에 가장 가까운 클러스터에 검색을 집중합니다. ANN 검색에는 벡터 색인이 필요합니다. 이러한 색인은 완전한 재현율보다 검색 속도를 우선시합니다. Cloud SQL에서 TREE_SQ 색인 유형은 ANN 검색에 사용됩니다.

ANN 검색을 수행하려면 거리 측정 옵션과 함께 approx_distance 함수를 사용합니다. ORDER BY 또는 SELECT 목록에서 approx_distance를 사용하며 LIMIT 절을 사용하여 검색 결과를 제한할 수 있습니다. WHERE 절을 추가하여 검색 결과를 사후 필터링할 수도 있습니다. 필터를 사용하여 ANN 검색을 실행할 때 반환되는 결과 수를 더 세부적으로 관리하려면 반복 필터링을 사용하면 됩니다. 반복적 필터링을 사용하면 원하는 수의 이웃이 발견될 때까지 벡터 색인을 더 많이 스캔하여 검색 쿼리가 더 많은 검색 결과를 반환할 수 있습니다.

개별 클라이언트의 세션 수준 또는 인스턴스에 연결된 모든 클라이언트의 전역 수준에서 cloudsql_vector_iterative_filtering 플래그를 ON로 설정하여 검색 쿼리에 대해 반복 필터링을 사용 설정할 수 있습니다.

자세한 내용은 근사 최근접 이웃 (ANN) 검색을 참고하세요.

ANN 검색이 KNN 검색으로 대체되는 경우가 있습니다. 자세한 내용은 ANN 검색의 대체 상태 확인을 참고하세요.

MySQL용 Cloud SQL 버전의 벡터 지원 차이점

MySQL용 Cloud SQL은 버전 8.0.36 이상에서 벡터 검색 지원을 도입했습니다. MySQL용 Cloud SQL 버전 9.7부터 Cloud SQL은 커뮤니티에서 개발한 MySQL 9.0에 도입된 커뮤니티 개발 벡터 지원 및 스토리지 기능과 더 잘 통합되도록 특정 벡터 검색 기능을 수정했습니다.

다음 표에서는 MySQL용 Cloud SQL 버전을 비교하고 버전 차이가 MySQL용 Cloud에서 벡터 검색 사용에 미치는 영향을 보여줍니다.

지원 영역 MySQL용 Cloud SQL 8.4 이하 MySQL용 Cloud SQL 9.7 이상
벡터 사용 설정 MySQL 데이터베이스에 벡터 임베딩을 추가하고 벡터 검색을 사용하려면 Cloud SQL 인스턴스에 대해 cloudsql_vector 플래그를 on로 설정해야 합니다. 벡터 색인을 만들고 ANN 검색을 실행하려면 cloudsql_vector 플래그를 on로 설정해야 합니다.
표의 벡터 임베딩 열 테이블에는 벡터 임베딩 열이 하나만 있을 수 있습니다. 테이블에 색인을 만드는 경우 테이블당 하나의 벡터 임베딩 열로 제한됩니다. 테이블에 색인을 만들지 않으면 테이블에 벡터 임베딩 열이 여러 개 있을 수 있습니다.
COMMENT 및 CONSTRAINT를 사용하여 벡터 임베딩 열 식별 벡터 임베딩 열을 다른 열과 구분하기 위해 Cloud SQL은 열에 특별한 COMMENT 주석과 CONSTRAINT 규칙을 추가합니다. 이 제약 조건은 입력 검증에 필요하며 벡터 임베딩 열 주석은 주석으로 표시됩니다. 주석 또는 제약조건은 수정하거나 삭제할 수 없습니다. COMMENT 주석과 CONSTRAINT 규칙은 더 이상 MySQL용 Cloud SQL 9.7에서 벡터 임베딩 열을 식별하는 데 사용되지 않습니다.
측정기준 한도 벡터 임베딩은 기본값 없이 16,000개 측정기준으로 제한됩니다. 벡터 임베딩은 16,383개 측정기준으로 제한되며 기본값은 2,048입니다.
벡터 스토리지 형식 VARBINARY 형식 커뮤니티 기반 스토리지 형식
벡터 데이터 유형을 선언하는 문법 VECTOR(VECTOR_DIMENSIONS)
USING VARBINARY
VECTOR(VECTOR_DIMENSIONS)
[USING VARBINARY]
변환 함수 차이점 vector_to_string 함수의 출력은 전체 값으로 출력됩니다. vector_to_string 함수의 출력은 커뮤니티 표준인 과학적 표기법으로 렌더링됩니다.

제한사항

다음은 벡터를 지원하는 모든 버전의 Cloud SQL에 적용되는 제한사항입니다.

  • 벡터 색인은 테이블당 하나만 있을 수 있습니다.
  • 벡터 임베딩 열은 생성된 열일 수 없습니다.
  • 벡터 임베딩 열이 있는 테이블에서는 테이블 수준 파티셔닝이 지원되지 않습니다.
  • BIT, BINARY, VARBINARY, JSON, BLOB, TEXT 데이터 유형 또는 공간 데이터를 사용하는 기본 키는 벡터 색인에서 지원되지 않습니다. 또한, 복합 기본 키에는 이러한 유형이 포함될 수 없습니다.
  • 벡터 색인이 있으면 기본 테이블의 기본 키에 제약 조건을 추가할 수 없습니다.
  • 벡터 색인이 테이블에 있으면 수행할 수 없는 DDL 작업이 있습니다. 자세한 내용은 벡터 색인이 있는 테이블에서 지원되지 않는 DDL 작업을 참고하세요.

벡터 검색 쿼리에는 다음과 같은 제한사항이 적용됩니다.

  • approx_distance 함수는 ORDER BY 또는 SELECT 목록에서만 사용할 수 있습니다.
  • 기본 테이블과 관련된 조건자는 ORDER BY 또는 SELECT 목록에서 approx_distance 표현식과 함께 WHERE 조건에서 사용할 수 있습니다. WHERE 조건 조건자는 approx_distance 벡터 함수가 평가된 후에 평가됩니다.

다음 단계