MySQL 互換性

TiDB は、MySQL プロトコル、およびMySQL 5.7と MySQL 8.0 の共通機能と構文と高い互換性があります。MySQL のエコシステム ツール (PHPMyAdmin、Navicat、MySQL Workbench、DBeaver、 もっと ) と MySQL クライアントを TiDB に使用できます。

ただし、MySQL の一部の機能は TiDB ではサポートされていません。これは、問題を解決するよりよい方法が存在する (XML関数の代わりに JSON を使用するなど) か、必要な労力に対して現在の需要が不足している (ストアド プロシージャや関数など) ことが原因である可能性があります。さらに、一部の機能は分散システムで実装するのが難しい場合があります。

TiDB は MySQL レプリケーション プロトコルをサポートしていないことに注意してください。代わりに、MySQL でデータをレプリケートするための特別なツールが提供されています。

  • MySQL からデータを複製: TiDB データ移行 (DM) 、MySQL または MariaDB から TiDB への完全なデータ移行と増分データ複製をサポートするツールです。
  • MySQL にデータを複製: ティCDC 、TiKV 変更ログを取得して TiDB の増分データを複製するツールです。TiCDC はMySQLシンクを使用して TiDB の増分データを MySQL に複製します。

注記:

このページでは、MySQL と TiDB の一般的な違いについて説明します。セキュリティと悲観的トランザクション モードの領域における MySQL との互換性の詳細については、 Security悲観的トランザクションモードの専用ページを参照してください。

TiDB プレイグラウンドで TiDB の機能を試すことができます。

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

  • ストアドプロシージャと関数
  • トリガー
  • イベント
  • ユーザー定義関数
  • FULLTEXT構文とインデックス#1793
  • SPATIAL ( GISともGEOMETRYれる)関数、データ型、インデックス#6347
  • asciilatin1binaryutf8utf8mb4gbk以外の文字セット。
  • 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ステートメント
  • 「セッション トラッカー: OK パケットに GTID コンテキストを追加する」
  • 降順インデックス#2519
  • SKIP LOCKED構文#18207
  • 横方向導出表#40328

MySQLとの違い

自動増分ID

  • TiDB では、自動増分列の値 (ID) は、単一の TiDBサーバー内でグローバルに一意かつ増分されます。複数の TiDB サーバー間で ID を増分するには、 AUTO_INCREMENT MySQL 互換モード使用できます。ただし、ID は必ずしも順番に割り当てられるわけではないため、 Duplicated Errorメッセージが発生しないように、既定値とカスタム値を混在させないようにすることをお勧めします。

  • tidb_allow_remove_auto_incシステム変数を使用して、 AUTO_INCREMENT列属性の削除を許可または禁止できます。列属性を削除するには、 ALTER TABLE MODIFYまたはALTER TABLE CHANGE構文を使用します。

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

  • TiDB v6.6.0 およびそれ以前のバージョンでは、TiDB の自動増分列は MySQL InnoDB と同じように動作し、主キーまたはインデックス プレフィックスである必要があります。v7.0.0 以降では、TiDB はこの制限をなくし、より柔軟なテーブル主キー定義を可能にしています#40580

詳細については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, 1 rows affected (0.00 sec) mysql> INSERT INTO t VALUES(); Query OK, 1 rows affected (0.00 sec) mysql> INSERT INTO t VALUES(); Query OK, 1 rows affected (0.00 sec) mysql> SELECT _tidb_rowid, id FROM t; +-------------+------+ | _tidb_rowid | id | +-------------+------+ | 2 | 1 | | 4 | 3 | | 6 | 5 | +-------------+------+ 3 rows in set (0.01 sec)

ご覧のとおり、共有アロケータがあるため、 id​​毎回 2 ずつ増加します。この動作はMySQL互換モードでは変わり、共有アロケータがないため、数字のスキップは行われません。

注記:

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

パフォーマンス スキーマ

TiDB は、パフォーマンス監視メトリックの保存とクエリにプロメテウスとグラファナの組み合わせを利用します。TiDB では、パフォーマンス スキーマ テーブルは結果を返しません。

クエリ実行プラン

TiDB のクエリ実行プラン ( EXPLAIN ) の出力形式、内容、権限設定はEXPLAIN FOR MySQL のものと大きく異なります。

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

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

組み込み関数

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

詳細については、 TiDB SQL文法を参照してください。

DDL操作

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

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

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

  • TiDB は、 HASHRANGELIST 、およびKEYパーティション タイプをサポートしています。現在、 KEYパーティション タイプは、空のパーティション列リストを持つパーティション ステートメントをサポートしていません。サポートされていないパーティション タイプの場合、TiDB はWarning: Unsupported partition type %s, treat as normal tableを返します。ここで、 %sサポートされていない特定のパーティション タイプです。

  • 範囲、範囲列、リスト、およびリスト列でパーティション化されたテーブルは、 ADDDROPTRUNCATE 、およびREORGANIZE操作をサポートします。その他のパーティション操作は無視されます。

  • ハッシュおよびキー パーティション テーブルは、 ADDCOALESCE 、およびTRUNCATE操作をサポートします。その他のパーティション操作は無視されます。

  • パーティション テーブルでは次の構文はサポートされていません。

    • SUBPARTITION
    • {CHECK|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD} PARTITION

    パーティショニングの詳細については、 パーティショニング参照してください。

表の分析

TiDB では、テーブルの統計情報を完全に再構築する点で MySQL と統計収集異なり、より多くのリソースを消費する操作となり、完了までに時間がかかります。対照的に、MySQL/InnoDB は比較的軽量で短時間の操作を実行します。

詳細についてはANALYZE TABLEを参照してください。

SELECT構文の制限

TiDB は次のSELECT構文をサポートしていません。

  • SELECT ... INTO @variable
  • MySQL 5.7の場合のように、 SELECT .. GROUP BY expr GROUP BY expr ORDER BY expr意味するわけではありません。

詳細については、 SELECTステートメントのリファレンスを参照してください。

UPDATEステートメント

UPDATEステートメント参照を参照してください。

ビュー

TiDB のビューは更新できず、 UPDATEINSERTDELETEなどの書き込み操作はサポートされません。

一時テーブル

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

文字セットと照合順序

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

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

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

ストレージエンジン

TiDB では、代替storageエンジンを使用してテーブルを作成できます。ただし、互換性を確保するために、TiDB によって記述されるメタデータは InnoDBstorageエンジン用です。

--storeオプションを使用してstorageエンジンを指定するには、TiDBサーバーを起動する必要があります。このstorageエンジンの抽象化機能は、MySQL に似ています。

SQL モード

TiDB は、次のほとんどのSQL モードサポートします。

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

デフォルトの違い

TiDB は、MySQL 5.7および MySQL 8.0 と比較するとデフォルトで違いがあります。

  • デフォルトの文字セット:
    • TiDB のデフォルト値はutf8mb4です。
    • MySQL 5.7のデフォルト値はlatin1です。
    • MySQL 8.0 のデフォルト値はutf8mb4です。
  • デフォルトの照合順序:
    • TiDB のデフォルトの照合順序はutf8mb4_binです。
    • MySQL 5.7のデフォルトの照合順序はutf8mb4_general_ciです。
    • MySQL 8.0 のデフォルトの照合順序はutf8mb4_0900_ai_ciです。
  • デフォルトの 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で、現在は2のみがサポートされています。
    • MySQL のデフォルトは次の値です。
      • Linux の場合: 0 。テーブル名とデータベース名は、 CREATE TABLEまたはCREATE DATABASEステートメントで指定された大文字と小文字に従ってディスクに保存されます。名前の比較では大文字と小文字が区別されます。
      • Windows の場合: 1 。これは、テーブル名がディスク上に小文字で保存され、名前の比較で大文字と小文字が区別されないことを意味します。MySQL は、storage時および検索時にすべてのテーブル名を小文字に変換します。この動作は、データベース名とテーブル エイリアスにも適用されます。
      • macOS の場合: 2 。テーブル名とデータベース名は、 CREATE TABLEまたはCREATE DATABASEステートメントで指定された大文字と小文字に従ってディスクに保存されますが、MySQL は検索時にそれらを小文字に変換します。名前の比較では大文字と小文字は区別されません。
  • デフォルト値はexplicit_defaults_for_timestampです:
    • TiDB のデフォルト値はONで、現在はONのみがサポートされています。
    • MySQL のデフォルトは次の値です。
      • MySQL 5.7の場合: OFF .
      • MySQL 8.0 の場合: ON .

日時

TiDB は、次の点を考慮して名前付きタイムゾーンをサポートします。

  • TiDB は、計算のために現在システムにインストールされているすべてのタイムゾーン ルール (通常はtzdataパッケージ) を使用します。これにより、タイムゾーン テーブル データをインポートしなくても、すべてのタイムゾーン名を使用できます。タイムゾーン テーブル データをインポートしても、計算ルールは変更されません。
  • 現在、MySQL はデフォルトでローカル タイムゾーンを使用し、計算にはシステムに組み込まれている現在のタイムゾーン ルール (たとえば、夏時間の開始時) に依存します。 タイムゾーンテーブルデータのインポートないと、MySQL はタイムゾーンを名前で指定できません。

型システムの違い

次の列タイプは MySQL ではサポートされていますが、TiDB ではサポートされていません

  • SQL_TSI_* (SQL_TSI_MONTH、SQL_TSI_WEEK、SQL_TSI_DAY、SQL_TSI_HOUR、SQL_TSI_MINUTE、および SQL_TSI_SECOND が含まれますが、SQL_TSI_YEAR は含まれません)

正規表現

REGEXP_INSTR()REGEXP_LIKE()REGEXP_REPLACE()REGEXP_SUBSTR()を含む、MySQL との TiDB 正規表現の互換性については、 MySQL との正規表現の互換性を参照してください。

非推奨の機能による非互換性

TiDB は、MySQL で非推奨となった次のような特定の機能を実装していません。

  • 浮動小数点型の精度を指定します。MySQL 8.0 非推奨この機能がサポートされておらず、代わりにDECIMAL型を使用することをお勧めします。
  • ZEROFILL属性。MySQL 8.0 非推奨ではこの機能がサポートされておらず、代わりにアプリケーションで数値を埋め込むことが推奨されます。

CREATE RESOURCE GROUPDROP RESOURCE GROUP 、およびALTER RESOURCE GROUPステートメント

リソース グループを作成、変更、および削除するための次のステートメントでは、MySQL とは異なるパラメータがサポートされています。詳細については、次のドキュメントを参照してください。

このページは役に立ちましたか?