インフィニットループ 技術ブログ

2011年03月28日 (月)

著者 : ota

ソーシャルゲーム開発者なら知っておきたい MySQL INDEX + EXPLAIN入門

広く浅くを担当してます、ota です。
技術ブログ第一回から早速流用スライドで申し訳ありませんが、社内勉強会資料として作成した「MySQL INDEX + EXPLAIN入門」です。
当社でもソーシャルゲームの開発を行っていますが、このような大量のデータを使用する・クエリの速度が求められる場合にインデックスは大変重要です。
インデックスの有効な利用にはDB設計者だけではなくプログラマにもある程度の知識が最低限必要となりますが、インデックスについての初心者向け資料があまりないようです。
このスライドではプログラマに知っておいて欲しい以下の基本的な点をまとめました。 

  • INDEXを使用する時に気をつけること
    • WHERE句
      • !=、<>はインデックスが使用できない
      • WHERE句の全てのANDにかかっていないインデックスは使用されない
      • 曖昧検索時、定数文字列+前方一致以外ではインデックスが使用できない
      • 複合インデックスとインデックスマージの違いについて
    • その他ORDER BY句、HAVING句について
  • INDEXを作成する時に気をつけること
    • 選択性の高い項目をインデックスにする
    • 複合インデックスは先頭から順に部分インデックスとしても使用できる
    • インデックスサイズを増やさない・増えることによる影響
  • EXPLAIN出力結果からできるSQLチューニング
    • 見るべき部分はtype、key、rows、Extra

データ作成に使用した基本のテーブルは以下のようなものです。

CREATE TABLE IF NOT EXISTS test_tbl (
  id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  col_1 int(11) NOT NULL,
  col_2 varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  col_3 int(11) NOT NULL,
  col_4 int(11) NOT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

テーブルの各カラムには 0〜1,000,000 の値を入れています。


【追記】
予想以上に好評なようなので、流し書きだった ORDER BY についても例を追加しました。
上のスライドが古いまま(表紙右下の更新日時が4/1でない場合古い)の場合は直接SlideShareへ飛んでください。(4/1)

ブログ記事検索

このブログについて

このブログは、札幌市・仙台市の「株式会社インフィニットループ」が運営する技術ブログです。 お仕事で使えるITネタを社員たちが発信します!