목차
다중 값 인덱스 소개
다중 값 인덱스 생성
JSON 개체 필드 인덱스
JSON 배열 객체 인덱스
결합된 인덱스에 다중 값 인덱스 생성
다중 값 인덱스의 제한 사항
응용 시나리오
데이터 베이스 MySQL 튜토리얼 MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

Jun 01, 2023 pm 10:25 PM
mysql json

    다중 값 인덱스 소개

    MySQL 8.0.17부터 InnoDB는 JSON 값 배열을 저장하는 열에 정의된 보조 인덱스인 다중 값 인덱스(다중 값 인덱스) 생성을 지원합니다. 단일 데이터 레코드에 대해 여러 개의 인덱스 레코드가 있을 수 있습니다. 이 유형의 인덱스에 대한 특정 구문 정의:

    CAST(expression AS type ARRAY), 예: CAST(data->'$.zipcode' AS UNSIGNED ARRAY). 일반 인덱스와 마찬가지로 EXPLAIN에서도 볼 수 있습니다.

    다중 값 인덱스 생성

    다른 인덱스와 마찬가지로 다중 값 인덱스는 테이블 생성 시 추가하거나 ALTER TABLE 또는 CREATE INDEX를 통해 생성할 수 있습니다.

    JSON 개체 필드 인덱스

    Syntax

    ALTER TABLE customers ADD INDEX idx_mv_custinfo_list( ( CAST( custinfo -> '$.key' AS UNSIGNED array ) ) );
    로그인 후 복사

    참고: 여기 CAST 구문 외부에는 두 개의 단일 대괄호 레이어가 있습니다! , 하나 적으면 오류가 보고됩니다!

    테스트 사례

    PS: 기사의 사례는 공식 문서에 있는 사례를 참조하고 테스트용이므로 명명 및 기타 측면에서 그다지 표준화되지 않았으므로 실제 개발 과정에서는 엄격하게 준수해야 합니다. 회사 팀의 개발 사양에 따라 게으르지 마십시오!

    DROP TABLE IF EXISTS `customers`;
    /*建表语句*/
    CREATE TABLE customers ( 
    	id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    	modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    	custinfo JSON NOT NULL 
    );
    /*插入写测试数据*/
    INSERT INTO customers
    VALUES
    	( NULL, NOW(), '{"key":94582,"value":"asdf"}' ),
    	( NULL, NOW(), '{"key":94568,"value":"gjgasdasdf"}' ),
    	( NULL, NOW(), '{"key":94477,"value":"ghasdfsdf"}' ),
    	( NULL, NOW(), '{"key":94536,"value":"hagsdfgdf"}' ),
    	( NULL, NOW(), '{"key":94507,"value":"wasfgjdf"}' );
    /*添加多值索引*/
    ALTER TABLE customers ADD INDEX idx_mv_custinfo_list( ( CAST( custinfo -> '$.key' AS UNSIGNED array)) );
    /*测试 MEMBER OF 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	94507 MEMBER OF ( custinfo -> '$.key' );
    /*测试 JSON_CONTAINS 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	JSON_CONTAINS(
    		custinfo -> '$.key',
    	CAST( '[94582]' AS JSON ));
    /*测试 JSON_OVERLAPS 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	JSON_OVERLAPS (
    		custinfo -> '$.key',
    	CAST( '[94477]' AS JSON ));
    로그인 후 복사

    실행 계획을 보고 인덱스를 사용할 수 있는지 확인하세요.

    MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

    문자 유형에 대한 다중 값 인덱스를 생성해야 하는 경우 utf8mb4 문자 집합이어야 하며 정렬 규칙은 utf8mb4_0900_as_cs입니다. 그렇지 않으면 오류가 보고됩니다. 이 버전은 다음을 지원하지 않습니다.

    이진 이진 문자열에 대한 다중 값 인덱스를 생성하려는 경우 정렬 규칙은 이진이어야 합니다. 그렇지 않으면 오류가 보고되고 그렇지 않습니다. 지원됩니다.

    MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

    정렬 규칙을 수정한 후 인덱스를 성공적으로 추가할 수 있습니다.

    MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

    JSON 배열 객체 인덱스

    Syntax

    ALTER TABLE customers ADD INDEX idx_mv_custinfo_list( ( CAST( custinfo -> '$[*].key' AS UNSIGNED array ) ) );
    로그인 후 복사

    참고: 여기 CAST 구문 외부에는 두 개의 단일 괄호 레이어가 있습니다! 하나라도 적게 쓰면 오류가 보고됩니다!

    테스트 케이스

    DROP TABLE IF EXISTS `customers`;
    /*建表语句*/
    CREATE TABLE customers ( 
    	id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    	modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    	custinfo JSON NOT NULL 
    );
    /*插入写测试数据*/
    INSERT INTO customers
    VALUES
    	( NULL, NOW(), '[{"key":94582},{"key":94536}]'),
    	( NULL, NOW(), '[{"key":94568},{"key":94507},{"key":94582}]'),
    	( NULL, NOW(), '[{"key":94477},{"key":94507}]'),
    	( NULL, NOW(), '[{"key":94536}]'),
    	( NULL, NOW(), '[{"key":94507},{"key":94582}]');
    /*添加多值索引*/
    ALTER TABLE customers ADD INDEX idx_mv_custinfo_list( ( CAST( custinfo -> '$[*].key' AS UNSIGNED array)) );
    /*测试 MEMBER OF 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	94507 MEMBER OF ( custinfo -> '$[*].key' );
    /*测试 JSON_CONTAINS 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	JSON_CONTAINS(
    		custinfo -> '$[*].key',
    	CAST( '[94582, 94507]' AS JSON ));
    /*测试 JSON_OVERLAPS 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	JSON_OVERLAPS (
    		custinfo -> '$[*].key',
    	CAST( '[94477, 94582]' AS JSON ));
    로그인 후 복사

    실행 계획을 보고 인덱스를 사용할 수 있는지 확인합니다.

    MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

    결합된 인덱스에 다중 값 인덱스 생성

    Syntax

    구문은 일반 구문과 유사합니다. 결합된 인덱스이며 가장 왼쪽 일치 원칙도 따릅니다.

    ALTER TABLE customers ADD INDEX idx_age_custinfo$list_modified
    ( age, (CAST( custinfo -> '$[*].key' AS UNSIGNED ARRAY )), modified );
    로그인 후 복사

    참고: 여기에서는 CAST 구문 외부에 괄호를 사용해야 합니다!

    테스트 케이스

    DROP TABLE IF EXISTS `customers`;
    /*建表语句*/
    CREATE TABLE customers ( 
    	id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    	age tinyint(4) not null,
    	modified DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    	custinfo JSON NOT NULL 
    );
    /*插入写测试数据*/
    INSERT INTO customers
    VALUES
    	( NULL, 21, NOW(), '[{"key":94582},{"key":94536}]'),
    	( NULL, 22, NOW(), '[{"key":94568},{"key":94507},{"key":94582}]'),
    	( NULL, 23, NOW(), '[{"key":94477},{"key":94507}]'),
    	( NULL, 24, NOW(), '[{"key":94536}]'),
    	( NULL, 25, NOW(), '[{"key":94507},{"key":94582}]');
    /*添加多值索引*/
    alter table customers DROP INDEX idx_age_custinfo$list_modified ;
    ALTER TABLE customers ADD INDEX idx_age_custinfo$list_modified ( age, (CAST( custinfo -> '$[*].key' AS UNSIGNED ARRAY )),modified );
    ALTER TABLE customers ADD INDEX idx_age_custinfo$list_modified ((CAST( custinfo -> '$[*].key' AS UNSIGNED ARRAY )), age,modified  );
    ALTER TABLE customers ADD INDEX idx_age_custinfo$list_modified ( age,modified, (CAST( custinfo -> '$[*].key' AS UNSIGNED ARRAY )) );
    /*测试 MEMBER OF 语法*/
    SELECT
    	* 
    FROM
    	customers 
    WHERE
    	94536 MEMBER OF ( custinfo -> '$[*].key' ) and modified = '2021-08-05 10:36:34' and age = 21;
    로그인 후 복사

    실행 계획을 보고 인덱스를 사용할 수 있는지 확인하세요.

    MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법

    다중 값 인덱스의 제한 사항

    • 다중 값 인덱스는 값만 포함할 수 있습니다. of one attribute

    • 인덱스는 현재 세 가지 구문만 지원합니다.

    현재 다중 값 인덱스에는 MEMBER OF, JSON_CONTAINS() 및 JSON_OVERLAB()만 사용할 수 있습니다.

    • 인덱스 값을 배열로 변환해야 합니다

    (CAST( custinfo -> '$.key' AS UNSIGNED array)). 구문에서 배열을 생략할 수 있습니다. 필수사항은 추가하지 않으면 배열 구조가 아니기 때문입니다. 배열 구조가 아니면 위의 세 가지 구문을 직접 사용할 수 없기 때문에 사전에 JSON_ARRAY() 및 기타 방법을 통해 변환해야 합니다. 사용할 수 있습니다. 그러면 인덱스가 실패하게 됩니다! 따라서 인덱싱할 필드가 단일 값 필드인지 배열 필드인지에 관계없이 array 키워드를 추가해야 합니다.

    • 이 인덱스는 테이블 연관을 지원하지 않습니다.

    • 접두사 인덱스와 결합할 수 없습니다.

    • 다중 값 인덱스의 온라인 생성을 지원하지 않습니다.

    이 문장은 다음을 의미합니다. 작업에서 ALGORITHM=COPY를 사용한다는 것은 새 테이블 구조를 생성한 다음 거기에 데이터를 복사하여 인덱스를 생성하는 것을 의미합니다. 따라서 이 프로세스 중에는 DML 작업이 허용되지 않습니다.

    • 다중 값 인덱스에는 문자 집합 유형 필드에 대한 명확한 요구 사항이 있습니다.

    이진 문자 집합의 데이터 정렬은 이진이어야 합니다.

    utf8mb4 문자 집합의 데이터 정렬은 utf8mb4_0900_as_cs여야 합니다.

    다른 문자 집합 또는 정렬 어떤 규칙도 다중 값 인덱스를 생성할 수 없으며, 생성 시 오류가 보고됩니다. 현재 버전에서는 이를 지원하지 않습니다.

    응용 시나리오

    다중값 인덱스의 응용 시나리오는 매우 광범위합니다! 그와 함께라면 더 이상 많은 관계 테이블을 사용할 수 없습니다! 간단한 예를 들어 보겠습니다. 사용자 태그 많은 시나리오에서 사용자에게는 키 1, 부자 2, 잘생긴 3과 같은 다양한 태그가 제공됩니다. 후속 통계 또는 쿼리 필터링을 보다 효율적으로 만들기 위해 이 태그를 직접 사용할 수는 없습니다. 필드. 인덱스가 없으면 쿼리 효율성이 높지 않기 때문에 사용자-태그 관계를 저장하기 위해 연관 테이블을 사용하는 경우가 많습니다. 하지만 이제 다중 값 인덱스를 사용하면 태그를 필드로 저장할 수 있습니다!

    이것은 작은 장면 중 하나일 뿐입니다. 사용자는 이를 무엇이든 변경할 수 있으며, 레이블은 속성 값이 여러 개 있는 한 다른 속성으로 변경할 수도 있습니다. 다대다 관계에서 이 속성을 다른 테이블과 연결할 필요가 없는 경우 다중 값 인덱스를 사용할 수 있습니다! 다중 값 인덱스는 테이블 연결을 지원하지 않으므로 테이블 연결에 이 필드를 사용해야 하는 경우에는 적합하지 않습니다.

    위 내용은 MySQL에서 JSON 필드에 대한 인덱스를 생성하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    Video Face Swap

    Video Face Swap

    완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

    인기 기사

    <gum> : Bubble Gum Simulator Infinity- 로얄 키를 얻고 사용하는 방법
    4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    Nordhold : Fusion System, 설명
    4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora : 마녀 트리의 속삭임 - Grappling Hook 잠금 해제 방법
    3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    메모장++7.3.1

    메모장++7.3.1

    사용하기 쉬운 무료 코드 편집기

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    스튜디오 13.0.1 보내기

    스튜디오 13.0.1 보내기

    강력한 PHP 통합 개발 환경

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SublimeText3 Mac 버전

    SublimeText3 Mac 버전

    신 수준의 코드 편집 소프트웨어(SublimeText3)

    LARAVEL 소개 예 LARAVEL 소개 예 Apr 18, 2025 pm 12:45 PM

    Laravel은 웹 응용 프로그램을 쉽게 구축하기위한 PHP 프레임 워크입니다. 설치 : Composer를 사용하여 전 세계적으로 Laravel CLI를 설치하고 프로젝트 디렉토리에서 응용 프로그램을 작성하는 등 다양한 기능을 제공합니다. 라우팅 : Routes/Web.php에서 URL과 핸들러 간의 관계를 정의하십시오. 보기 : 리소스/뷰에서보기를 작성하여 응용 프로그램의 인터페이스를 렌더링합니다. 데이터베이스 통합 : MySQL과 같은 데이터베이스와 상자 외 통합을 제공하고 마이그레이션을 사용하여 테이블을 작성하고 수정합니다. 모델 및 컨트롤러 : 모델은 데이터베이스 엔티티를 나타내고 컨트롤러는 HTTP 요청을 처리합니다.

    MySQL 및 Phpmyadmin : 핵심 기능 및 기능 MySQL 및 Phpmyadmin : 핵심 기능 및 기능 Apr 22, 2025 am 12:12 AM

    MySQL 및 Phpmyadmin은 강력한 데이터베이스 관리 도구입니다. 1) MySQL은 데이터베이스 및 테이블을 작성하고 DML 및 SQL 쿼리를 실행하는 데 사용됩니다. 2) PHPMYADMIN은 데이터베이스 관리, 테이블 구조 관리, 데이터 운영 및 사용자 권한 관리에 직관적 인 인터페이스를 제공합니다.

    MySQL 대 기타 프로그래밍 언어 : 비교 MySQL 대 기타 프로그래밍 언어 : 비교 Apr 19, 2025 am 12:22 AM

    다른 프로그래밍 언어와 비교할 때 MySQL은 주로 데이터를 저장하고 관리하는 데 사용되는 반면 Python, Java 및 C와 같은 다른 언어는 논리적 처리 및 응용 프로그램 개발에 사용됩니다. MySQL은 데이터 관리 요구에 적합한 고성능, 확장 성 및 크로스 플랫폼 지원으로 유명하며 다른 언어는 데이터 분석, 엔터프라이즈 애플리케이션 및 시스템 프로그래밍과 같은 해당 분야에서 이점이 있습니다.

    Laravel 프레임 워크 설치 방법 Laravel 프레임 워크 설치 방법 Apr 18, 2025 pm 12:54 PM

    기사 요약 :이 기사는 Laravel 프레임 워크를 쉽게 설치하는 방법에 대한 독자들을 안내하기위한 자세한 단계별 지침을 제공합니다. Laravel은 웹 애플리케이션의 개발 프로세스를 가속화하는 강력한 PHP 프레임 워크입니다. 이 자습서는 시스템 요구 사항에서 데이터베이스 구성 및 라우팅 설정에 이르기까지 설치 프로세스를 다룹니다. 이러한 단계를 수행함으로써 독자들은 라벨 프로젝트를위한 탄탄한 토대를 빠르고 효율적으로 놓을 수 있습니다.

    MySQL에서 외국 키의 목적을 설명하십시오. MySQL에서 외국 키의 목적을 설명하십시오. Apr 25, 2025 am 12:17 AM

    MySQL에서 외국 키의 기능은 테이블 간의 관계를 설정하고 데이터의 일관성과 무결성을 보장하는 것입니다. 외국 키는 참조 무결성 검사 및 계단식 작업을 통해 데이터의 효과를 유지합니다. 성능 최적화에주의를 기울이고 사용할 때 일반적인 오류를 피하십시오.

    MySQL 및 Mariadb를 비교하고 대조하십시오. MySQL 및 Mariadb를 비교하고 대조하십시오. Apr 26, 2025 am 12:08 AM

    MySQL과 Mariadb의 주요 차이점은 성능, 기능 및 라이센스입니다. 1. MySQL은 Oracle에 의해 개발되었으며 Mariadb는 포크입니다. 2. MariaDB는 높은 하중 환경에서 더 나은 성능을 발휘할 수 있습니다. 3. Mariadb는 더 많은 스토리지 엔진과 기능을 제공합니다. 4.MySQL은 듀얼 라이센스를 채택하고 MariaDB는 완전히 오픈 소스입니다. 선택할 때 기존 인프라, 성능 요구 사항, 기능 요구 사항 및 라이센스 비용을 고려해야합니다.

    SQL vs. MySQL : 둘 사이의 관계를 명확히합니다 SQL vs. MySQL : 둘 사이의 관계를 명확히합니다 Apr 24, 2025 am 12:02 AM

    SQL은 관계형 데이터베이스를 관리하는 표준 언어이며 MySQL은 SQL을 사용하는 데이터베이스 관리 시스템입니다. SQL은 CRUD 작업을 포함한 데이터베이스와 상호 작용하는 방법을 정의하는 반면 MySQL은 SQL 표준을 구현하고 저장 프로 시저 및 트리거와 같은 추가 기능을 제공합니다.

    MySQL : 데이터베이스, phpmyadmin : 관리 인터페이스 MySQL : 데이터베이스, phpmyadmin : 관리 인터페이스 Apr 29, 2025 am 12:44 AM

    MySQL 및 Phpmyadmin은 다음 단계를 통해 효과적으로 관리 할 수 ​​있습니다. 1. 데이터베이스 작성 및 삭제 : Phpmyadmin을 클릭하여 완료하십시오. 2. 테이블 관리 : 테이블을 만들고 구조를 수정하고 인덱스를 추가 할 수 있습니다. 3. 데이터 작동 : 삽입, 업데이트, 데이터 삭제 및 SQL 쿼리 실행을 지원합니다. 4. 가져 오기 및 내보내기 데이터 : SQL, CSV, XML 및 기타 형식을 지원합니다. 5. 최적화 및 모니터링 : 최적화 가능한 명령을 사용하여 테이블을 최적화하고 쿼리 분석기 및 모니터링 도구를 사용하여 성능 문제를 해결하십시오.

    See all articles