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

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

このドキュメントでは、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ステートメントを使用することをお勧めします。

  • Golang
  • Java
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は、オンラインインデックス追加操作をサポートしています。 インデックスを追加つまたはインデックスの作成のステートメントを使用してインデックスを追加できます。テーブルでのデータの読み取りと書き込みはブロックされません。次のシステム変数を変更することにより、インデックス追加操作の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アプリケーションを開発するためのベストプラクティスを参照してください。

も参照してください