【38】【Rails】インデックスの効果を検証する

この記事はインデックスの効果について、ローカルの環境で実験した検証記事です。
まずインデックスについてはこの記事で

インデックスなし

サンプル数1万
4.5ms

irb(main):002:0> Author.where(name: "taro_4586")
 Author Load (4.5ms)  SELECT `authors`.* FROM `authors` WHERE `authors`.`name` = 'taro_4586'
=>

サンプル数10万
35.4ms

irb(main):004:0> Author.where(name: "taro_89996")
 Author Load (35.4ms)  SELECT `authors`.* FROM `authors` WHERE `authors`.`name` = 'taro_89996'
=>

インデックスをつける

サンプル数10万
0.5ms!!!

irb(main):001:0> Author.where(name: "taro_99996")
 Author Load (0.5ms)  SELECT `authors`.* FROM `authors` WHERE `authors`.`name` = 'taro_99996'
=>
irb(main):002:0> Author.where(name: "taro_9996")
 Author Load (0.4ms)  SELECT `authors`.* FROM `authors` WHERE `authors`.`name` = 'taro_9996'
=>

否定句、not句を使うとどうなる?

25.8ms

否定句を使うとインデックスの効果がなくなる。
予想通りの結果。

irb(main):006:0> Author.where(name: "taro_64777").size
  (0.4ms)  SELECT COUNT(*) FROM `authors` WHERE `authors`.`name` = 'taro_64777'
=> 1
irb(main):007:0> Author.where.not(name: "taro_64777").size
  (25.8ms)  SELECT COUNT(*) FROM `authors` WHERE `authors`.`name` != 'taro_64777'
=> 99999

OR条件を使うとどうなる?

0.4ms
OR句を使うとインデックスの効果がない。
IN句を使うとインデックスの効果がある。
しかし、検証結果は違いがなかった。
Railsのおかげ??

 Author Load (0.4ms)  SELECT `authors`.* FROM `authors` WHERE (`authors`.`name` = 'taro_64777' OR `authors`.`name` = 'taro_5788')
irb(main):003:0> Author.where(name: ["taro_65788","taro_6"])
 Author Load (0.5ms)  SELECT `authors`.* FROM `authors` WHERE `authors`.`name` IN ('taro_65788', 'taro_6')

Like句で後方一致、中間一致、前方一致を行うとどうなる?

25.4ms
28.3ms
37.2ms

本来、後方一致、中間一致はインデックスの効果がないので遅くなると思ったが、検証結果は違った。
むしろ、インデックスの効果がある前方一致の方が遅くなっている。
なぜ?
要検証

(25.4ms)  SELECT COUNT(*) FROM `authors` WHERE (name LIKE '%taro%')
=> 100000
irb(main):017:0> Author.where("name LIKE ?","%_457").size
  (28.3ms)  SELECT COUNT(*) FROM `authors` WHERE (name LIKE '%_457')
=> 100
irb(main):021:0> Author.where("name LIKE ?","taro_9987%").size
  (37.2ms)  SELECT COUNT(*) FROM `authors` WHERE (name LIKE 'taro_9987%')
=> 11

インデックス列に演算を行った場合の検証

インデックス列に演算を行っていない

irb(main):024:0> Author.where("sort_number  > 50000/10" ).size
  (23.0ms)  SELECT COUNT(*) FROM `authors` WHERE (sort_number  > 50000/10)
=> 94999

インデックス列に演算を行う

irb(main):020:0> Author.where("sort_number * 10 > 50000" ).size
  (19.9ms)  SELECT COUNT(*) FROM `authors` WHERE (sort_number * 10 > 50000)
=> 94999

インデックス列に演算を行うとインデックスの効果がなくなる。
しかし、検証結果は違った。変化はとくになし。
Railsのおかげ??

データーベースに関する記事の一覧

参考文献

達人に学ぶDB設計 徹底指南書 ~初級者で終わりたくないあなたへ

 最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)

現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
この記事は38件目の投稿。目標まで後12件。

よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。

この記事が気に入ったらサポートをしてみませんか?