MySQL の互換性
TiDB は、 MySQL 5.7プロトコルおよびMySQL 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 の一般的な違いについて説明します。 Securityとペシミスティックトランザクションモードの互換性については、専用ページを参照してください。
TiDB Playgroundで TiDB の機能を試すことができます。
サポートされていない機能
- ストアド プロシージャと関数
- トリガー
- イベント
- ユーザー定義関数
FOREIGN KEY制約#18209FULLTEXT構文とインデックス#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サーバー上でインクリメンタルです。 ID を複数の TiDB サーバー間でインクリメンタルにしたい場合は、
AUTO_INCREMENTMySQL 互換モードを使用できます。ただし、ID は必ずしも順番に割り当てられるとは限りません。デフォルト値とカスタム値を混在させないことをお勧めします。そうしないと、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 で空の結果を返します。
クエリ実行計画
TiDB の Query Execution Plan ( EXPLAIN ) の出力形式、出力内容、 EXPLAIN FOR設定は、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 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) はサポートされておらず、指定すると解析されて無視されます。テーブル パーティショニングでは、
HASH、RANGE、およびLISTパーティショニング タイプがサポートされます。サポートされていないパーティション タイプの場合、Warning: Unsupported partition type %s, treat as normal tableエラーが出力される場合があります%sは特定のパーティション タイプです。テーブル パーティショニングは、
ADD、DROP、およびTRUNCATE操作もサポートします。他のパーティション操作は無視されます。次のテーブル パーティション構文はサポートされていません。PARTITION BY KEYPARTITION BY LINEAR KEYSUBPARTITION{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 のビューは更新できません。 UPDATE 、 INSERT 、 DELETEなどの書き込み操作はサポートしていません。
一時テーブル
詳細については、 TiDB ローカル一時テーブルと MySQL 一時テーブルの互換性を参照してください。
文字セットと照合
TiDB でサポートされている文字セットと照合順序の詳細については、 文字セットと照合の概要を参照してください。
GBK 文字セットの MySQL 互換性については、 GBK の互換性を参照してください。
TiDB は、テーブルで使用されている文字セットを国別文字セットとして継承します。
ストレージ エンジン
互換性の理由から、TiDB は代替storageエンジンを使用してテーブルを作成する構文をサポートしています。実装では、TiDB はメタデータを InnoDBstorageエンジンとして記述します。
TiDB は MySQL と同様のstorageエンジンの抽象化をサポートしていますが、TiDBサーバーを起動するときに--storeオプションを使用してstorageエンジンを指定する必要があります。
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 のデフォルト値は
utf8mb4です。 - MySQL 5.7のデフォルト値は
latin1です。 - MySQL 8.0 のデフォルト値は
utf8mb4です。
- TiDB のデフォルト値は
- デフォルトの照合順序:
- TiDB のデフォルトの照合順序
utf8mb4はutf8mb4_binです。 - MySQL 5.7のデフォルトの照合順序
utf8mb4はutf8mb4_general_ciです。 - MySQL 8.0 のデフォルトの照合順序
utf8mb4はutf8mb4_0900_ai_ciです。
- TiDB のデフォルトの照合順序
- デフォルト値
foreign_key_checks:- TiDB のデフォルト値は
OFFで、現在 TiDB はOFFのみをサポートしています。 - MySQL 5.7のデフォルト値は
ONです。
- 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で、現在 TiDB は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で、現在 TiDB はONのみをサポートしています。 - MySQL のデフォルト値:
- MySQL 5.7の場合:
OFF。 - MySQL 8.0 の場合:
ON.
- MySQL 5.7の場合:
- TiDB のデフォルト値は
日時
名前付きタイムゾーン
- 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 で非推奨としてマークされている次のような特定の機能を実装していません。