【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件。
よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。