性能チューニングのベストプラクティス
このドキュメントでは、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アプリケーション開発のベスト プラクティス参照。
参照
ヘルプが必要ですか?
不和またはスラック 、あるいはサポートチケットを送信するについてコミュニティに質問してください。