5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

sue445Advent Calendar 2016

Day 10

重複インデックスを検知する「index_shotgun」

Last updated at Posted at 2016-12-09

10日目ということで銃 1 をモチーフにしたgemです

index_shotgunとは?

重複インデックスを検知するためのgemです :fire: :gun: :cop:

名前の由来

SQLアンチパターン の1つ、「インデックスショットガン(闇雲インデックス)」が由来です。

使い方

アプリに組み込む時

Gemfile
group :development do
  gem "index_shotgun"
end

Rails以外では下記も必要です。

Rakefile
require "index_shotgun/tasks"

下記コマンドで実行 :fire:

$ bundle exec rake index_shotgun:fire

今まで作ったgemの中でこのtask名は個人的には一番気に入っています :triumph:

データベースに接続するための設定は activerecord からよしなに読み込むため、特別な設定は不要です。

コマンドから実行する時

各プロバイダーごとにサブコマンドが用意されているのでそれらを実行してください。(細かいオプションは help 参照)

index_shotgun mysql --database=DATABASE
index_shotgun oracle --database=DATABASE
index_shotgun postgresql --database=DATABASE
index_shotgun sqlite3 --database=DATABASE

特徴

  • pt-duplicate-key-checkerとだいたい一緒だけどactive_recordベースなのでMySQL以外でも使えるのが特徴
    • MySQL, PostgreSQL, SQLite, Oracle対応
  • 面白い試みとして、1つのリポジトリでTravis CIとWerckerを両方使ってる
    • Travis CIだとOracleが使えないため
    • Oracleのインストールが超絶面倒くさいので、Oracleインストール済のDockerfileをWerckerで使ってる。(Rubyがインストール済のイメージにOracleを入れるよりも、Oracleがインストール済のイメージにRubyをインストールする方が楽だった)

CIで重複インデックスを検出する

最近の自分の開発だとCIのビルドスクリプトで rake index_shotgun:fire を実行し重複インデックスがあった場合にはPullRequestやMergeRequestのビルドが落ちるようになっています。(下記のスクショはGitLab CI)

image

本番リリースして大量のデータが入っている状態でインデックスを消すのは大変ですが、これなら開発時に重複インデックスが自動で検出できるようになります。

合わせて読みたい

  1. 十(銃)だけに

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?