MySQLの互換性
TiDBは、MySQLプロトコル、およびMySQL 5.7とMySQL 8.0の共通機能と構文と高い互換性があります。MySQLエコシステムツール(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver、 もっと )とMySQLクライアントはTiDBでも使用できます。
ただし、MySQLの一部の機能はTiDBではサポートされていません。これは、問題を解決するより優れた方法(XML関数の代わりにJSONを使用するなど)が存在するため、または必要な労力に対して需要が不足しているため(ストアドプロシージャや関数など)である可能性があります。さらに、一部の機能は分散システムへの実装が難しい場合があります。
TiDB プレイグラウンドで TiDB の機能を試すことができます。
サポートされていない機能
- ストアドプロシージャと関数
- トリガー
- イベント
- ユーザー定義関数
FULLTEXT
構文とインデックス#1793SPATIAL
(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_INCREMENT
MySQL互換モード使用します。ただし、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 ずつ増加します。3 MySQL互換モードこの動作は変わり、共有アロケータがないため、数値のスキップは発生しません。
注記:
AUTO_INCREMENT
属性は本番環境でホットスポットを引き起こす可能性があります。詳細はホットスポットの問題のトラブルシューティング参照してください。代わりにAUTO_RANDOM
使用することをお勧めします。
パフォーマンススキーマ
TiDB Cloudのパフォーマンス メトリックを確認するには、 TiDB Cloudコンソールのクラスター概要ページを確認するか、 サードパーティの監視統合使用します。ほとんどの場合、 パフォーマンススキーマテーブル 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
など、単一のALTER TABLE
ステートメントを使用して複数の TiDB 固有のスキーマ オブジェクトを変更することはサポートされていません。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
型CLUSTERED
主キーの追加/削除はサポートされていません。3 型の主キーの詳細については、 クラスター化インデックスを参照してください。異なるタイプのインデックス (
HASH|BTREE|RTREE|FULLTEXT
) はサポートされておらず、指定された場合は解析されて無視されます。TiDB
LIST
HASH
RANGE
タイプKEY
サポートしています。サポートされていないパーティションタイプの場合、TiDBはWarning: Unsupported partition type %s, treat as normal table
返します。11%s
サポートされていないパーティションタイプを表します。範囲、範囲列、リスト、およびリスト列でパーティション化されたテーブルは
ADD
DROP
、およびREORGANIZE
TRUNCATE
をサポートします。その他のパーティション演算は無視されます。ハッシュおよびキーパーティションテーブルは、
ADD
COALESCE
演算をサポート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 expr
GROUP BY expr ORDER BY expr
意味するわけではありません。
詳細については、 SELECT
ステートメントのリファレンスを参照してください。
UPDATE
ステートメント
UPDATE
文の参照を参照してください。
ビュー
TiDB 内のビューは更新できず、 UPDATE
、 INSERT
、 DELETE
などの書き込み操作はサポートされません。
一時テーブル
詳細についてはTiDB のローカル一時テーブルと MySQL の一時テーブル間の互換性参照してください。
文字セットと照合順序
TiDB でサポートされている文字セットと照合順序の詳細については、 文字セットと照合の概要参照してください。
GBK 文字セットの MySQL 互換性については、 GBK互換性を参照してください。
TiDB は、テーブルで使用される文字セットを国別文字セットとして継承します。
ストレージエンジン
TiDBでは、他のstorageエンジンを使用してテーブルを作成することができます。ただし、TiDBで記述されるメタデータは、互換性を確保するためにInnoDBstorageエンジン用です。
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()
を含む、MySQL との TiDB 正規表現の互換性については、 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との違い参照してください。