🐥

TiDBでインデックス作成

に公開

TiDBでインデックスの作成を行います。

前提条件

ローカル環境構築で作成したTiDBの環境を使用
tidbコンテナを起動

インデックス設計の基本指針

  • 等価条件= を先頭に、範囲条件 BETWEEN / > / < / LIKE 'prefix%' を後ろに置く複合インデックスが効きやすい
  • 選択度が高い列を先頭にすると効果大
  • ORDER BY / JOINキーも考慮(WHEREとORDER BYの両立が取れる並びが理想)
  • 文字列の長い列はプレフィックスインデックスで節約可(例:email(16))
  • 関数適用で索引が効かない時(LOWER(name)など)は、式インデックス(対応バージョンのみ)や生成列+索引を検討
  • 取りすぎ注意:インデックスは読み取りを速く、書き込みを遅く&ストレージ増のトレードオフ

手順

インデックスの作成を行なっていきます。
tidbコンテナにアクセスします。

docker exec -it tidb-test sh



mysqlクライアントにログインします。

mysql -h 127.0.0.1 -P 4000 -u root



ローカル環境構築でDBを作成しているのでそのDBのテーブルに対し、インデックスを作成し高速化していきます。
DBの内容確認を行います。

SHOW DATABASES;
USE インデックス作成を行いたいDB;
SHOW COLUMNS FROM テーブル名 FROM データベース名;



以下は、nameカラムでの検索と created_atカラムでの並び替えや期間検索を高速化するためのインデックスを追加するコマンドです。

-- 名前での等価/前方一致検索(例 / LIKE 'foo%')に効く
ALTER TABLE test_db.テーブル名
  ADD INDEX idx_customers_name (name);

-- 新着順一覧や期間フィルタ、ORDER BY created_at に効く
ALTER TABLE test_db.テーブル名
  ADD INDEX idx_customers_created_at (created_at);

以上の基本方針と手順に沿ってインデックスを適切に設計・作成することで、TiDBのクエリパフォーマンスを効果的に改善できます。


まとめ

TiDBの性能向上のため、複合インデックスは等価条件を先にするなど設計指針に沿って作成します。
具体的な手順はDocker経由でMySQLクライアントに接続し、ALTER TABLEでインデックスを追加します。
ただし、検索は速くなる一方、書き込み速度は低下するため、インデックスの過剰な作成には注意が必要です。

次回はTiFlashを使って高速化をしてみます。

Discussion