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