JSON 필드 유형은 현재 버전에 인덱스가 없어 제작 시 매우 형편없습니다. JSON 필드를 추가, 삭제, 수정, 확인하는 효율성은 상상할 수 있으며, 기본적으로 사용할 수 없을 수도 있습니다. MySQL5.7은 이를 기반으로 인터넷에서 생성된 열 또는 계산된 열이라고 불리는 생성된 필드 유형을 제공합니다. 먼저 생성된 열(Generated Column)이 무엇인지 알아보겠습니다.
1. 생성된 열 소개
생성된 열은 MySQL 5.7.6에 도입된 새로운 기능입니다. 소위 Cenerated Column은 데이터베이스의 이 열이 다른 열에서 계산된다는 의미입니다. 설명을 위해 공식 참조 매뉴얼의 예를 인용해 보겠습니다.
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb)) ); INSERT INTO triangle (sidea, sideb) VALUES(1,1),(3,4),(6,8); mysql> SELECT * FROM triangle; +-------+-------+--------------------+ | sidea | sideb | sidec | +-------+-------+--------------------+ | 1 | 1 | 1.4142135623730951 | | 3 | 4 | 5 | | 6 | 8 | 10 | +-------+-------+--------------------+
생성 열에는 가상 생성 열과 저장된 생성 열이라는 두 가지 유형이 있습니다. 전자는 생성된 열을 데이터 사전(데이터 사전의 메타데이터)에만 저장합니다. 테이블), 이 데이터 열은 디스크에 유지되지 않습니다. 후자는 읽을 때마다 계산하는 대신 생성된 열을 디스크에 유지합니다. 분명히 후자는 기존 데이터에서 계산할 수 있는 데이터를 저장하고 더 많은 디스크 공간이 필요하며 Virtual Column에 비해 이점이 없습니다. 따라서 MySQL 5.7에서는 생성된 열의 유형이 지정되지 않으며 기본값은 Virtual입니다. 일반적으로 가상 생성 열을 사용해야 하지만 현재 가상 생성 열을 사용하는 데에는 기본 키로 사용할 수 없고, 기본 키로 사용할 수 없으며, 전체 텍스트 인덱스 및 공간 인덱스를 생성할 수 없는 등 많은 제한 사항이 있습니다. 그러나 후속 버전에서는 지원될 수 있습니다. 따라서 생성된 열 필드를 인덱싱에 사용하는 경우 저장된 생성 열을 사용해야 합니다. 인덱싱에 생성된 열을 사용할 경우 JSON 필드 인덱싱에 대한 공식적인 솔루션은 저장된 생성 열을 사용하는 것입니다. Stored Generator를 이용한 테이블 생성문은 다음과 같습니다.
CREATE TABLE triangle ( sidea DOUBLE, sideb DOUBLE, sidec DOUBLE AS (SQRT(sidea * sidea + sideb * sideb) STORED) );
2. 생성된 컬럼에 대한 주의사항
생성된 컬럼은 작성할 수 없으며 생성 시 자동으로 생성됩니다. 이 컬럼의 계산식이 타당한지 고려해야 합니다. 타당하지 않은 경우 생성 시에는 오류가 보고되지 않지만, 생성된 컬럼이 의존하는 컬럼에는 값을 삽입할 때 오류가 보고됩니다. 삭제 시 오류가 발생하며 생성된 열을 먼저 삭제해야 합니다. 그래야만 생성된 열의 정의가 불법입니다. 예를 들어 생성된 열을 "column x + 열 y"로 정의하면 x열이나 y열은 모두 숫자인 것은 당연합니다. x열이나 y열을 정의하면 해당 열을 문자형으로 정의(또는 수정)하면 오류가 예상되지만 실제로는 정상적으로 생성할 수 있지만 오류가 발생합니다. 삽입 시 보고됩니다.
3. 생성된 열을 사용하여 JSON 필드에 인덱스를 추가합니다.
일반적으로 JSON 필드와 관련된 쿼리는 전체 테이블을 검색합니다. 자체 인덱스를 생성할 수 없는 경우 생성된 열 기능을 사용하여 JSON 필드의 해당 키에 대한 열을 생성된 열로 생성한 다음 생성된 열을 인덱스합니다.
ALTER TABLE json_test ADD COLUMN age INT AS (JSON_EXTRACT(user_info,'$.age')) STORED, ADD KEY idx_age (age);
전후 비교는 다음과 같습니다.
생성된 열을 사용하고 인덱스를 추가한 후 해당 인덱스를 사용하여 값을 쿼리하는 것을 명확하게 알 수 있습니다. JSON 필드.
결론
MySQL 5.7에서 생성된 열과 JSON 열의 등장으로 일부 시나리오에서는 MongoDB와 같은 NoSQL을 대체할 수 있게 되었지만 전체적으로는 그렇지 않았습니다. MongoDB 등이 수행하는 기능은 매우 강력하지만 앞으로 이 두 가지 유형을 사용하는 시나리오가 점점 더 많아질 것이며 동시에 DBA의 집중적인 사용도 더욱 커질 것으로 기대합니다. JSON 유형의 비즈니스는 JSON이 큰 필드가 되는 것을 방지하기 위해 독립적인 MySQL 인스턴스를 사용하여 실행됩니다. (JSON 문서에 저장되는 JSON 열의 크기는 max_allowed_packet 시스템 변수의 값으로 제한됩니다.) 이는 다른 작업에 영향을 미칩니다. .
위 내용은 MySQL 5.7의 새로운 기능 | Json Column 및 생성된 열(Part 2)에 대한 자세한 내용은 PHP 중국어 홈페이지(m.sbmmt.com)를 참고해주세요!