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
、binary
latin1
utf8
のutf8mb4
gbk
。- 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 KEY
SUBPARTITION
{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で非推奨としてマークされている特定の機能を実装していません。