찾다
데이터 베이스MySQL 튜토리얼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으로 문의하시기 바랍니다. 삭제
    MySQL에서 뷰를 사용하는 한계는 무엇입니까?MySQL에서 뷰를 사용하는 한계는 무엇입니까?May 14, 2025 am 12:10 AM

    mysqlviewshavelimitations : 1) 그들은 upportallsqloperations, datamanipulation throughviewswithjoinsorbqueries를 제한하지 않습니다

    MySQL 데이터베이스 확보 : 사용자 추가 및 권한 부여MySQL 데이터베이스 확보 : 사용자 추가 및 권한 부여May 14, 2025 am 12:09 AM

    적절한 usermanagementInmysqliscrucialforenhancingsecurityandensuringfefficientDatabaseOperation.1) USECREATEUSERTOWDDUSERS,@'localHost'or@'%'.

    MySQL에서 사용할 수있는 트리거 수에 영향을 미치는 요인은 무엇입니까?MySQL에서 사용할 수있는 트리거 수에 영향을 미치는 요인은 무엇입니까?May 14, 2025 am 12:08 AM

    mysqldoes notimposeahardlimitontriggers, butpracticalfactorsdeteirefectiveuse : 1) ServerConfigurationimpactStriggerManagement; 2) 복잡한 트리거 스케일 스케일 사이드로드; 3) argertableSlowtriggerTriggerPerformance; 4) High ConconcercencyCancaUspriggerContention; 5) m

    MySQL : Blob을 저장하는 것이 안전합니까?MySQL : Blob을 저장하는 것이 안전합니까?May 14, 2025 am 12:07 AM

    예, It 'safetostoreBlobdatainmysql, butconsidertheStefactors : 1) StoragesPace : BlobScanconSumeSignificantspace, 잠재적으로 증가하는 CostsandSlownperformance

    MySQL : PHP 웹 인터페이스를 통해 사용자 추가MySQL : PHP 웹 인터페이스를 통해 사용자 추가May 14, 2025 am 12:04 AM

    PHP 웹 인터페이스를 통해 MySQL 사용자를 추가하면 MySQLI 확장 기능을 사용할 수 있습니다. 단계는 다음과 같습니다. 1. MySQL 데이터베이스에 연결하고 MySQLI 확장자를 사용하십시오. 2. 사용자를 생성하고 CreateUser 문을 사용하고 Password () 함수를 사용하여 암호를 암호화하십시오. 3. SQL 주입 방지 및 MySQLI_REAL_ESCAPE_STRING () 함수를 사용하여 사용자 입력을 처리하십시오. 4. 새 사용자에게 권한을 할당하고 보조금 명세서를 사용하십시오.

    MySQL : Blob 및 기타없는 SQL 스토리지, 차이점은 무엇입니까?MySQL : Blob 및 기타없는 SQL 스토리지, 차이점은 무엇입니까?May 13, 2025 am 12:14 AM

    mysql'sblobissuilableforstoringbinarydatawithinareldatabase, whilenosqloptionslikemongodb, redis, and cassandraofferflexible, scalablesolutionsforunstuctureddata.blobissimplerbutcanslowwownperformance를 사용하는 것들보업 betterscal randaysand

    MySQL 추가 사용자 : 구문, 옵션 및 보안 모범 사례MySQL 추가 사용자 : 구문, 옵션 및 보안 모범 사례May 13, 2025 am 12:12 AM

    TOADDAUSERINMYSQL, 사용 : CreateUser'UserName '@'host'IdentifiedBy'Password '; 여기서'showTodoitseciRely : 1) ChoosetheHostCareLyTocon trolaccess.2) setResourcelimitswithOptionslikemax_queries_per_hour.3) Usestrong, iriquepasswords.4) enforcessl/tlsconnectionswith

    MySQL : 문자열 데이터 유형을 피하는 방법 일반적인 실수?MySQL : 문자열 데이터 유형을 피하는 방법 일반적인 실수?May 13, 2025 am 12:09 AM

    toavoidcommonmistakeswithstringdatatypesinmysql, stroundStringTypenuances, chooseTherightType, andManageEncodingAndCollationSettingSefectively.1) usecharforfixed-lengthstrings, varcharvariable-length, andtext/blobforlargerdata.2) setcarcatter

    See all articles

    핫 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 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

    뜨거운 도구

    에디트플러스 중국어 크랙 버전

    에디트플러스 중국어 크랙 버전

    작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

    SublimeText3 영어 버전

    SublimeText3 영어 버전

    권장 사항: Win 버전, 코드 프롬프트 지원!

    맨티스BT

    맨티스BT

    Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 최신 버전

    SecList

    SecList

    SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.