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へのデータ複製: TiCDC TiKVの変更ログを取得してTiDBの増分データを複製するツールです。TiCDCはMySQLシンク使用して、TiDBの増分データをMySQLに複製します。
注記:
このページでは、MySQLとTiDBの一般的な違いについて説明します。セキュリティ分野におけるMySQLとの互換性の詳細については、 MySQLとのSecurity互換性参照してください。
TiDB プレイグラウンドで TiDB の機能を試すことができます。
サポートされていない機能
ストアドプロシージャと関数
トリガー
イベント
ユーザー定義関数
FULLTEXT構文とインデックス#1793注記:
現在、特定の AWS リージョンの {{{ .starter }} および {{{ .essential }}} クラスターのみが
FULLTEXT構文とインデックスサポートしています。TiDB Self-Managed およびTiDB Cloud Dedicated はFULLTEXT構文の解析をサポートしていますが、FULLTEXTインデックスの使用はサポートしていません。SPATIAL(GIS/GEOMETRYとも呼ばれる)関数、データ型、インデックス#6347ascii、latin1、binary、utf8、utf8mb4、gbk以外の文字セット。オプティマイザートレース
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ステートメント「セッション トラッカー: OK パケットに GTID コンテキストを追加する」
降順インデックス#2519
SKIP LOCKED構文#18207横方向導出表#40328
JOIN ON サブクエリ#11414
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以降ではこの制限がなくなり、より柔軟なテーブル主キー定義が可能になります#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を使用します。
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などの複数の TiDB 固有のスキーマ オブジェクトを単一のALTER TABLEステートメントを使用して変更することはサポートされていません。TiDBは、
ALTER TABLE使用した一部のデータ型の変更をサポートしていません。例えば、DECIMAL型からDATE型への変更はサポートしていません。データ型の変更がサポートされていない場合、TiDBはUnsupported modify column: type %d not match origin %dエラーを報告します。詳細はALTER TABLEを参照してください。ALGORITHM={INSTANT,INPLACE,COPY}構文はTiDBにおけるアサーションとしてのみ関数し、ALTERアルゴリズムを変更するものではありません。詳細はALTER TABLE参照してください。CLUSTERED型の主キーの追加/削除はサポートされていません。3 型の主キーの詳細については、CLUSTEREDクラスター化インデックス参照してください。異なるタイプのインデックス(
HASH|BTREE|RTREE|FULLTEXT)はサポートされておらず、指定された場合は解析されて無視されます。TiDBは、
HASH、RANGE、LIST、KEYのパーティションタイプをサポートしています。サポートされていないパーティションタイプの場合、TiDBはWarning: Unsupported partition type %s, treat as normal table返します。ここで、%sサポートされていないパーティションタイプを示します。範囲、範囲列、リスト、およびリスト列でパーティション化されたテーブルは
ADDDROP、およびREORGANIZETRUNCATEをサポートします。その他のパーティション演算は無視されます。ハッシュおよびキーパーティションテーブルは、
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 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 の 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 のデフォルト値は
- デフォルトの照合順序:
- 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はデフォルトでローカルタイムゾーンを使用し、その後、システムに組み込まれている現在のタイムゾーンルール(例えば、サマータイムの開始時期など)に基づいて計算を行います。1 タイムゾーンテーブルデータのインポート指定しないと、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()を含む、TiDB 正規表現と MySQL の互換性については、 MySQLとの正規表現の互換性参照してください。
非推奨の機能による非互換性
TiDB は、MySQL で非推奨となった次のような特定の機能を実装していません。
- 浮動小数点型の精度を指定します。MySQL 8.0 非推奨この機能はサポートされておらず、代わりに
DECIMAL型を使用することをお勧めします。 ZEROFILL属性。MySQL 8.0 非推奨この機能がサポートされておらず、代わりにアプリケーションで数値を埋め込むことが推奨されます。
CREATE RESOURCE GROUP 、 DROP RESOURCE GROUP 、およびALTER RESOURCE GROUPステートメント
リソースグループの作成、変更、削除を行う以下のステートメントは、MySQLとは異なるパラメータをサポートしています。詳細については、以下のドキュメントをご覧ください。
MySQL InnoDB の悲観的トランザクション(ロック)の違い
TiDB と MySQL InnoDB の悲観的トランザクション (ロック) の違いについては、 MySQL InnoDBとの違い参照してください。