mysql8.0이 온다

伊谢尔伦
伊谢尔伦원래의
2017-02-07 16:33:255068검색

MySQL은 스웨덴 MySQL AB 회사에서 개발한 오픈 소스 소규모 관계형 데이터베이스 관리 시스템입니다. MySQL은 현재 인터넷상의 중소규모 웹사이트에서 널리 사용되고 있습니다. 작은 크기, 빠른 속도, 낮은 총 소유 비용, 특히 오픈 소스의 특성으로 인해 많은 중소 웹 사이트에서는 웹 사이트 총 소유 비용을 줄이기 위해 MySQL을 웹 사이트 데이터베이스로 선택합니다.

MySQL 개발팀은 지난 12일 MySQL 8.0.0 개발 마일스톤 버전(DMR) 출시를 발표했습니다! 어떤 사람들은 왜 MySQL이 5.x에서 8.0으로 뛰어올랐는지 놀랄 수도 있습니다. 실제로 MySQL 5.x 시리즈는 오라클이 인수하기 전에는 5.1이었고 인수 이후에도 5.5, 5.6, 5.7 등으로 5.x를 유지해왔다. 실제로 원래 릴리스 리듬을 따르면 5.6.x는 6.x, 5.7.x는 7.x라고 생각하면 됩니다. 따라서 버전 이름 지정 방법을 변경했습니다.

mysql8.0이 온다

그런데 이번에 출시된 MySQL 8.0.0 개발 버전에는 아직도 눈에 띄는 점이 많다.

MySQL 8.0.0의 주요 기능

MyISAM 스토리지 엔진과 완전히 분리된 트랜잭션 데이터 사전

실제로 데이터 사전을 더 이상 FRM이 아닌 InnoDB의 일부 테이블에 넣습니다. TRG, PAR 파일이 필요합니다! 이제 정보 스키마가 데이터 사전 테이블의 보기로 나타납니다. 원칙적으로 MyISAM 데이터 테이블 유형은 전혀 필요하지 않으며 모든 시스템 테이블을 InnoDB에 배치할 수 있습니다.

SQL 역할

역할은 권한의 모음입니다. 역할을 생성하고 사용자에게 역할을 부여 및 제거할 수 있습니다. 권한 관리에 편리합니다.

utf8mb4 문자 집합이 기본 문자 집합이 되고 Unicode 9를 지원합니다

기본 문자 집합이 latin1에서 utf8mb4로 변경되고, 기본 순서 정렬이 latin1_swedish_ci에서 utf8mb4_800_ci_ai로 변경됩니다.

보이지 않는 인덱스

일부 인덱스는 보이지 않도록 설정하여 SQL 최적화 프로그램이 이를 사용하지 않지만 백그라운드에서 계속 업데이트되도록 할 수 있습니다. 필요할 때 언제든지 가시성을 복원할 수 있습니다.

바이너리 데이터에 대한 비트 연산 수행 가능

BIGINT에 대한 비트 연산이 가능하며, 8.0부터는 [VAR]BINARY/[TINY|MEDIUM|LONG]에도 비트 연산이 가능합니다. BLOB도 지원됩니다.

IPv6 및 UUID에 대한 향상된 작업

INET6_ATON() 및 INET6_NTOA()는 이제 INET6_ATON()이 VARBINARY(16) 데이터 유형(128비트)을 반환하므로 비트 작업을 수행할 수 있습니다. UUID 작업이 개선되었으며 세 가지 새로운 함수 UUID_TO_BIN(), BIN_TO_UUID() 및 IS_UUID()가 도입되었습니다. MySQL에는 특별한 IPv6 및 UUID 데이터 유형이 없지만 VARBINARY(16) 데이터 유형으로 저장됩니다.

영구 전역 변수

SET PERSIST를 사용하여 서버를 다시 시작해도 유지되는 영구 전역 변수를 설정할 수 있습니다.

성능 데이터베이스 성능 스키마 개선

예를 들어 성능 데이터베이스에 100개 이상의 인덱스가 추가되어 더 빠른 검색이 가능해졌습니다.

SQL 분석기 리팩터링

지속적이고 점진적으로 SQL 분석기를 개선합니다. 기존 파서는 구문의 복잡성과 하향식 파싱 방식으로 인해 심각한 제한이 있어 유지 관리 및 확장이 어려웠습니다.

비용 모델

이제 InnoDB 버퍼는 주 메모리 캐시에 있는 테이블과 인덱스 수를 추정할 수 있습니다. 이를 통해 최적화 프로그램은 데이터를 메모리에 저장할 수 있는지 여부를 알 수 있습니다. 액세스 방법은 디스크에 저장되어야 합니다.

히스토그램

히스토그램을 통해 사용자나 DBA는 데이터 분포에 대한 통계를 작성할 수 있으며, 이는 쿼리 최적화에 활용되어 최적화된 쿼리 솔루션을 찾을 수 있습니다.

스캔 성능 향상

전체 테이블 쿼리와 범위 쿼리의 성능을 5~20% 향상시킬 수 있는 InnoDB 범위 쿼리 성능을 향상했습니다.

BLOB 재구성

BLOB를 재구성하면 조각 읽기/업데이트 작업 속도가 빨라지고 JSON 데이터 작업 속도가 빨라질 수 있습니다.

지속적인 자동 증가 값

InnoDB는 자동 증가 시퀀스의 최대값을 리두 로그에 유지합니다. 이 개선 사항은 매우 오래된 버그 번호 199도 수정합니다.

임시 테이블

압축된 임시 테이블에 대한 지원을 제거하고 임시 테이블 메타데이터를 메모리에 저장합니다.

더 중요한 개선 사항 및 세부 정보는 MySQL 8.0.0 릴리스 발표[1] 및 여기[2]를 참조하세요.

다운로드

현재 8.0.0은 아직 개발 버전입니다. 최신 기능을 경험하고 테스트하고 싶다면 dev.mysql.com에서 각 플랫폼별 설치 패키지를 다운로드할 수 있습니다. 3]. 그러나 MySQL 소프트웨어 패키지는 점점 더 커지고 있으며 Linux 플랫폼의 바이너리 패키지는 거의 1GB에 이릅니다. 프로덕션 환경에서 사용하는 경우 8.0이 안정 버전으로 들어가기 전에 5.7 시리즈를 계속 사용하십시오. 최신 버전은 5.7.15 GA 버전으로, 용량이 600M에 불과합니다.

최신 소스 코드는 GitHub에 있습니다. 관심 있는 친구들이 확인해 볼 수 있습니다. 그 중 다수는 중국에서 기여한 것입니다.

MySQL 8.0부터 보이지 않는 인덱스라고도 알려진 숨겨진 인덱스 기능이 지원됩니다. 보이지 않는 인덱스의 경우 최적화 프로그램은 이를 무시합니다. 이 기능을 통해 옵티마이저의 동작에 영향을 줄 수 있습니다. 또한, 인덱스를 삭제하기 전의 버퍼라고도 볼 수 있으며, 인덱스를 일시적으로 보이지 않게 설정한 후 애플리케이션이 정상인지, 오류가 있는지 관찰하고 이상이 없으면 최종적으로 삭제합니다. .

8.0.0 해당 릴리스 노트:

mysql8.0이 온다

테스트

# 创建一个普通的表t1,只带主键
mysql> create table t1 (a int primary key auto_increment, b int, c int, d int);
Query OK, 0 rows affected (0.67 sec)
# 增加一个索引
mysql> alter table t1 add key(b);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show indexes from t1\G
*************************** 1. row ***************************
        Table: t1
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: a
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
*************************** 2. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: b
 Seq_in_index: 1
  Column_name: b
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
2 rows in set (0.01 sec)
从show indexes的visible列显示了,这两个索引都是可见的。
# Load some data
insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000;
insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000 from t1;
insert into t1 select NULL, rand()*100000, rand()*10000,rand()*10000 from t1;
....
analyze table t1;
mysql> explain select * from t1 where b > 5000 limit 10;
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
| id | select_type | table | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra            |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
|  1 | SIMPLE     | t1   | NULL     | range | b         | b   | 5     | NULL | 1932 |   100.00| Using index condition |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+-----------------------+
1 row in set, 1 warning (0.00 sec
可以看到索引b被使用到
# 修改索引b为不可见
mysql> alter table t1 alter index b invisible;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show indexes from t1\G
*************************** 1. row ***************************
        Table: t1
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: a
    Collation: A
  Cardinality: 2048
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
*************************** 2. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: b
 Seq_in_index: 1
  Column_name: b
    Collation: A
  Cardinality: 2029
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: NO
2 rows in set (0.01 sec)
mysql> explain select * from t1 where b > 5000 limit 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2048
     filtered: 33.33
        Extra: Using where
1 row in set, 1 warning (0.00 sec)
当索引被修改为invisible后,优化器将不再选择这个索引
# 将索引重新修改为可见
mysql> alter table t1 alter index b visible;
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> explain select * from t1 where b > 5000 limit 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: t1
   partitions: NULL
         type: range
possible_keys: b
          key: b
      key_len: 5
          ref: NULL
         rows: 1932
     filtered: 100.00
        Extra: Using index condition
1 row in set, 1 warning (0.00 sec)
# 你也可以在创建索引的时候显式指定是否可见
mysql> alter table t1 add key(c) invisible;
Query OK, 0 rows affected (0.12 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> show indexes from t1 where key_name = 'c'\G
*************************** 1. row ***************************
        Table: t1
   Non_unique: 1
     Key_name: c
 Seq_in_index: 1
  Column_name: c
    Collation: A
  Cardinality: 1848
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: NO
1 row in set (0.01 sec)
# 或者在建表时指定关键字
mysql> create table t2 (a int primary key, b int, key(b) invisible);
Query OK, 0 rows affected (0.67 sec)
# 但primary key不可以设置为不可见
mysql> drop table t2;
Query OK, 0 rows affected (0.03 sec)
mysql> create table t2 (a int, b int, primary key(a) invisible);
ERROR 3522 (HY000): A primary key index cannot be invisible


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