性能チューニングのベストプラクティス
このドキュメントでは、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 は、オンライン インデックス追加操作をサポートしています。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アプリケーション開発のベスト プラクティス参照。