MySQLの互換性
TiDBは、MySQL5.7プロトコルおよびMySQL5.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制約#18209FULLTEXT構文とインデックス#1793SPATIAL(GISとも呼ばれGEOMETRY)関数、データ型、およびインデックス#6347ascii、binarylatin1utf8のutf8mb4gbk。- SYSスキーマ
- オプティマイザートレース
- XML関数
- Xプロトコル#1109
- セーブポイント#6840
- 列レベルの特権#9766
XA構文(TiDBは内部で2フェーズコミットを使用しますが、これはSQLインターフェイスを介して公開されません)CREATE TABLE tblName AS SELECT stmt構文#4754CHECK TABLE構文#4673CHECKSUM TABLE構文#1895REPAIR TABLE構文OPTIMIZE TABLE構文GET_LOCKおよびRELEASE_LOCK関数#14994LOAD DATAとREPLACEキーワード#24515HANDLERステートメントCREATE TABLESPACEステートメント
MySQLとは異なる機能
自動インクリメントID
TiDBでは、自動増分列はグローバルに一意です。これらは単一のTiDBサーバーではインクリメンタルですが、複数のTiDBサーバー間でインクリメンタルである必要はなく、順番に割り当てられる必要もありません。デフォルト値とカスタム値を混在させないことをお勧めします。そうしないと、
Duplicated Errorのエラーメッセージが表示される場合があります。tidb_allow_remove_auto_incシステム変数を使用して、AUTO_INCREMENT列属性の削除を許可または禁止できます。列属性を削除する構文は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属性は、実稼働環境でホットスポットを引き起こす可能性があります。詳細については、 HotSpotの問題のトラブルシューティングを参照してください。代わりにAUTO_RANDOMを使用することをお勧めします。
パフォーマンススキーマ
TiDBは、 プロメテウスとグラファナの組み合わせを使用して、パフォーマンス監視メトリックを格納および照会します。パフォーマンススキーマテーブルは、TiDBに空の結果を返します。
クエリ実行プラン
EXPLAIN FORのクエリ実行プラン( EXPLAIN )の出力形式、出力内容、および特権設定は、MySQLのものとは大きく異なります。
MySQLシステム変数optimizer_switchはTiDBでは読み取り専用であり、クエリプランには影響しません。 MySQLと同様の構文でオプティマイザーのヒントを使用することもできますが、使用可能なヒントと実装が異なる場合があります。
詳細については、 クエリ実行プランを理解するを参照してください。
内蔵機能
TiDBは、MySQLの組み込み関数のほとんどをサポートしていますが、すべてをサポートしているわけではありません。ステートメントSHOW BUILTINSは、使用可能な関数のリストを提供します。
参照: TiDBSQL文法 。
DDL
TiDBでは、サポートされているすべてのDDL変更はオンラインで実行されます。 MySQLのDDL操作と比較して、TiDBのDDL操作には次の主要な制限があります。
ALTER TABLEのステートメントで複数の操作を完了することはできません。たとえば、1つのステートメントに複数の列またはインデックスを追加することはできません。そうしないと、Unsupported multi schema changeエラーが出力される場合があります。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 KEYSUBPARTITION{CHECK|TRUNCATE|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD|REORGANIZE|COALESCE} PARTITION
詳細については、 パーティショニングを参照してください。
テーブルを分析する
統計収集は、MySQLとMySQLでの動作が異なります。これは、MySQL / InnoDBでの比較的軽量で短期間の操作ですが、TiDBでは、テーブルの統計を完全に再構築し、完了するまでにはるかに長い時間がかかる場合があります。
これらの違いについては、 ANALYZE TABLEで詳しく説明しています。
SELECT構文の制限
- 構文
SELECT ... INTO @variableはサポートされていません。 - 構文
SELECT ... GROUP BY ... WITH ROLLUPはサポートされていません。 - 構文
SELECT .. GROUP BY exprは、MySQL5.7のようにGROUP BY expr ORDER BY exprを意味しません。
詳細については、 SELECTステートメントのリファレンスを参照してください。
UPDATEステートメント
UPDATEステートメントのリファレンスを参照してください。
ビュー
TiDBのビューは更新できません。 UPDATEなどのINSERT操作はサポートしてDELETEません。
一時的なテーブル
詳細については、 TiDBローカル一時テーブルとMySQL一時テーブル間の互換性を参照してください。
文字セットと照合
TiDBでサポートされている文字セットと照合の詳細については、 文字セットと照合の概要を参照してください。
GBK文字セットのMySQL互換性については、 GBKの互換性を参照してください。
ストレージエンジン
互換性の理由から、TiDBは代替ストレージエンジンでテーブルを作成する構文をサポートしています。実装では、TiDBはメタデータをInnoDBストレージエンジンとして記述します。
TiDBはMySQLと同様のストレージエンジンの抽象化をサポートしていますが、TiDBサーバーを起動するときに--storeオプションを使用してストレージエンジンを指定する必要があります。
SQLモード
TiDBはほとんどのSQLモードをサポートします:
OracleやPostgreSQLなどの互換モードは解析されますが、無視されます。互換モードはMySQL5.7で非推奨になり、MySQL8.0で削除されました。ONLY_FULL_GROUP_BYモードには、MySQL5.7のマイナー意味の違いがあります。- MySQLの
NO_DIR_IN_CREATEおよびNO_ENGINE_SUBSTITUTIONモードは互換性のために受け入れられていますが、TiDBには適用されません。
デフォルトの違い
- デフォルトの文字セット:
- TiDBのデフォルト値は
utf8mb4です。 - MySQL5.7のデフォルト値は
latin1です。 - MySQL8.0のデフォルト値は
utf8mb4です。
- TiDBのデフォルト値は
- デフォルトの照合順序:
- TiDBのデフォルトの
utf8mb4の照合順序はutf8mb4_binです。 - MySQL5.7の
utf8mb4のデフォルトの照合順序はutf8mb4_general_ciです。 - MySQL8.0のデフォルトの
utf8mb4の照合順序はutf8mb4_0900_ai_ciです。
- TiDBのデフォルトの
- デフォルト値
foreign_key_checks:- TiDBのデフォルト値は
OFFで、現在TiDBはOFFのみをサポートしています。 - MySQL5.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モード:
- MySQL5.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 - Windowsの場合:
1 - macOSの場合:
2
- 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で非推奨としてマークされている特定の機能を実装していません。