重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

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制約#18209
  • FULLTEXT構文とインデックス#1793
  • SPATIALGISとも呼ばれGEOMETRY )関数、データ型、およびインデックス#6347
  • asciibinary latin1 utf8utf8mb4 gbk
  • SYSスキーマ
  • オプティマイザートレース
  • XML関数
  • Xプロトコル#1109
  • セーブポイント#6840
  • 列レベルの特権#9766
  • XA構文(TiDBは内部で2フェーズコミットを使用しますが、これはSQLインターフェイスを介して公開されません)
  • CREATE TABLE tblName AS SELECT stmt構文#4754
  • CHECK TABLE構文#4673
  • CHECKSUM TABLE構文#1895
  • REPAIR TABLE構文
  • OPTIMIZE TABLE構文
  • HANDLERステートメント
  • 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)

パフォーマンススキーマ

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は代替ストレージエンジンでテーブルを作成する構文をサポートしています。実装では、TiDBはメタデータをInnoDBストレージエンジンとして記述します。

TiDBはMySQLと同様のストレージエンジンの抽象化をサポートしていますが、TiDBサーバーを起動するときに--storeオプションを使用してストレージエンジンを指定する必要があります。

SQLモード

TiDBはほとんどのSQLモードをサポートします:

  • OraclePostgreSQLなどの互換モードは解析されますが、無視されます。互換モードは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のデフォルトのutf8mb4の照合順序はutf8mb4_binです。
    • MySQL5.7のutf8mb4のデフォルトの照合順序はutf8mb4_general_ciです。
    • MySQL8.0のデフォルトのutf8mb4の照合順序はutf8mb4_0900_ai_ciです。
  • デフォルト値foreign_key_checks
    • TiDBのデフォルト値はOFFで、現在TiDBはOFFのみをサポートしています。
    • MySQL5.7のデフォルト値はONです。
  • デフォルトの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
  • デフォルト値lower_case_table_names
    • TiDBのデフォルト値は2で、現在TiDBは2のみをサポートしています。
    • MySQLのデフォルト値:
      • Linuxの場合: 0
      • Windowsの場合: 1
      • macOSの場合: 2
  • デフォルト値explicit_defaults_for_timestamp
    • TiDBのデフォルト値はONで、現在TiDBはONのみをサポートしています。
    • MySQLのデフォルト値:
      • MySQL 5.7の場合: OFF
      • MySQL 8.0の場合: ON

日時

名前付きタイムゾーン

  • 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で非推奨としてマークされている特定の機能を実装していません。

  • 浮動小数点型の精度を指定します。 MySQL 8.0 非推奨この機能であり、代わりにDECIMALタイプを使用することをお勧めします。
  • ZEROFILL属性。 MySQL 8.0 非推奨この機能。代わりに、アプリケーションに数値を埋め込むことをお勧めします。