SQL
TiDBは、MySQLプロトコル、およびMySQL 5.7とMySQL 8.0の共通機能と構文と高い互換性があります。MySQLエコシステムツール(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver、 もっと )とMySQLクライアントはTiDBでも使用できます。
ただし、MySQLの一部の機能はTiDBではサポートされていません。これは、問題を解決するより優れた方法が存在する(XML関数の代わりにJSONを使用するなど)ため、または必要な労力に対して需要が不足している(ストアドプロシージャや関数など)ためと考えられます。さらに、一部の機能は分散システムへの実装が難しい場合があります。詳細については、 MySQLの互換性参照してください。
SQL文
SQL文は、SQL(構造化照会言語)のコマンドまたは命令であり、識別子、パラメータ、変数、データ型、および予約語SQLから構成されます。SQL文は、データやデータベース構造の取得、変更、管理など、データベースに特定のアクションを実行するよう指示します。
TiDB は、必要に応じて MySQL および TiDB 固有のステートメントの拡張機能を使用して、ISO/IEC SQL 標準に準拠することを目的とした SQL ステートメントを使用します。
SQL は関数に応じて次の 4 つの種類に分けられます。
DDL(データ定義言語):データベース、テーブル、ビュー、インデックスなどのデータベースオブジェクトを定義するために使用されます。TiDBのDDL文については、 スキーマ管理 / データ定義文(DDL)参照してください。
DML(データ操作言語):アプリケーション関連のレコードを操作するために使用されます。TiDBのDMLステートメントについては、 データ操作ステートメント(DML)参照してください。
DQL (データ クエリ言語): 条件付きフィルタリング後にレコードをクエリするために使用されます。
DCL (データ制御言語): アクセス権限とセキュリティ レベルを定義するために使用されます。
TiDB の SQL ステートメントの概要については、 SQL文の概要参照してください。
SQLモード
TiDB サーバーは異なる SQL モードで動作し、クライアントごとに異なるモードを適用します。SQL モードは、TiDB がサポートする SQL 構文と実行するデータ検証チェックの種類を定義します。
詳細についてはSQLモード参照してください。
行ID生成属性
TiDB は、行 ID の生成とデータ分散を最適化するための 3 つの SQL 属性を提供します。
自動インクリメント
自動ランダム
シャード行IDビット
自動インクリメント
AUTO_INCREMENT
、デフォルトの列値を自動的に入力するために使用される列属性です。2 INSERT
ステートメントでAUTO_INCREMENT
番目の列の値が指定されていない場合、システムは自動的にこの列に値を割り当てます。
パフォーマンス上の理由から、各TiDBサーバーには、 AUTO_INCREMENT
個の数値が一括で割り当てられます(デフォルトでは3万個)。つまり、 AUTO_INCREMENT
数値は一意であることが保証されますが、 INSERT
ステートメントに割り当てられる値は、TiDBサーバーごとに単調なものになります。
すべての TiDB サーバーでAUTO_INCREMENT
数値を単調にしたい場合、TiDB バージョンが v6.5.0 以降であれば、 MySQL互換モード有効にすることをお勧めします。
詳細については自動インクリメント参照してください。
自動ランダム
AUTO_RANDOM
、 BIGINT
列に値を自動的に割り当てるために使用される列属性です。自動的に割り当てられる値はランダムかつ一意です。4 AUTO_RANDOM
値はランダムかつ一意であるため、TiDBが連続したIDを割り当てることで単一のstorageノードに書き込みホットスポットが発生するのを回避するために、 AUTO_INCREMENT
ではなくAUTO_RANDOM
が使用されることがよくあります。
AUTO_RANDOM
の値はランダムかつ一意であるため、TiDBが連続したIDを割り当てることで単一のstorageノードに書き込みホットスポットが発生するのを回避するため、 AUTO_INCREMENT
の代わりにAUTO_RANDOM
使用されることがよくあります。現在のAUTO_INCREMENT
列が主キーで、型がBIGINT
場合、 ALTER TABLE t MODIFY COLUMN id BIGINT AUTO_RANDOM(5);
ステートメントを実行してAUTO_INCREMENT
からAUTO_RANDOM
に切り替えることができます。
詳細については自動ランダム参照してください。
シャード行IDビット
非クラスター化主キーを持つテーブル、または主キーを持たないテーブルの場合、TiDBは暗黙的な自動インクリメント行IDを使用します。大量のINSERT
操作が実行されると、データは単一のリージョンに書き込まれ、書き込みホットスポットが発生します。
ホットスポットの問題を軽減するには、 SHARD_ROW_ID_BITS
設定します。行 ID が分散され、データが複数の異なるリージョンに書き込まれます。
キーワード
キーワードは、 SELECT
、 UPDATE
、 DELETE
など、SQL ステートメントで特別な意味を持つ単語です。
そのうちのいくつかは識別子として直接使用することができ、非予約キーワードと呼ばれます。
一部のキーワードは、識別子として使用する前に特別な処理が必要であり、予約語と呼ばれます。
ただし、予約語ではないキーワードでも特別な扱いが必要なものがあります。予約語として扱うことをお勧めします。
詳細についてはキーワード参照してください。
ユーザー定義変数
TiDBでは、ユーザー定義変数の設定と読み取りが可能です。ユーザー定義変数の形式は@var_name
です。3を構成する文字は、識別子を構成できる任意の文字(数字0-9
、文字a-zA-Z
、アンダースコア_
、ドル記号$
、UTF-8文字など)です。さらに、英語のピリオド.
も含まれます。ユーザー定義var_name
は大文字と小文字を区別しません。
ユーザー定義変数はセッション固有であるため、1 つのクライアント接続で定義されたユーザー変数は、他のクライアント接続では表示または使用できません。
詳細についてはユーザー定義変数参照してください。
メタデータロック
TiDBでは、メタデータロックは、オンラインスキーマ変更中にテーブルメタデータへの変更を管理するために導入されたメカニズムです。トランザクションが開始されると、現在のメタデータのスナップショットがロックされます。トランザクション中にメタデータが変更された場合、TiDBは「情報スキーマが変更されました」というエラーをスローし、トランザクションのコミットを阻止します。メタデータロックは、データ操作言語(DML)とデータ定義言語(DDL)の操作を調整し、DMLに優先順位を付けることで、古いメタデータを持つ進行中のDMLトランザクションが新しいDDL変更を適用する前にコミットされるようにします。これにより、エラーを最小限に抑え、データの一貫性を維持できます。
詳細についてはメタデータロック参照してください。