TiDB - MySQL과의 호환성

TiDB는 MySQL 5.7 프로토콜 및 MySQL 5.7의 일반적인 기능과 구문과 높은 호환성을 가지고 있다. MySQL 5.7 에코시스템 도구(PHPMyAdmin, Navicat, MySQL Workbench, mysqldump 및 Mydumper/myloader)와 MySQL 클라이언트를 TiDB에 사용할 수 있다.

다만, MySQL의 일부 기능은 지원되지 않는다. 이는 문제를 해결하는 더 나은 방법(예 : JSON으로 대체 된 XML 함수 등)이 있어서 이거나, 현재 수요와 필요한 노력의 부족(예: 저장 프로시저 또는 함수)하기 때문일 수 있다. 일부 기능은 분산 시스템으로 구현하기가 어려울 수 있다.

  • 또한 TiDB는 MySQL 복제 프로토콜을 지원하지 않지만, MySQL에서 데이터를 복제하는 특정 도구를 제공한다.
    • MySQL에서 데이터 복제: TiDB 데이터 마이그레이션(DM)은 MySQL/MariaDB에서 TiDB로의 완전한 데이터 마이그레이션과 증분 데이터 복제를 지원하는 도구이다.
    • MySQL에 데이터 복제 : TiCDC는 TiKV 변경 로그를 Pull해서 TiDB의 증분 데이터를 복제하는 도구이다. TiCDC는 MySQL 싱크를 사용하여 TiDB의 증분 데이터를 MySQL에 복제한다.

Note:

이 페이지에서는 MySQL과 TiDB의 일반적인 차이점에 대해 설명한다. 안전하고 비관적 트랜잭션 모드의 호환성은 전용 페이지를 참조해라.

지원되지 않는 기능

  • 저장 프로시저 및 함수
  • 트리거
  • 이벤트
  • 사용자 정의 함수
  • FOREIGN KEY 제약 #18209
  • FULLTEXT 구문 및 색인 #1793
  • SPATIAL(GIS라고도 함 GEOMETRY) 함수, 데이터 형식 및 인덱스 #6347
  • ascii, binary, latin1, utf8, utf8mb4, gbk 이외의 문자 집합.
  • SYS 스키마
  • 옵티마이저 트레이스
  • XML 함수
  • X 프로토콜 #1109
  • 세이브 포인트 #6840
  • 열 수준 권한 #9766
  • XA 구문 (TiDB는 내부적으로 2단계 커밋을 사용하지만, 이는 SQL 인터페이스를 통해 노출되지 않음)
  • `CREATE TABLE tblName AS SELECT stmt구문 #4754
  • CHECK TABLE 구문 #4673
  • CHECKSUM TABLE구문 #1895
  • REPAIR TABLE 구문
  • OPTIMIZE TABLE 구문
  • HANDLER 구문
  • CREATE TABLESPACE 구문

MySQL과 다른 기능

자동 증가 ID

  • TiDB에서 자동 증가 열은 전역적으로 고유하다. 이는 단일 TiDB 서버에서 증분이지만, 반드시 여러 TiDB 서버간에 증분하거나 순서대로 할당할 필요는 없다. 기본 값과 커스텀 값을 혼합하지 않는 것이 좋다. 그렇지 않으면 Duplicated Error 에러 메시지가 표시될 수 있다.

  • tidb_allow_remove_auto_inc 시스템 변수를 사용하여, AUTO_INCREMENT 열 속성의 삭제를 허용하거나 금지할 수 있다. 열 속성을 삭제하는 구문은 ALTER TABLE MODIFY 또는 ALTER TABLE CHANGE이다.

  • TiDB는 AUTO_INCREMENT 열 속성 추가를 지원하지 않으며 이 속성을 삭제하면 이 속성을 복구할 수 없다.

  • 자세한 내용은 AUTO_INCREMENT를 참조해라.

mysql> CREATE TABLE t(id INT UNIQUE KEY AUTO_INCREMENT);
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t VALUES(),(),();
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT _tidb_rowid, id FROM t;
+-------------+------+
| _tidb_rowid | id   |
+-------------+------+
|           4 |    1 |
|           5 |    2 |
|           6 |    3 |
+-------------+------+
3 rows in set (0.01 sec)

성능 스키마

TiDB는 프로메테우스와 그라파나의 조합으로 성능 모니터링 메트릭을 저장하고 쿼리한다. 성능 스키마 테이블은 TiDB에 빈 결과를 반환한다.

쿼리 실행 계획

EXPLAIN FOR 쿼리 실행 계획(EXPLAIN)의 출력 형식, 출력 내용 및 권한 설정은 MySQL의 것과 크게 다르다.

MySQL 시스템 변수 optimizer_switch는 TiDB에서 읽기 전용이며, 쿼리 계획에는 영향을 미치지 않는다. MySQL과 유사한 구문으로 옵티마이저 힌트를 사용할 수도 있지만 사용 가능한 힌트와 구현이 다를 수 있다.

자세한 내용은 “쿼리 실행 계획 이해하기"를 참조해라.

내장 함수

TiDB는 MySQL 내장 함수의 대부분을 지원하지만 전부는 아니다. 구문 SHOW BUILTINS은 사용 가능한 함수 목록을 제공gksek.

참조 : TiDB SQL 문법.

DDL

TiDB에서 지원되는 모든 DDL 변경은 온라인으로 수행된다. MySQL의 DDL 조작과 비교하여 TiDB의 DDL 조작에는 다음과 같은 주요 한계가 있다.

  • ALTER TABLE 명령문에서 여러 작업을 완료할 수 없다. 예를 들어, 하나의 명령문에 여러 열이나 인덱스를 추가할 수 없다. 그렇지 않으면 Unsupported multi schema change 에러 메시지가 표시될 수 있다.

  • TiDB의 ALTER TABLE는 일부 데이터 유형 변경을 지원하지 않는다. 예를 들어, TiDB는 DECIMAL 유형에서 DATE 유형으로의 변경을 지원하지 않는다. 데이터 유형 변경이 지원되지 않으면 TiDB는 Unsupported modify column: type %d not match origin %d 에러를 표시한다. 자세한 내용은 ALTER TABLE를 참조해라.

  • ALGORITHM={INSTANT,INPLACE,COPY} 구문은 TiDB의 단언문(assertion)으로만 기능하며, ALTER 알고리즘을 변경하지 않는다. 자세한 내용은 ALTER TABLE를 참조해라.

  • CLUSTERED 유형의 기본 키 추가/제거는 지원되지 않는다. CLUSTERED 유형의 기본 키에 대한 자세한 내용은 클러스터된 인덱스를 참조해라.

  • 다양한 유형의 인덱스(HASH|BTREE|RTREE|FULLTEXT)는 지원되지 않으며, 지정하면 구문 분석되어 무시된다.

  • 테이블 파티셔닝은 HASH, RANGE, LIST 파티셔닝 유형을 지원한다. 지원되지 않는 파티션 유형의 경우 Warning: Unsupported partition type %s, treat as normal table 에러가 출력될 수 있는 %s는 특정 파티션 유형이다.

  • 테이블 파티셔닝은 ADD, DROP, TRUNCATE 작업도 지원한다. 다른 파티션 작업은 무시된다. 다음 테이블 파티션 구문은 지원되지 않는다.

    • PARTITION BY KEY
    • SUBPARTITION
    • {CHECK|TRUNCATE|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD|REORGANIZE|COALESCE} PARTITION
      자세한 내용은 파티셔닝를 참조해라.

테이블 분석

통계 수집은 MySQL/InnoDB에서는 비교적 가볍고 단명한 작업이라는 점에서 TiDB와 MySQL에서의 동작이 다르지만 TiDB에서는 테이블 통계를 완전히 재구성하고 완료하기까지 훨씬 길다. 시간이 걸릴 수 있다.

이러한 차이점은 아래 ANALYZE TABLE에서 자세히 설명한다.

SELECT 구문 제한

  • 구문 SELECT … INTO @variable은 지원되지 않습니다.
  • 구문 SELECT … GROUP BY … WITH ROLLUP은 지원되지 않습니다.
  • 구문 SELECT .. GROUP BY expr은 MySQL 5.7처럼 GROUP BY expr ORDER BY expr의미하지 않습니다.

자세한 내용은 SELECT문 참조를 참조하십시오.

UPDATE Statement

UPDATE문 참조를 참조하십시오.

Views

TiDB 뷰는 업데이트할 수 없다. UPDATE와 같은 INSERT 작업은 지원하고, DELETE는 지원하지 않는다.

임시 테이블

자세한 내용은 TiDB 로컬 임시 테이블과 MySQL 임시 테이블 간의 호환성을 참조해라.

문자 세트와 일치

  • TiDB에서 지원하는 문자 세트 및 데이터 정렬에 대한 자세한 내용은 문자 세트 및 데이터 정렬 개요를 참조해라.

  • GBK 문자 세트의 MySQL 호환성에 대한 자세한 내용은 GBK 호환성을 참조해라.

  • TiDB는 테이블에서 사용되는 문자 집합을 국가별 문자 집합으로 상속한다.

스토리지 엔진

호환성을 위해 TiDB는 대체 스토리지 엔진에서 테이블을 만드는 구문을 지원한다. 구현에서 TiDB는 메타데이터를 InnoDB 스토리지 엔진으로 기술한다.

TiDB는 MySQL과 유사한 스토리지 엔진의 추상화를 지원하지만 TiDB 서버를 시작할 때 --store 옵션을 사용하여 스토리지 엔진을 지정해야 한다.

SQL 모드

TiDB는 대부분의 SQL 모드를 지원한다.

  • Oracle 또는 PostgreSQL 같은 호환 모드는 구문 분석되지만 무시된다. 호환 모드는 MySQL 5.7에서 더 이상 사용되지 않으며 MySQL 5.7에서 제거되었다.
  • ONLY_FULL_GROUP_BY 모드에는 MySQL 5.7의 사소한 의미 차이가 있다.
  • MySQL의 MySQL NO_DIR_IN_CREATENO_ENGINE_SUBSTITUTION 모드는 호환성을 위해 허용되지만 TiDB에는 적용되지 않는다.

기본 차이

  • 기본 문자 세트(Default character set):
    • TiDB의 기본값은 utf8mb4이다.
    • MySQL 5.7의 기본값은 latin1이다.
    • MySQL 8.0의 기본값은 utf8mb4이다.
  • 기본 데이터 정렬(Default Collation):
    • TiDB의 utf8mb4의 기본 데이터 정렬은 utf8mb4_bin이다.
    • MySQL 5.7의 utf8mb4 기본 데이터 정렬은 utf8mb4_general_ci이다.
    • MySQL 8.0의 utf8mb4 기본 데이터 정렬은 utf8mb4_0900_ai_ci이다.
  • 기본값 foreign_key_checks:
    • TiDB의 기본값은 OFF이며, 현재 TiDB는 OFF만 지원한다.
    • MySQL 5.7의 기본값은 ON이다.
  • 기본 SQL 모드:
    • TiDB의 기본 SQL 모드에는 다음 모드가 포함된다.
      ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION.
    • MySQL의 기본 SQL 모드 :
      • MySQL 5.7의 기본 SQL 모드는 MySQL 5.7과 동일하다.
      • MySQL 8.0의 기본 SQL 모드에는 다음 모드가 포함되어 있다 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION.
  • 기본값 lower_case_table_names:
    • TiDB의 기본값은 2이며, 현재 TiDB는 2만 지원한다.
    • MySQL의 기본값:
      • Linux의 경우: 0
      • Windows의 경우: 1
      • macOS의 경우: 2
  • 기본값 explicit_defaults_for_timestamp:
    • TiDB의 기본값은 ON이며 현재 TiDB는 ON만 지원한다.
    • MySQL의 기본값:
      • MySQL 5.7의 경우: OFF.
      • MySQL 8.0의 경우: ON.

일시

명명된 타임존

  • TiDB는 현재 시스템에 설치된 모든 타임존 룰을 계산을 위해 사용한다(일반적 tzdata으로 패키지). 표준 시간대 테이블 데이터를 가져올 필요 없이 모든 표준 시간대 이름을 사용할 수 있다. 표준 시간대 테이블 데이터를 가져오고 계산 규칙을 변경할 수 없다.
  • MySQL은 기본적으로 로컬 타임존을 사용하며, 계산을 위해 시스템에 내장된 현재 타임존 규칙(예: 서머타임 시작 시점)에 따라 달라진다. 또한, 타임존은 타임존 테이블 데이터를 가져오지(import) 않고 시간대 이름으로 지정할 수 없다.

타입 시스템의 차이

다음 열 유형은 MySQL에서 지원되지만, TiDB에서는 지원 되지 않는다.

  • FLOAT4/FLOAT8
  • SQL_TSI_*(SQL_TSI_MONTH, SQL_TSI_WEEK, SQL_TSI_DAY, SQL_TSI_HOUR, SQL_TSI_MINUTE, SQL_TSI_SECOND를 포함, SQL_TSI_YEAR 제외)

더 이상 사용되지 않는 기능으로 인한 비호환성

TiDB는 MySQL에서 사용되지 않는 것으로 표시된 특정 기능을 구현하지 않는다.

  • 부동 소수점 유형의 정밀도를 지정. MySQL 8.0에서는 더 이상 사용되지 않는 기능이며 대신에 DECIMAL 유형을 사용하는 것이 좋다.
  • ZEROFILL 속성. MySQL 8.0에서는 더 이상 사용되지 않는 기능이며 대신에 응용 프로그램에 숫자를 채우는 것이 좋다.




최종 수정 : 2022-09-02