TiDB - MySQLとの互換性

TiDBはMySQL 5.7プロトコル、およびMySQL 5.7の一般的な機能と構文に高い互換性を持つ。MySQL 5.7エコシステムツール(PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/myloader)とMySQLクライアントをTiDBで使用できる。

ただし、MySQLの一部機能はサポートされない。これは、問題を解決するよりよい方法、たとえばXML関数をJSONで置き換える方法があるため、または現在の需要と必要な作業量が見合わないため、たとえばストアドプロシージャや関数などが理由の場合がある。一部の機能は分散システムとして実装するのが難しい場合もある。

  • また、TiDBはMySQLレプリケーションプロトコルをサポートしないが、MySQLからデータを複製するための特定ツールを提供する。
    • MySQLからのデータ複製: TiDB Data Migration(DM)は、MySQL/MariaDBからTiDBへの完全なデータ移行と増分データ複製をサポートするツールである。
    • MySQLへのデータ複製: TiCDCはTiKV変更ログをPullし、TiDBの増分データを複製するツールである。TiCDCはMySQL sinkを使用して、TiDBの増分データをMySQLへ複製する。

Note:

このページでは、MySQLとTiDBの一般的な違いについて説明する。安全で悲観的なトランザクションモードの互換性については、専用ページを参照してほしい。

サポートされない機能

  • ストアドプロシージャおよび関数
  • トリガー
  • イベント
  • ユーザー定義関数
  • FOREIGN KEY制約 #18209
  • FULLTEXT構文およびインデックス #1793
  • SPATIALGISまたはGEOMETRYとも呼ばれる)関数、データ型、インデックス #6347
  • asciibinarylatin1utf8utf8mb4gbk以外の文字セット
  • 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)

Performance Schema

TiDBはPrometheusとGrafanaの組み合わせで性能監視メトリクスを保存し、クエリする。Performance SchemaテーブルはTiDBで空の結果を返す。

クエリ実行計画

EXPLAIN FORクエリ実行計画(EXPLAIN)の出力形式、出力内容、権限設定はMySQLのものと大きく異なる。

MySQLシステム変数optimizer_switchはTiDBでは読み取り専用であり、クエリ計画には影響しない。MySQLと似た構文でオプティマイザーヒントを使用することもできるが、利用可能なヒントと実装は異なる場合がある。

詳細は「クエリ実行計画を理解する」を参照してほしい。

組み込み関数

TiDBはMySQL組み込み関数の大部分をサポートするが、すべてではない。構文SHOW BUILTINSは利用可能な関数一覧を提供する。

参照: 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ではアサーションとしてのみ機能し、ALTERアルゴリズムを変更しない。詳細はALTER TABLEを参照してほしい。

  • CLUSTERED型の主キー追加/削除はサポートされない。CLUSTERED型の主キーについての詳細はクラスタ化インデックスを参照してほしい。

  • さまざまな種類のインデックス(HASH|BTREE|RTREE|FULLTEXT)はサポートされず、指定すると解析されて無視される。

  • テーブルパーティショニングはHASHRANGELISTパーティショニング型をサポートする。サポートされないパーティション型の場合、Warning: Unsupported partition type %s, treat as normal tableエラーが出力される場合があり、%sは特定のパーティション型である。

  • テーブルパーティショニングはADDDROPTRUNCATE作業もサポートする。その他のパーティション作業は無視される。次のテーブルパーティション構文はサポートされない。

    • PARTITION BY KEY
    • SUBPARTITION
    • {CHECK|TRUNCATE|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD|REORGANIZE|COALESCE} PARTITION
      詳細はパーティショニングを参照してほしい。

テーブル分析

統計収集はMySQL/InnoDBでは比較的軽量で短時間の作業である一方、TiDBではテーブル統計を完全に再構築し、完了までにはるかに長い時間がかかる場合がある。この点でTiDBとMySQLの動作は異なる。

これらの違いは、下記の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ビューは更新できない。INSERTUPDATEのような操作はサポートされず、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には適用されない。

デフォルトの違い

  • デフォルト文字セット:
    • TiDBのデフォルトはutf8mb4である。
    • MySQL 5.7のデフォルトはlatin1である。
    • MySQL 8.0のデフォルトはutf8mb4である。
  • デフォルト照合順序:
    • 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_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATE,NO_ZERO_DATEERROR_FOR_DIVISION_BY_ZERONO_AUTO_CREATE_USERNO_ENGINE_SUBSTITUTION
    • MySQLのデフォルトSQLモード:
      • MySQL 5.7のデフォルトSQLモードはTiDBと同じである。
      • MySQL 8.0のデフォルトSQLモードには次のモードが含まれる。
        ONLY_FULL_GROUP_BYSTRICT_TRANS_TABLESNO_ZERO_IN_DATE,NO_ZERO_DATEERROR_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では非推奨機能であり、代わりにアプリケーションで数値を埋めることが推奨される。