MySQL の互換性
TiDB はMySQL 5.7プロトコルと高い互換性があり、 MySQL 5.7の共通機能と構文をサポートします。これは、MySQL クライアントだけでなく、PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/myloader などのエコシステム ツールを TiDB に使用できることを意味します。
ただし、MySQL の一部の機能は TiDB ではサポートされていません。これは、問題を解決するためのより良い方法 (XML関数の代わりに JSON を使用するなど) が存在するか、必要な労力に対して現在の需要が不足している (ストアド プロシージャや関数など) ことが考えられます。さらに、一部の機能は分散システムで実装するのが難しい場合があります。
TiDB は MySQL レプリケーション プロトコルをサポートしていないことに注意することが重要です。代わりに、MySQL でデータを複製するための特定のツールが提供されています。
- MySQL からのデータの複製: TiDB データ移行 (DM)は、MySQL または MariaDB から TiDB への完全なデータ移行および増分データ複製をサポートするツールです。
- MySQL へのデータの複製: TiCDC TiKV 変更ログをプルすることで TiDB の増分データを複製するためのツールです。 TiCDC はMySQLシンク使用して、TiDB の増分データを MySQL にレプリケートします。
ノート:
このページでは、MySQL と TiDB の一般的な違いについて説明します。セキュリティおよび悲観的トランザクション モードの分野における MySQL との互換性の詳細については、 Securityおよび悲観的トランザクションモードの専用ページを参照してください。
TiDB プレイグラウンドで TiDB 機能を試すことができます。
サポートされていない機能
- ストアド プロシージャと関数
- トリガー
- イベント
- ユーザー定義関数
FULLTEXT構文とインデックス#1793SPATIAL(GIS/GEOMETRYとも呼ばれる)関数、データ型、インデックス#6347ascii、latin1、binary、utf8、utf8mb4、およびgbk以外の文字セット。- SYSスキーマ
- オプティマイザートレース
- XML関数
- Xプロトコル#1109
- 列レベルの権限#9766
XA構文 (TiDB は内部的に 2 フェーズ コミットを使用しますが、これは SQL インターフェイス経由では公開されません)CREATE TABLE tblName AS SELECT stmt構文#4754CHECK TABLE構文#4673CHECKSUM TABLE構文#1895REPAIR TABLEの構文OPTIMIZE TABLEの構文HANDLERステートメントCREATE TABLESPACEステートメント- 「セッション トラッカー: GTID コンテキストを OK パケットに追加」
MySQLとの違い
自動インクリメントID
TiDB では、自動増分列値 (ID) はグローバルに一意であり、単一の TiDBサーバー内で増分されます。複数の TiDB サーバー間で ID を増分するには、
AUTO_INCREMENTMySQL 互換モードを使用できます。ただし、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 操作にはいくつかの大きな制限があります。
単一の
ALTER TABLEステートメントを使用してテーブルの複数のスキーマ オブジェクト (列やインデックスなど) を変更する場合、複数の変更で同じオブジェクトを指定することはサポートされていません。たとえば、ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1コマンドを実行すると、Unsupported operate same column/indexエラーが出力されます。TIFLASH REPLICA、SHARD_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) はサポートされていないため、指定しても解析され無視されます。TiDB は、
HASH、RANGE、LIST、およびKEYパーティション化タイプをサポートします。現在、KEYパーティション タイプは、空のパーティション列リストを含むパーティション ステートメントをサポートしていません。サポートされていないパーティション タイプの場合、TiDB はWarning: Unsupported partition type %s, treat as normal tableを返します。ここで%s、サポートされていない特定のパーティション タイプです。Range、Range COLUMNS、List、および List COLUMNS パーティション テーブルは、
ADD、DROP、TRUNCATE、およびREORGANIZE操作をサポートします。他のパーティション操作は無視されます。ハッシュおよびキー パーティション テーブルは、
ADD、COALESCE、およびTRUNCATE操作をサポートします。他のパーティション操作は無視されます。次の構文はパーティション テーブルではサポートされていません。
SUBPARTITION{CHECK|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD} PARTITION
パーティショニングの詳細については、 パーティショニングを参照してください。
テーブルの分析
TiDB では、 統計収集テーブルの統計を完全に再構築するため、リソースを大量に消費し、完了までに時間がかかる操作となる点で MySQL とは異なります。対照的に、MySQL/InnoDB は比較的軽量で存続期間の短い操作を実行します。
詳細については、 ANALYZE TABLEを参照してください。
SELECT構文の制限事項
TiDB は次のSELECT構文をサポートしていません。
SELECT ... INTO @variableSELECT ... GROUP BY ... WITH ROLLUP- MySQL 5.7のように
SELECT .. GROUP BY exprGROUP BY expr ORDER BY exprを意味しません。
詳細については、 SELECTステートメントのリファレンスを参照してください。
UPDATEステートメント
UPDATEステートメントのリファレンスを参照してください。
ビュー
TiDB のビューは更新できず、 UPDATE 、 INSERT 、 DELETEなどの書き込み操作をサポートしません。
一時テーブル
詳細については、 TiDB ローカル一時テーブルと MySQL 一時テーブル間の互換性を参照してください。
文字セットと照合順序
TiDB でサポートされる文字セットと照合順序については、 文字セットと照合順序の概要を参照してください。
GBK 文字セットの MySQL 互換性については、 GBKの互換性を参照してください。
TiDB は、テーブルで使用されている文字セットを各国語文字セットとして継承します。
ストレージエンジン
TiDB を使用すると、代替storageエンジンを使用してテーブルを作成できます。それにもかかわらず、TiDB によって説明されているメタデータは、互換性を確保する方法として InnoDBstorageエンジン用です。
--storeオプションを使用してstorageエンジンを指定するには、TiDBサーバーを起動する必要があります。このstorageエンジンの抽象化機能は MySQL に似ています。
SQLモード
TiDB はほとんどのSQLモードをサポートします:
OracleやPostgreSQLなどの互換モードは解析されますが、無視されます。互換モードはMySQL 5.7で非推奨となり、MySQL 8.0 では削除されました。ONLY_FULL_GROUP_BYモードにはMySQL 5.7のマイナー意味上の違いがあります。- MySQL の
NO_DIR_IN_CREATEおよびNO_ENGINE_SUBSTITUTIONSQL モードは互換性のために受け入れられていますが、TiDB には適用できません。
デフォルトの違い
TiDB は、 MySQL 5.7および MySQL 8.0 と比較するとデフォルトの違いがあります。
- デフォルトの文字セット:
- TiDB のデフォルト値は
utf8mb4です。 - MySQL 5.7のデフォルト値は
latin1です。 - MySQL 8.0 のデフォルト値は
utf8mb4です。
- TiDB のデフォルト値は
- デフォルトの照合順序:
- TiDB のデフォルトの照合順序は
utf8mb4_binです。 - MySQL 5.7のデフォルトの照合順序は
utf8mb4_general_ciです。 - MySQL 8.0 のデフォルトの照合順序は
utf8mb4_0900_ai_ciです。
- 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 モードは 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のモードが含まれます。
- TiDB のデフォルト SQL モードには
- デフォルト値
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 は検索時にそれらを小文字に変換することを意味します。名前の比較では大文字と小文字は区別されません。
- Linux の場合:
- TiDB のデフォルト値は
- デフォルト値
explicit_defaults_for_timestamp:- TiDB のデフォルト値は
ONで、現在サポートされているのはONのみです。 - MySQL のデフォルトは次の値です。
- MySQL 5.7の場合:
OFF。 - MySQL 8.0 の場合:
ON.
- MySQL 5.7の場合:
- TiDB のデフォルト値は
日時
TiDB は、次の点を考慮して名前付きタイムゾーンをサポートします。
- TiDB は、計算のためにシステムに現在インストールされているすべてのタイムゾーン ルール (通常は
tzdataパッケージ) を使用します。これにより、タイムゾーン テーブル データをインポートすることなく、すべてのタイムゾーン名を使用できるようになります。タイムゾーン テーブル データをインポートしても、計算ルールは変更されません。 - 現在、MySQL はデフォルトでローカル タイムゾーンを使用し、システムに組み込まれている現在のタイムゾーン ルール (夏時間の開始時など) に基づいて計算します。 タイムゾーン テーブル データのインポートを指定しないと、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 廃止されるではこの機能が使用されるため、代わりにアプリケーションで数値を埋め込むことをお勧めします。
CREATE RESOURCE GROUP 、 DROP RESOURCE GROUP 、およびALTER RESOURCE GROUPステートメント
リソース グループを作成、変更、削除するための次のステートメントには、MySQL とは異なるサポートされるパラメーターがあります。詳細については、次のドキュメントを参照してください。