[펌] MySQL 8.0 새기능

Code/Web 2020. 3. 10. 08:15

MySQL 8.0 새기능
https://blog.naver.com/theswice/221321015924

* NoSQL 지원

* SQL WINDOW 함수, 
Common Table, 
NOWAIT 및 SKIP LOCKED, 
내림차순 인덱스, 
Grouping, 
정규식, 
Character Sets, 
Cost Model 및 히스토그램.


* JSON Extended 구문, 새로운 기능, 
향상된 정렬 및 부분 업데이트. 
JSON TABLE 함수를 사용하면 JSON 데이터 용 SQL machinery를 사용할 수 있습니다.

* Security OpenSSL 개선, 새로운 기본 인증, SQL Roles, breaking up the super privilege, 암호 강화, 권한 부여.

* Performance는 MySQL 5.7보다 최대 2배 빠릅니다.
- 실제로 설치해 보니 30%는 기본으로 빠름

* GIS Geography 지원

* Reliability DDL 문은 원자성 및 충돌 안전성이 있으며 meta-data는 트랜잭션 데이터 사전에 싱글 저장됩니다.

* Observability Performance Schema, Information Schema, Invisible Indexes, Error Logging.

* Manageability Persistent Configuration 변수, Undo tablespace 관리, Restart 명령어 및 새로운 DDL.

* High Availability InnoDB Cluster는 데이터베이스에 통합 된 네이티브 HA 솔루션을 제공합니다.

자세한 정보는

https://m.blog.naver.com/theswice/221321015924

 

//

더보기

MySQL 8.0 SQL, JSON  GIS와 같은 분야에서 개발자가 요청한 많은 새로운 기능을 제공합니다. 개발자는 Emojis를 저장할 수 있기를 원하므로 UTF8MB4가 이제 8.0 default character set가 되었습니다.

NoSQL Document Store
MySQL Document Store는 개발자가 전통적인 SQL 관계형 응용 프로그램과 NoSQL, schema-free document 데이터베이스 응용 프로그램을 개발하는데 최대한의 유연성을 제공합니다. 따라서 별도의 NoSQL document 데이터베이스가 필요하지 않습니다. MySQL Document Store multi-document 트랜잭션 지원과 schema-less JSON 문서를위한 완전한 ACID 준수를 제공합니다.

SQL
Window Functions
https://blog.naver.com/theswice/221319941905
 
Common Table 표현식
https://blog.naver.com/theswice/221320907275
 
NOWAIT SKIP LOCKED
MySQL 8.0 SQL locking 절에 NOWAIT  SKIP LOCKED 대안을 제공합니다. 일반적으로 로우가 UPDATE 또는 SELECT ... FOR UPDATE로 인해 잠기면 다른 트랜잭션은 잠긴 로우에 액세스하기 위해 대기해야 합니다. 일부 유즈 케이스에서는 로우가 잠겨 있거나 잠긴 로우를 무시한 경우 즉시 반환해야 할 필요가 있습니다. NOWAIT을 사용하는 locking 절은 로우 잠금을 얻기 위해 절대로 기다리지 않습니다. 대신 쿼리가 실패하여 오류가 발생합니다. SKIP LOCKED를 사용하는 잠금 절은 나열된 테이블에 대한 로우 잠금을 확보하기 위해 절대로 기다리지 않습니다. 대신, 잠긴 로우는 건너 뛰고 전혀 읽지 않습니다.
 
Descending Indexes
MySQL 8.0은 인덱스를 내림차순으로 지원합니다. 이러한 인덱스의 값은 내림차순으로 정렬되며 앞으로 스캔됩니다. 8.0 이전에는 사용자가 내림차순 인덱스를 만들 때 오름차순 인덱스를 생성하고 역순으로 검색했습니다. 한 가지 이점은 정방향 인덱스 스캔이 역방향 인덱스 스캔보다 빠릅니다.

CREATE TABLE t ( c1 INT, c2 INT, INDEX idx1 (c1 ASC, c2 ASC), INDEX idx2 (c1 ASC, c2 DESC), INDEX idx3 (c1 DESC, c2 ASC), INDEX idx4 (c1 DESC, c2 DESC) ); ORDER BY c1 ASC, c2 ASC -- optimizer can use idx1 ORDER BY c1 DESC, c2 DESC -- optimizer can use idx4 ORDER BY c1 ASC, c2 DESC -- optimizer can use idx2 ORDER BY c1 DESC, c2 ASC -- optimizer can use idx3

GROUPING
https://blog.naver.com/theswice/221320978949

JSON
Extended Syntax for Ranges in JSON path expressions
MySQL 8.0 JSON 경로 표현식의 범위에 대한 구문을 확장합니다. 예를 들어, SELECT JSON_EXTRACT ( '[1, 2, 3, 4, 5]', '$[1 to 3]'); 결과는 [2, 3, 4]입니다. '$[1 to 3]' 1번째 위치(맨처음 0번째)를 가르키며 거기서부터 3개의 값을 출력한다는 의미입니다.
 
JSON Table Functions
MySQL 8.0에는 JSON 데이터 용 SQL 기계를 사용할 수 있게 해주는 JSON table 함수가 추가되었습니다. JSON_TABLE() JSON 데이터의 관계형 뷰를 생성합니다. 사용자는 SQL, join, project  aggregate를 사용하여 함수가 리턴 한 결과를 일반 관계형 테이블로 조회 할 수 있습니다.
https://dev.mysql.com/doc/refman/8.0/en/json-table-functions.html
 
JSON Aggregation Functions
MySQL8.0에는 JSON 배열을 생성하는 집계 함수 JSON_ARRAYAGG() JSON 객체를 생성하는 JSON_OBJECTAGG()가 추가되었습니다. 이렇게 하면 여러 로우의 JSON 문서를 JSON 배열이나 JSON 객체로 결합 할 수 있습니다.
https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_json-arrayagg
 
JSON Merge Functions
JSON_MERGE_PATCH() 함수는 RFC7396에 지정된 JavaScript (및 다른 스크립팅 언어)의 의미를 구현합니다. , 두 번째 문서의 우선 순위에 따라 중복을 제거합니다. 예를 들어, JSON_MERGE( '{ "a": 1, "b": 2}', '{ "a": 3, "c": 4}');  결과로 {"a": [1, 3], "b": 2, "c": 4}를 반환합니다.
 
JSON Improved Sorting
MySQL 8.0은 가변 길이 정렬 키(variable length sort key)를 사용하여 JSON 값을 정렬/그룹화 할 때 더 나은 성능을 제공합니다. 예비 벤치 마크에서는 유스케이스에 따라 1.2-18 배의 개선을 보여 줍니다.
 
JSON Partial Update
MySQL 8.0에는 JSON_REMOVE(), JSON_SET()  JSON_REPLACE() 함수에 대한 부분 업데이트 지원이 추가되었습니다. JSON 문서의 일부만 업데이트되는 경우 처리기에 변경된 내용에 대한 정보를 제공하여 저장소 엔진과 복제가 전체 문서를 작성할 필요가 없도록 합니다.

Cost Model
Query Optimizer Takes Data Buffering into Account
MySQL8.0은 데이터가 메모리에 있는지 또는 디스크에 있는지 여부에 대한 지식을 기반으로 query plan을 선택합니다. 이것은 end-user가 볼 때 구성이 필요 없으므로 자동으로 발생합니다. 역사적으로, MySQL cost model spinning 디스크에 데이터가 있다고 가정합니다. 메모리 내 및 디스크상의 데이터를 찾는 것과 관련된 비용 상수가 이제는 달라지므로 Optimizer는 데이터 위치에 대한 지식을 기반으로 두 경우에 대해 보다 최적의 액세스 방법을 선택합니다.
 
Optimizer Histograms
MySQL 8.0은 히스토그램 통계를 구현한다. 히스토그램을 사용하면 테이블의 컬럼에 대한 데이터 분포에 대한 통계를 생성 할 수 있습니다. 일반적으로 인덱싱 되지 않은 컬럼에 대해 수행되며 최적의 query plan을 찾는데 query optimizer에서 사용됩니다. 히스토그램 통계의 기본 유스케이스는 "COLUMN operator CONSTANT"형식의 술어에 대한 선택성(필터 효과)을 계산하기 위한 것입니다.

Reliability
Transactional Data Dictionary
MySQL8.0 Transactional Data Dictionary를 사용하여 원자 단위의 안전한 DDL을 보장함으로써 안정성을 향상시킵니다. 이를 통해 사용자는 DDL문이 완전히 실행되거나 전혀 실행되지 않을 것이라는 보장 받습니다. 이는 복제 환경에서 특히 중요합니다. 그렇지 않으면 마스터와 슬레이브가 동기화되지 않고 data-drift가 발생하는 시나리오가 있을 수 있습니다.
 
Observability
Information Schema (speed up)
MySQL 8.0 Information Schema를 다시 구현합니다. 새로운 구현에서 Information Schema 테이블은 InnoDB에 저장된 data dictionary 테이블에 대한 간단한 뷰입니다. 이것은 이전 구현보다 최대 100배의 속도 향상이 되었습니다.
 
Performance Schema (speed up)
MySQL 8.0 Performance Schema 테이블에 100개 이상의 인덱스를 추가하여 Performance Schema에 대한 쿼리 속도를 높였습니다.

Manageability
INVISIBLE Indexes
MySQL INVISIBLE 인덱스를 지원한다. , 옵티마이저에서 INVISIBLE 인덱스에 대해서는 실행계획으로 잡지 않습니다. 이 기능은 기본키 이외의 인덱스에도 적용됩니다인덱스는 기본적으로 표시됩니다. 새 인덱스에 대해 명시적으로 인덱스 가시성을 제어하려면 CREATE TABLE, CREATE INDEX 또는 ALTER TABLE에 대한 인덱스 정의의 일부로 VISIBLE 또는 INVISIBLE 키워드를 사용하십시오.

CREATE TABLE t1 ( i INT, j INT, k INT, INDEX i_idx (i) INVISIBLE ) ENGINE = InnoDB; CREATE INDEX j_idx ON t1 (j) INVISIBLE; ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;

기존 인덱스의 가시성을 변경하려면 ALTER TABLE ... ALTER INDEX VISIBLE 또는 INVISIBLE 키워드를 사용하십시오.

ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE; ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;

인덱스가 표시되는지 또는 표시되지 않는지에 대한 정보는 INFORMATION_SCHEMA.STATISTICS 테이블 또는 SHOW INDEX 출력에서 사용할 수 있습니다.

SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'theswicedb' AND TABLE_NAME = 't1'; +------------+------------+ | INDEX_NAME | IS_VISIBLE | +------------+------------+ | i_idx | YES | | j_idx | NO | | k_idx | NO | +------------+------------+

정의에는 명시적으로 기본키가 포함되지 않지만 NOT NULL인 컬럼 j의 인덱스는 로우에 기본키와 동일한 제약 조건을 배치하고 있어 보이지 않게 할 수 없습니다.

CREATE TABLE t2 ( i INT NOT NULL, j INT NOT NULL, UNIQUE j_idx (j) ) ENGINE = InnoDB; ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE; ERROR 3522 (HY000): A primary key index cannot be invisible

UNIQUE인덱스이면서 NULL인 컬럼이나 일반 인덱스이면서 NULL인 컬럼에 대해서는 INVISIBLE을 사용할 수 있습니다.

CREATE TABLE t3 ( i INT NULL, j INT NOT NULL, UNIQUE idx_i(i) ) ENGINE = InnoDB; ALTER TABLE t3 ALTER INDEX idx_i INVISIBLE; Query OK, 0 rows affected (0.08 sec) CREATE TABLE t3 ( i INT NULL, j INT NOT NULL, KEY idx_i (i) ) ENGINE = InnoDB; ALTER TABLE t3 ALTER INDEX idx_i INVISIBLE; Query OK, 0 rows affected (0.08 sec)

High Availability
MySQL InnoDB Cluster는 데이터베이스에 통합 된 네이티브 HA 솔루션을 제공합니다. MySQL 서버를 Group Replication, MySQL Router  MySQL Shell과 긴밀하게 통합하므로 외부 도구, 스크립트 또는 기타 구성 요소에 의존 할 필요가 없습니다.
https://blog.naver.com/theswice/221125803925
 
Security features
OpenSSL by Default in Community Edition
MySQL 8.0 OpenSSL MySQL Enterprise Edition MySQL Community Edition 모두를 위한 기본 TLS / SSL 라이브러리로 통합하고 있습니다.
 
SQL roles
https://blog.naver.com/theswice/221318181319

Performance
MySQL 8.0 MySQL 5.7보다 최대 2배 빠릅니다. MySQL 8.0 Read/Write workload, IO bound workload 및 높은 경합 "hot spot" 작업 부하에 대해 보다 우수한 성능을 제공합니다.

Scaling Read/Write Workloads
MySQL 8.0 RW  heavy write workload에서 잘 확장됩니다. 집중적인 RW workload에서 우리는 이미 4명의 동시 사용자로부터 더 나은 성능을 보았고 MySQL 5.7과 비교하여 높은 부하에서 2배 이상의 성능을 보였습니다. 5.7 Read Only workload의 확장성을 크게 개선했지만 8.0 Read/Write workload의 확장성을 크게 향상시켰다고 말할 수 있습니다. 그 결과, MySQL은 표준 서버측 하드웨어 (CPU 소켓 2개가 있는 시스템처럼)의 하드웨어 활용도 (효율성)를 향상시킵니다. 이 개선은 InnoDB REDO 로그에 기록하는 방법을 재설계하기 때문입니다. 사용자 스레드가 데이터 변경 사항을 기록하기 위해 끊임없이 노력한 역사적인 구현과는 달리, 새로운 REDO 로그 솔루션에서는 사용자 스레드가 이제 잠금이 해제되고 REDO 쓰기 및 플러시가 전용 백그라운드 스레드에 의해 관리되며 전체 REDO 처리가 이벤트가 됩니다.
 
Utilizing IO Capacity (Fast Storage)
MySQL 8.0을 사용하면 모든 저장 장치를 최대한 활용할 수 있습니다.
 
Better Performance upon High Contention Loads (“hot rows”)
MySQL 8.0은 경쟁이 많은 workload 성능을 크게 향상시킵니다. 다수의 트랜잭션이 테이블의 동일한 로우에 대한 잠금의 경우 대기중인 트랜잭션의 큐를 생성 할 때 high contention workload가 발생합니다. 실제 workload가 하루 동안 원활하지 않지만 특정 시간에 폭발 할 수 있습니다. MySQL 8.0은 초당 트랜잭션, 평균 대기 시간 및 95 백분위 수 대기 시간 측면에서 이러한 버스트를 훨씬 효과적으로 처리합니다. 최종 사용자의 이익은 시스템의 여유 용량이 적기 때문에 더 높은 평균 부하로 실행할 수 있기 때문에 하드웨어 활용도(효율성)가 향상됩니다.

참고사이트
https://blogs.oracle.com/mysql/announcing-general-availability-of-mysql-80

//

 

'Code > Web' 카테고리의 다른 글

[php] composer 사용법 (속도 향상 방법)  (0) 2020.03.11
웹서버 nginx 폴더에 패스워드 설정  (0) 2020.03.11
[펌] MySQL 8.0 새기능  (0) 2020.03.10
[MySql] Explain  (0) 2020.03.08
[MySql] GROUP BY 쿼리 에러 해결 방법  (0) 2020.03.04
[MySql] sql_mode 설정  (0) 2020.03.02
Posted by 코덴스

댓글을 달아 주세요