이 페이지에서는 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 벡터 검색은 정확한 결과가 필요하거나 선택적 필터링을 추가하려는 경우 선호되는 검색 방법입니다. KNN 검색은 최근접 이웃을 찾기 위해 데이터 세트의 모든 임베딩으로 쿼리 벡터의 거리 계산을 실행합니다. Cloud SQL의 KNN 검색은 완벽한 재현율을 제공합니다. KNN 검색은 벡터 색인을 사용하지 않으므로 작은 데이터 세트로 작업할 때 적합한 옵션입니다.
KNN 검색을 실행하려면 두 개의 벡터(검색할 쿼리 벡터와 데이터 세트의 후보 벡터)를 입력으로 사용하는 vector_distance 함수를 사용합니다. 이 함수는 두 벡터 간의 거리를 계산합니다.
SELECT 문에서 vector_distance를 사용합니다. 자세한 내용은 K-최근접 이웃(KNN) 검색을 참고하세요.
KNN의 성능이 좋지 않다면 나중에 벡터 색인을 빌드하고 애플리케이션에서 ANN 검색에 approx_distance를 계속 사용할 수 있습니다.
ANN 검색
쿼리 효율성이 우려되는 경우 선호되는 검색 유형은 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 SQL 버전을 비교합니다.
| 지원 영역 | 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개 측정기준으로 제한됩니다. | 벡터 임베딩은 기본값이 2,048인 16,383개 측정기준으로 제한됩니다. |
| 벡터 스토리지 형식 |
VARBINARY 형식
|
커뮤니티 기반 스토리지 형식 |
| 벡터 데이터 유형을 선언하는 구문 |
VECTOR(VECTOR_DIMENSIONS)
|
VECTOR(VECTOR_DIMENSIONS)
|
| 변환 함수 차이점 | 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벡터 함수가 평가된 후에 평가됩니다.
다음 단계
- Cloud SQL에서 벡터 개요 읽어보기
- 벡터 임베딩 생성 방법 알아보기
- 벡터 색인 만들기 방법 알아보기
- 벡터 임베딩에서 검색을 수행하는 방법 알아보기