📣

TiDB Cloud Serverless が
Starter
に変わりました!このページは自動翻訳されたものです。
原文はこちらからご覧ください。

MySQLの互換性

TiDBは、MySQLプロトコル、およびMySQL 5.7とMySQL 8.0の共通機能と構文と高い互換性があります。MySQLエコシステムツール(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver、 もっと )とMySQLクライアントはTiDBでも使用できます。

ただし、MySQLの一部の機能はTiDBではサポートされていません。これは、問題を解決するより優れた方法(XML関数の代わりにJSONを使用するなど)が存在するため、または必要な労力に対して需要が不足しているため(ストアドプロシージャや関数など)である可能性があります。さらに、一部の機能は分散システムへの実装が難しい場合があります。

TiDB プレイグラウンドで TiDB の機能を試すことができます。

サポートされていない機能

  • ストアドプロシージャと関数
  • トリガー
  • イベント
  • ユーザー定義関数
  • FULLTEXT構文とインデックス#1793
  • SPATIALGIS / GEOMETRYとも呼ばれる )関数、データ型、インデックス#6347
  • asciilatin1binaryutf8utf8mb4gbk以外の文字セット。
  • オプティマイザートレース
  • XML関数
  • Xプロトコル#1109
  • 列レベルの権限#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
  • 「セッショントラッカー: 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 REPLICASHARD_ROW_ID_BITSAUTO_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参照してください。

  • CLUSTEREDCLUSTERED主キーの追加/削除はサポートされていません。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 内のビューは更新できず、 UPDATEINSERTDELETEなどの書き込み操作はサポートされません。

一時テーブル

詳細についてはTiDB のローカル一時テーブルと MySQL の一時テーブル間の互換性参照してください。

文字セットと照合順序

  • TiDB でサポートされている文字セットと照合順序の詳細については、 文字セットと照合の概要参照してください。

  • GBK 文字セットの MySQL 互換性については、 GBK互換性を参照してください。

  • TiDB は、テーブルで使用される文字セットを国別文字セットとして継承します。

ストレージエンジン

TiDBでは、他のstorageエンジンを使用してテーブルを作成することができます。ただし、TiDBで記述されるメタデータは、互換性を確保するためにInnoDBstorageエンジン用です。

SQLモード

TiDB は、次のほとんどSQLモードサポートします。

  • OraclePostgreSQLなどの互換モードは解析されますが無視されます。互換モードは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 のデフォルトの照合順序はutf8mb4_binです。
    • MySQL 5.7のデフォルトの照合順序はutf8mb4_general_ciです。
    • MySQL 8.0 のデフォルトの照合順序はutf8mb4_0900_ai_ciです。
  • デフォルトの 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
  • デフォルト値は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 は検索時に小文字に変換します。名前の比較では大文字と小文字は区別されません。
  • デフォルト値はexplicit_defaults_for_timestampです:
    • TiDB のデフォルト値はONで、現在はONのみがサポートされています。
    • MySQL のデフォルトは次の値になります。
      • MySQL 5.7の場合: OFF .
      • MySQL 8.0 の場合: ON .

日時

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 GROUPDROP RESOURCE GROUP 、およびALTER RESOURCE GROUPステートメント

リソースグループの作成、変更、削除を行う以下のステートメントは、MySQLとは異なるパラメータをサポートしています。詳細については、以下のドキュメントをご覧ください。

MySQL InnoDB の悲観的トランザクション(ロック)の違い

TiDB と MySQL InnoDB の悲観的トランザクション (ロック) の違いについては、 MySQL InnoDBとの違い参照してください。

このページは役に立ちましたか?