📣

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

性能チューニングのベストプラクティス

このドキュメントでは、TiDB データベースの使用に関するベスト プラクティスをいくつか紹介します。

DMLのベストプラクティス

このセクションでは、TiDB で DML を使用する場合のベスト プラクティスについて説明します。

複数行のステートメントを使用する

テーブルの複数の行を変更する必要がある場合は、複数行ステートメントを使用することをお勧めします。

INSERT INTO t VALUES (1, 'a'), (2, 'b'), (3, 'c'); DELETE FROM t WHERE id IN (1, 2, 3);

複数の単一行ステートメントを使用することはお勧めしません。

INSERT INTO t VALUES (1, 'a'); INSERT INTO t VALUES (2, 'b'); INSERT INTO t VALUES (3, 'c'); DELETE FROM t WHERE id = 1; DELETE FROM t WHERE id = 2; DELETE FROM t WHERE id = 3;

PREPAREを使用する

SQL ステートメントを複数回実行する必要がある場合は、SQL 構文を繰り返し解析するオーバーヘッドを回避するために、 PREPAREステートメントを使用することをお勧めします。

    func BatchInsert(db *sql.DB) error { stmt, err := db.Prepare("INSERT INTO t (id) VALUES (?), (?), (?), (?), (?)") if err != nil { return err } for i := 0; i < 1000; i += 5 { values := []interface{}{i, i + 1, i + 2, i + 3, i + 4} _, err = stmt.Exec(values...) if err != nil { return err } } return nil }
    public void batchInsert(Connection connection) throws SQLException { PreparedStatement statement = connection.prepareStatement( "INSERT INTO `t` (`id`) VALUES (?), (?), (?), (?), (?)"); for (int i = 0; i < 1000; i ++) { statement.setInt(i % 5 + 1, i); if (i % 5 == 4) { statement.executeUpdate(); } } }

    PREPARE文を繰り返し実行しないでください。繰り返し実行すると、実行効率が向上しません。

    必要な列のみをクエリする

    すべての列のデータが必要ない場合は、 SELECT *使用してすべての列のデータを取得しないでください。次のクエリは非効率的です。

    SELECT * FROM books WHERE title = 'Marian Yost';

    必要な列のみをクエリしてください。例:

    SELECT title, price FROM books WHERE title = 'Marian Yost';

    一括削除を使用する

    大量のデータを削除する場合は、 一括削除使用することをお勧めします。

    一括更新を使用する

    大量のデータを更新する場合は、 一括更新使用することをお勧めします。

    テーブル全体のデータには、 DELETEではなくTRUNCATE使用します。

    テーブルからすべてのデータを削除する必要がある場合は、 TRUNCATEステートメントを使用することをお勧めします。

    TRUNCATE TABLE t;

    完全なテーブルデータにDELETE使用することはお勧めしません。

    DELETE FROM t;

    DDLのベストプラクティス

    このセクションでは、TiDB の DDL を使用する際のベスト プラクティスについて説明します。

    主キーのベストプラクティス

    主キーを選択する際に従うべきルール参照してください。

    インデックスのベストプラクティス

    インデックスのベストプラクティス参照。

    インデックスのベストプラクティスを追加する

    TiDBはオンラインのインデックス追加操作をサポートしています。1 インデックスを追加またはインデックスの作成文でインデックスを追加できます。テーブルへのデータの読み取りと書き込みはブロックされません。以下のシステム変数を変更することで、インデックス追加操作のフェーズre-organizeにおける同時実行性とバッチサイズを調整できます。

    オンラインアプリケーションへの影響を軽減するため、インデックス追加操作のデフォルトの速度は低速に設定されています。インデックス追加操作の対象列が読み取り負荷のみ、またはオンラインワークロードに直接関連していない場合は、上記の変数の値を適切に増やすことで、インデックス追加操作を高速化できます。

    SET @@global.tidb_ddl_reorg_worker_cnt = 16; SET @@global.tidb_ddl_reorg_batch_size = 4096;

    インデックス追加操作の対象列が頻繁に更新される場合( UPDATEなど)、上記の変数INSERT値を増やすと書き込み競合が増加し、オンラインワークロードDELETE影響を与えます。そのため、再試行が頻繁に発生するため、インデックス追加操作の完了に時間がかかる可能性があります。このような場合は、オンラインアプリケーションとの書き込み競合を回避するために、上記の変数の値を減らすことをお勧めします。

    SET @@global.tidb_ddl_reorg_worker_cnt = 4; SET @@global.tidb_ddl_reorg_batch_size = 128;

    トランザクションの競合

    トランザクションの競合を見つけて解決する方法については、 ロックの競合のトラブルシューティング参照してください。

    TiDB を使用したJavaアプリケーション開発のベスト プラクティス

    TiDB を使用したJavaアプリケーション開発のベスト プラクティス参照。

    参照

    ヘルプが必要ですか?

    不和またはスラック 、あるいはサポートチケットを送信するについてコミュニティに質問してください。

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