MySQLとの互換性
TiDBはMySQLプロトコルと高い互換性を持ち、 MySQL 5.7およびMySQL 8.0の共通機能と構文に対応しています。MySQLのエコシステムツール(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver もっと)およびMySQLクライアントはTiDBで使用できます。
ただし、TiDBではMySQLの一部の機能はサポートされていません。これは、問題を解決するより良い方法(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 PlaygroundでTiDBの機能を試すことができます。
サポートされていない機能
ストアドプロシージャと関数
トリガー
イベント
ユーザー定義関数
FULLTEXT構文とインデックス #1793注記:
現在、特定の AWS リージョンのTiDB Cloud StarterおよびTiDB Cloud Essentialインスタンスのみが
FULLTEXT構文と索引インデックスをサポートしています。TiDB Self-Managed およびTiDB Cloud DedicatedはFULLTEXT構文の解析をサポートしていますが、FULLTEXTインデックスの使用はサポートしていません。SPATIAL(別名GIS/GEOMETRY)関数、データ型、およびインデックス #6347ascii、latin1、binary、utf8、utf8mb4、およびgbk。オプティマイザトレース
XML関数
Xプロトコル #1109
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
サブクエリ #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以降、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属性により、本番環境でホットスポットが発生する可能性があります。詳細についてはHotSpotの問題のトラブルシューティングを参照してください。代わりにAUTO_RANDOM使用することをお勧めします。
パフォーマンス図
TiDB はプロメテウスとグラファナグラファナの組み合わせを利用して、パフォーマンス監視メトリックの保存とクエリを実行します。 TiDB では、ほとんどの パフォーマンススキーマテーブル結果を返しません。
クエリ実行プラン
TiDB のクエリ実行プラン ( EXPLAIN / EXPLAIN FOR ) の出力形式、内容、および権限設定は、MySQL のものとは大きく異なります。
TiDBでは、MySQLシステム変数optimizer_switchは読み取り専用であり、クエリプランには影響を与えません。オプティマイザヒントはMySQLと同様の構文で使用できますが、使用可能なヒントとその実装は異なる場合があります。
詳細については、クエリ実行プランを理解するを参照してください。
組み込み関数
TiDBはMySQLの組み込み関数のほとんどをサポートしていますが、すべてではありません。使用可能な関数の一覧を取得するには、 SHOW BUILTINSステートメントを使用してください。
DDL操作
TiDBでは、サポートされているすべてのDDL変更をオンラインで実行できます。ただし、TiDBのDDL操作には、MySQLと比較していくつかの大きな制限があります。
単一の
ALTER TABLEステートメントを使用してテーブルの複数のスキーマ オブジェクト (列やインデックスなど) を変更する場合、同じオブジェクトを複数の変更で指定することはサポートされていません。たとえば、ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1コマンドを実行すると、Unsupported operate same column/indexエラーが出力されます。ALTER TABLE、TIFLASH REPLICAのように、単一のSHARD_ROW_ID_BITSステートメントを使用してAUTO_ID_CACHE。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パーティションタイプをサポートしています。サポートされていないパーティションタイプの場合、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 exprMySQL 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エンジン向けとなっています。
--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ではサポートされていません。
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()含む、MySQL REGEXP_SUBSTR() 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との違い参照してください。