Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Railsと考えるデータベースのインデックス戦略

onunu
July 14, 2018
1.6k

 Railsと考えるデータベースのインデックス戦略

Rails Developers Meetup 2018 Day 3 Extreme
進行スポンサーPRとして登壇させていただきました。

onunu

July 14, 2018
Tweet

Transcript

  1. In Rails Developers Meetup 2018 Day 3 Extreme @onunu sponsored

    by Railsと考える データベースの インデックス戦略
  2. カーディナリティとは? ◎ SHOW INDEX で確認できる ◎ テーブルの行数に対して ◦ 種類が少ない ->

    カーディナリティが低い ◦ 種類が多い -> カーディナリティが高い カラムの値の種類の数
  3. カーディナリティが低いカラムに対する インデックスは本当に意味がないか? NO, Fetchされる行数が少なければ、 インデックスは効果を発揮する インデックス有り インデックス無し 実行結果 490458 rows

    in set (1.59 sec) 490458 rows in set (6.57 sec) 冒頭のように、カーディナリティは低いが 検索結果の行数が少ないクエリがよく利用される場合、 インデックスの利用を考えてもよい
  4. 先ほどのままのクエリ FORCE INDEXで明示的に指定 実行結果 1666655 rows in set (6.80 sec)

    1666655 rows in set (12.91 sec) カーディナリティが高いカラムはどうか? 実際にクエリを実行し、速度を比較してみる Fetchされるであろうデータが全体の およそ10%なのにも関わらず、 インデックスを利用した場合の方が遅くなってしまう
  5. まとめ ◎ カーディナリティの低いカラムに対するインデックス ◦ 意味がある場合もある ◎ カーディナリティが高いカラムに対するインデックス ◦ SELECT句の内容によってインデックスを利用しない場 合もある

    ◦ fetchされる行数によってはインデックスを利用しない場 合もある ◦ インデックス利用の閾値は30%で固定ではなく ◦ fetchされる行数と割合によって変動する ◦ フルスキャンは必ずしも悪ではない
  6. MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.3.1 MySQL のインデックスの使用の仕組み (https://dev.mysql.com/doc/refman/5.6/ja/mysql-indexes.html)

    MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.4.5 MySQLにおけるインデックスの使用 (http://download.nust.na/pub6/mysql/doc/refman/5.1/ja/mysql-indexes.html) MySQL :: MySQL 5.6 リファレンスマニュアル :: 8.2.1.20 フルテーブルスキャンを回避する方法 (https://dev.mysql.com/doc/refman/5.6/ja/how-to-avoid-table-scan.html) mysqlのindexとorder by の速度を改善する。 - お前の血は何色だ!! 4 (http://d.hatena.ne.jp/rti7743/20080629) 漢(オトコ)のコンピュータ道: MySQLのEXPLAINを徹底解説!! (http://nippondanji.blogspot.com/2009/03/mysqlexplain.html) 参考文献