0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

完全一致の場合、中間テーブルの処理は高速化するか。

Posted at

先日、データを正規化しない場合でも、中間テーブルを作成する方がいいのかとういう記事を書きました。

その後、「そういえば、完全一致だとまた挙動が変わるのかな」と疑問に思ったので、完全一致で今回はテストをしてみました。

注:ソースコードは前回の記事を参考にしてください。

実際にテスト

前回同様、企業のデータベースというテーマでデータを作成します。
作成した結果は下記のようになりました。

企業数: 3,000,000
タグ数: 20
1企業あたりのタグ数:
    平均: 1.029
    標準偏差: 0.172
    最頻値: 1
    中央値: 1.0

完全一致検索を10回行ったテスト結果が下記のようになっています。
検索での該当件数が多い方と、中間テーブルがあることでデータの取得が早くなります。

該当企業数 検索方法 実行回数 平均処理時間 (秒) 最小処理時間 (秒) 最大処理時間 (秒)
17559 中間テーブルなし 10 0.08341 0.07068 0.14418
17559 中間テーブルあり 10 0.10514 0.09418 0.15091
8806 中間テーブルなし 10 0.04489 0.04064 0.06138
8806 中間テーブルあり 10 0.04247 0.03999 0.04921
20257 中間テーブルなし 10 0.08072 0.07658 0.08768
20257 中間テーブルあり 10 0.11412 0.10791 0.11777

分かりやすく平均値だけを比較してみましょう。
検索での該当件数が8806軒の時は、中間テーブルがない方が速くなっています。
この結果から、システムの仕様によっては中間テーブルがなくても良いのかもしれません。

平均処理時間の比較

企業数 中間テーブルなし(秒) 中間テーブルあり (秒) 差分 (秒) 性能差 (%)
17559 0.08341 0.10514 0.02173 +20.67%
8806 0.04489 0.04247 -0.00242 -5.39%
20257 0.08072 0.11412 0.03340 +29.26%

2回目のテスト

「検索該当件数が少なければ中間テーブルがない方が早い」ということを書きましたが、そもそものデータ量が多くて検索多少件数が増えると変わるかなと思ったので、追加でテストをしてみます。

企業数: 3,000,000
タグ数: 220
1企業あたりのタグ数:
    平均: 1.415
    標準偏差: 0.677
    最頻値: 1
    中央値: 1.0

企業数はそのままに、タグの数を増やしい1企業あたりに紐づくタグ数を増やしました。

企業数 検索方法 実行回数 平均処理時間 (秒) 最小処理時間 (秒) 最大処理時間 (秒)
17559 中間テーブルなし 10 0.13674 0.12893 0.17512
17559 中間テーブルあり 10 0.10586 0.09892 0.12202
8806 中間テーブルなし 10 0.06965 0.06461 0.07695
8806 中間テーブルあり 10 0.06561 0.06283 0.07292
20257 中間テーブルなし 10 0.14182 0.13868 0.14882
20257 中間テーブルあり 10 0.11897 0.11430 0.12619

平均処理時間の比較

企業数 中間テーブルなし(秒) 中間テーブルあり (秒) 差分 (秒) 性能差 (%)
17559 0.13674 0.10586 0.03088 -22.58%
8806 0.06965 0.06561 0.00404 -6.16%
20257 0.14182 0.11897 0.02285 -19.21%

検索対象が増えた結果、検索該当件数が8806件でも中間テーブルありの方が処理が早くなりました。
データの全体量の影響もかなりあるようです。

結論

検索されるテーブルの情報量が増えると、中間テーブルがある方が処理が早くなる。
ただし一致する検索結果の数にもよる。

個人的にはデータを正規化しないが、一定の共通性がある場合
検索をするなら中間テーブルを作成する
検索をしないならリスト型で保存する

という感じがいいのではないかと思います。

データが増えすぎることを考えるとリスト型で1つのテーブルに入れてしまうと、新しい問題が起きるのでデータベースは奥が深いです。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?