MENU
カタログクリップ
本ページはプロモーションを含みます。

【実験】MySQLで複数のレコードを取り出す際、クエリをまとめるとどれだけ早くなるか

2020 6/28
広告
コンピューター
2017年3月9日2020年6月28日

MySQLで複数のクエリを取り出すには、次のように、クエリを複数回発行する方法と、条件節(WHERE節)に複数の条件を指定する2つの方法があります。

  1. SELECT * FROM table WHERE id=?
    これを複数回
  2. SELECT * FROM table WHERE id=? OR id=? OR id=? (以下 OR id=?が続く…)
    これを一回

クエリを複数回発行するよりも、一回で済ませた方が早そうと推測出来ますが、さて、どれだけパフォーマンスが改善されるのでしょうか。

実験してみました。

目次

実験

mysqliパッケージを使用。プリペアドステートメントを使用します。

前述の2つのSQL文をそれぞれに用いて、42個のレコードが入っているテーブルから、主キーを指定して42個のレコードを取り出し、かかった時間を計測します。

時間の計測は100回行い、平均値を比較します。

Macbook pro early 2015のMAMPローカル環境で実行します。(そのためSSDアクセスは早いです。)

$time = microtime(true);
foreach($ids as $id){
  $db_cont->db_get_item($id);
}
echo "time for 42 queries of getting 1 record: ", microtime(true) - $time, "<br>", PHP_EOL;

$time = microtime(true);
$db_cont->db_get_items($ids));
echo "time for 1 query of getting 42 records: ", microtime(true) - $time, "<br>", PHP_EOL;

関数類(一部ユーザ関数を含む)

function db_get_item($id){
  $sql = "SELECT * FROM items WHERE id=?;";
  $vals = array("s", $id);
  return $this->db->queryBind($sql, $vals);
}

function db_get_items($ids){
  $sql = "SELECT * FROM items WHERE ".
    implode(' OR ', array_fill(0, count($ids), 'id=?'));
  $vals[] = str_repeat('s', count($ids));
  $vals = array_merge($vals, $ids);
  return $this->db->queryBind($sql, $vals);
}

結果

実行した結果、次のようになりました。

  1. time for 42 queries of getting 1 record: 0.0167034697533 sec
  2. time for 1 query of getting 42 records : 0.00169276952744 sec

この条件下では、0.0167/0.00169 ~ 10 から、一つのクエリで取り出したほうが 10倍早かったことがわかります。

考察

1. の結果から、1レコード取り出しにかかる時間は1クエリあたり、0.40 msです。

クエリ発行のオーバーヘッドがこの時間のどれだけを占めているか、この結果から推測してみます。

クエリのオーバーヘッドをq、レコード検索にかかる時間をsとして、次の関係が成り立つと仮定します。

  • 0.40 ms = q + s * 1
  • 1.7 ms = q + s * 42

これを解くと、次のようになります。

  • q = 0.37 ms
  • s = 0.032 ms

クエリにかかる時間は、0.37 msとなり、サーチにかかる時間の12倍です。サーチにかかる時間はほぼ無視できそうです。

100クエリを一回にまとめて発行するような前出のような関数を作ると、およそ37 ms早くなります。

37 ms程度がネックになってくるシステムで、100クエリ程度を発行している場合は、クエリをまとめると、MySQLへのアクセスによる遅延を抑える効果が期待できるということになります。

ただサーチにかかる時間は、検索条件に依存することはお忘れなく。

まとめ

MySQLで主キーを指定してレコードを取り出してみたところ、クエリー発行のオーバーヘッドは0.37 ms/query でした。環境に依存しますが、本実験条件下では、100クエリを一つにまとめると、37 ms程度の高速化が望めることになります。

コンピューター
highlightjs

関連記事

  • Speed Wi-Fi DOCK 5G 01の実機使用レビュー。
    2025年4月16日
  • AXE5400VとAX80Vの3つの違い。[Wi-Fiルーター]
    2025年4月7日
  • Archer AXE5400とAX80の3つの違い。[Wi-Fiルーター]
    2025年4月7日
  • Archer AXE5400とAX5400の3つの違い。[Wi-Fiルーター]
    2025年4月6日
  • Archer AX3000とAX1800の2つの違い。[Wi-Fiルーター]
    2025年4月6日
  • Archer AX3000VとAX23Vの2つの違い。[Wi-Fiルーター]
    2025年4月5日
  • Archer AX80とAX5400の3つの違い。[Wi-Fiルーター]
    2025年4月5日
  • Archer AX80VとAX73Vの3つの違い。[Wi-Fiルーター]
    2025年4月5日
カテゴリー
  • コンピューター
    • gnuplot & eps
    • mac
    • matplotlib
    • wordpress
  • ホーム・家電
    • アイロン
    • オーディオ
    • オーラルケア
      • ジェットウォッシャー
      • 音波振動歯ブラシ
    • カメラ
    • カー用品
    • クリーナー
    • テレビ、レコーダー
    • ドアホン
    • メンズ美容家電
      • ラムダッシュ
    • ルンバ
    • 一覧比較
    • 工具
    • 浄水器
    • 温水洗浄便座
    • 炊飯器
    • 空気清浄機・加除湿機
    • 空調・季節家電
    • 美容家電
      • フェイスケア
      • ヘアケア
      • ボディーケア
    • 血圧計
    • 調理器具
    • 電子レンジ
  • 健康
  • 家事
    • パン
    • 料理
    • 育児
    • 食品
      • おせち
      • コーヒー
  • 書籍
  • 知識
  • 趣味
    • ペン字
    • ロードバイク・クロスバイク
    • 車
    • 鉄道模型
    • 電子工作
サイト内検索
最近の投稿
  • モナークHGとモナークM7の4つの違い。[ニコン双眼鏡]
  • ニコン モナーク M7とM5の4つの違い。[双眼鏡]
  • Speed Wi-Fi DOCK 5G 01の実機使用レビュー。
  • RZ-760、GT-760、ST-760の違い。[ガス缶・CB缶]
  • RZ-730、RZ-730S、RZ-730SBK、RZ-730SWH、ST-Y450の違い。
  • TC-EA35WとTC-E123SBKの違いを比較。[スティッククリーナー]
  1. ホーム
  2. コンピューター
  3. 【実験】MySQLで複数のレコードを取り出す際、クエリをまとめるとどれだけ早くなるか
  • ホーム
  • プライバシーポリシー

© カタログクリップ
contact@beiznotes.org

目次