MySQL の互換性

TiDB は、 MySQL 5.7プロトコルおよびMySQL 5.7 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 変更ログをプルして、TiDB の増分データをレプリケートするためのツールです。 TiCDC はMySQL シンクを使用して、TiDB の増分データを MySQL に複製します。

ノート:

このページでは、MySQL と TiDB の一般的な違いについて説明します。 安全ペシミスティック トランザクション モードの互換性については、専用ページを参照してください。

サポートされていない機能

  • ストアド プロシージャと関数
  • トリガー
  • イベント
  • ユーザー定義関数
  • FOREIGN KEY制約#18209
  • FULLTEXT構文とインデックス#1793
  • SPATIAL (別名GIS / GEOMETRY )関数、データ型、およびインデックス#6347
  • asciilatin1binaryutf8utf8mb4 、およびgbk以外の文字セット。
  • SYSスキーマ
  • オプティマイザ トレース
  • XML 関数
  • X-プロトコル#1109
  • 列レベルの権限#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列属性の削除を許可または禁止できます。 column 属性を削除する構文はALTER TABLE MODIFYまたはALTER TABLE CHANGEです。

  • TiDB はAUTO_INCREMENT列属性の追加をサポートしておらず、この属性は削除すると復元できません。

  • 詳細については、 AUTO_INCREMENTを参照してください。

ノート:

  • テーブルの作成時に主キーを指定しなかった場合、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)

ノート:

AUTO_INCREMENT属性は、実稼働環境でホットスポットを引き起こす可能性があります。詳細はホットスポットの問題のトラブルシューティングを参照してください。代わりにAUTO_RANDOMを使用することをお勧めします。

パフォーマンススキーマ

TiDB はプロメテウスとグラファナの組み合わせを使用して、パフォーマンス監視メトリックを格納およびクエリします。パフォーマンス スキーマ テーブルは、TiDB で空の結果を返します。

クエリ実行プラン

EXPLAIN FORの Query Execution Plan ( EXPLAIN ) の出力形式、出力内容、権限設定は、MySQL と大きく異なります。

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

詳細については、 クエリ実行計画を理解するを参照してください。

組み込み関数

TiDB は MySQL 組み込み関数のほとんどをサポートしていますが、すべてではありません。ステートメントSHOW BUILTINSは、使用可能な関数のリストを提供します。

参照: TiDB SQL文法 .

DDL

TiDB では、サポートされているすべての DDL 変更がオンラインで実行されます。 MySQL での DDL 操作と比較して、TiDB での DDL 操作には次の主な制限があります。

  • 単一のALTER TABLEステートメントを使用してテーブルの複数のスキーマ オブジェクト (列やインデックスなど) を変更する場合、複数の変更で同じオブジェクトを指定することはサポートされていません。たとえば、 ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1コマンドを実行すると、 Unsupported operate same column/indexエラーが出力されます。

  • TIFLASH REPLICASHARD_ROW_ID_BITS 、およびAUTO_ID_CACHEなど、単一のALTER TABLEステートメントを使用して複数の TiDB 固有のスキーマ オブジェクトを変更することはサポートされていません。

  • 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 ) はサポートされておらず、指定すると解析されて無視されます。

  • テーブル パーティショニングでは、 HASHRANGE 、およびLISTのパーティショニング タイプがサポートされます。サポートされていないパーティション タイプの場合、 Warning: Unsupported partition type %s, treat as normal tableエラーが出力される場合があります%sは特定のパーティション タイプです。

  • テーブル パーティショニングは、 ADDDROP 、および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ステートメント

UPDATE文のリファレンスを参照してください。

ビュー

TiDB のビューは更新できません。 UPDATEINSERTDELETEなどの書き込み操作はサポートしていません。

一時テーブル

詳細については、 TiDB ローカル一時テーブルと MySQL 一時テーブルの互換性を参照してください。

文字セットと照合

  • TiDB でサポートされている文字セットと照合順序の詳細については、 文字セットと照合の概要を参照してください。

  • GBK 文字セットの MySQL 互換性については、 GBK の互換性を参照してください。

  • TiDB は、テーブルで使用されている文字セットを国別文字セットとして継承します。

ストレージ エンジン

互換性の理由から、TiDB は代替ストレージ エンジンを使用してテーブルを作成する構文をサポートしています。実装では、TiDB はメタデータを InnoDB ストレージ エンジンとして記述します。

TiDB は MySQL と同様のストレージ エンジンの抽象化をサポートしていますが、TiDBサーバーを起動するときに--storeオプションを使用してストレージ エンジンを指定する必要があります。

SQL モード

TiDB はほとんどのSQL モードをサポートしています:

  • OraclePostgreSQLなどの互換モードは解析されますが、無視されます。互換モードはMySQL 5.7で廃止され、MySQL 8.0 で削除されました。
  • ONLY_FULL_GROUP_BYモードには、 MySQL 5.7からのマイナー意味の違いがあります。
  • MySQL のNO_DIR_IN_CREATEおよびNO_ENGINE_SUBSTITUTION SQL モードは互換性のために受け入れられますが、TiDB には適用されません。

デフォルトの違い

  • デフォルトの文字セット:
    • TiDB のデフォルト値はutf8mb4です。
    • MySQL 5.7のデフォルト値はlatin1です。
    • MySQL 8.0 のデフォルト値はutf8mb4です。
  • デフォルトの照合順序:
    • TiDB のデフォルトの照合順序utf8mb4utf8mb4_binです。
    • MySQL 5.7のデフォルトの照合順序utf8mb4utf8mb4_general_ciです。
    • MySQL 8.0 のデフォルトの照合順序utf8mb4utf8mb4_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 モードは TiDB と同じです。
      • 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 はデフォルトでローカル タイム ゾーンを使用し、システムに組み込まれている現在のタイム ゾーン規則 (夏時間の開始時期など) に基づいて計算します。また、タイム ゾーンは、タイム ゾーン名でタイム ゾーン テーブル データのインポートなしで指定することはできません。

型システムの違い

次の列タイプは 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 廃止するにはこの機能があり、代わりにアプリケーションで数値をパディングすることをお勧めします。