性能チューニングのベスト プラクティス
このドキュメントでは、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 アプリケーションを開発するためのベスト プラクティスを参照してください。