MySQLでindexをつけると、どのくらいSelectのスピードが変わるのか

仕事で良く使っているMySQLのクエリの実行速度について、 感覚として知っておきたかったので実験。

注)個人メモなので、オチとかないです。あらかじめ言っておきます。

  • MacbookPro 2.2Ghz コアi7 メモリ16GB
  • homebrewでインストールしただけのmysql
  • 10万件のユーザデータを1つのテーブルに格納。
  • シンプルに東京在住、20代、男性、のように3カラムのWHEREで絞る。
  • Rubyのbenchmarkモジュールを使って実行時間を計測。

データサンプル

こんな感じ。

f:id:onody_onody:20141103201332p:plain

RubyのFakerというgemでダミーデータは入れました。

まず普通に実行

Benchmark.bm do |x|
  x.report {
    # 検索結果が少ない順
    puts User.where(:state => '東京都', :age => 20..29, :sex => 1).count
  }
end

都道府県は、日本語で最初はやりました。

  • 結果
      user     system      total        real
  0.010000   0.000000   0.010000 (  0.046598)

indexをつけてみる。

MySQLには、indexという機能がある。

要は、普通に以下の様なクエリを投げると、

SELECT * FROM users WHERE 'state' = '東京' AND 'sex' = 1 ...

MySQLは最初にテーブル全件を読んで、そっから絞り込むので 件数が多くなるほど遅くなると。 それを解消するために本のさくいんのようなものをつけるのがindexだそうです。 以下参考。

今回は、state、age、sexに複合インデックスをつけてみたいと思います。

  • 結果
      user     system      total        real
  0.010000   0.010000   0.020000 (  0.018678)

半分以下になりました。

都道府県を数字にするとどの程度かわるか

さっきまでは、都道府県をVACHARでやっていたので それを数字に置き換えてINTEGERに変更してやっていました。

      user     system      total        real
  0.010000   0.000000   0.010000 (  0.017745)

あんまかわんないね。

結論

あたりまえですが、indexの効果は大きく、 今回のテストでは半分くらいの実行時間にまで 短縮することができました。

あとは、こういうことを実験しておくと、 体感として効果が実感できるので、 業務の時の判断にも生かせそう。

なのでまた色々ベンチマークやテストとかしていきたい。