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
제약 #18209FULLTEXT
구문 및 색인 #1793SPATIAL
(GIS
라고도 함GEOMETRY
) 함수, 데이터 형식 및 인덱스 #6347ascii
,binary
,latin1
,utf8
,utf8mb4
,gbk
이외의 문자 집합.- SYS 스키마
- 옵티마이저 트레이스
- XML 함수
- X 프로토콜 #1109
- 세이브 포인트 #6840
- 열 수준 권한 #9766
XA
구문 (TiDB는 내부적으로 2단계 커밋을 사용하지만, 이는 SQL 인터페이스를 통해 노출되지 않음)- `CREATE TABLE tblName AS SELECT stmt구문 #4754
CHECK TABLE
구문 #4673CHECKSUM TABLE
구문 #1895REPAIR 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
를 참조해라.
Note:
- 테이블을 생성 때에 기본 키를 지정하지 않으면, TiDB는
_tidb_rowid
를 사용하여 행을 식별한다. 이 값의 할당은 자동 증가 열과 할당자를 공유한다(이러한 열이 있는 경우). 기본 키로 자동 증가 열을 지정하면 TiDB는 이 열을 사용하여 행을 식별한다. 이 상황에서는 다음 상황이 발생할 수 있다.
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)
Note:
AUTO_INCREMENT
속성은 실제 운영 환경에서 핫스팟을 유발할 수 있다. 자세한 내용은 HotSpot 문제 해결을 참조해라. 대신 AUTO_RANDOM
를 사용하는 것이 좋다.
성능 스키마
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_CREATE
및NO_ENGINE_SUBSTITUTION
모드는 호환성을 위해 허용되지만 TiDB에는 적용되지 않는다.
기본 차이
- 기본 문자 세트(Default character set):
- TiDB의 기본값은
utf8mb4
이다. - MySQL 5.7의 기본값은
latin1
이다. - MySQL 8.0의 기본값은
utf8mb4
이다.
- TiDB의 기본값은
- 기본 데이터 정렬(Default Collation):
- TiDB의
utf8mb4
의 기본 데이터 정렬은utf8mb4_bin
이다. - MySQL 5.7의
utf8mb4
기본 데이터 정렬은utf8mb4_general_ci
이다. - MySQL 8.0의
utf8mb4
기본 데이터 정렬은utf8mb4_0900_ai_ci
이다.
- TiDB의
- 기본값
foreign_key_checks
:- TiDB의 기본값은
OFF
이며, 현재 TiDB는OFF
만 지원한다. - MySQL 5.7의 기본값은
ON
이다.
- TiDB의 기본값은
- 기본 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
.
- TiDB의 기본 SQL 모드에는 다음 모드가 포함된다.
- 기본값
lower_case_table_names
:- TiDB의 기본값은
2
이며, 현재 TiDB는2
만 지원한다. - MySQL의 기본값:
- Linux의 경우:
0
- Windows의 경우:
1
- macOS의 경우:
2
- Linux의 경우:
- TiDB의 기본값은
- 기본값
explicit_defaults_for_timestamp
:- TiDB의 기본값은
ON
이며 현재 TiDB는ON
만 지원한다. - MySQL의 기본값:
- MySQL 5.7의 경우:
OFF
. - MySQL 8.0의 경우:
ON
.
- MySQL 5.7의 경우:
- TiDB의 기본값은
일시
명명된 타임존
- 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에서는 더 이상 사용되지 않는 기능이며 대신에 응용 프로그램에 숫자를 채우는 것이 좋다.
MySQL Compatibility 최종수정일 2022. 7. 21. 오후 7:23:10: cloud: add SQL and TiFlash related docs (#9001) (#9479)