インデックス

インデックスの作成

  • CREATE TABLE テーブル名(カラム名 型,カラム名 型, ... INDEX インデックス名(カラム名);
  • CREATE INDEX インデックス名 ON テーブル名(カラム名);
  • ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);

ユニークインデックスの作成

  • CREATE UNIQUE INDEX インデックス名 ON テーブル名(カラム名);

複合インデックスの作成

  • CREATE INDEX インデックス名 ON テーブル名 (カラム名1([数値])[, カラム名2([数値]), ...);

インデックス情報の確認

  • SHOW INDEX FROM テーブル名;

検索の目安

  • プライマリーキーで1件を検索: とても速い
  • インデックスで1件を検索: 十分速い
  • インデックスなしで1件を検索: 全件走査。1000件までは許す。それ以上の場合、サイト側では絶対にやってはいけない

INDEX が有効な場面

  • =による検索
    • where id=123
  • 範囲検索
    • where point>10 and point<=100
  • min/max
    • select max(point)
  • ソート
    • order by point

EXPLAIN の見方

  • id: 無視
  • select type: 無視(サブクエリを使わないかぎり関係ない)
  • table: テーブル名
  • type: 参考
    • constはプライマリキー、eq_refだとユニーク
    • ref, rangeはインデックス
    • ALL, index: 死亡フラグ
  • possible_keys: 無視
  • key: わりと重要(使われるINDEX)
  • key_len: 無視
  • ref: 無視(条件指定。join使わないならあまり意味ない)
  • rows:重要(ヒットする行の概算)
  • Extra: 重要(検索方法)

チェック項目

  • 想定通りのキーが使用されてるか?
  • typeに以下があれば死亡フラグ
    • ALL: フルテーブルスキャン
    • index: フルインデックススキャン
  • Extraに以下があれば死亡フラグ
    • Using filesort(INDEXがないのでMySQLがソートをはじめます)
    • Using temporary(ソートをするために一時テーブルをつくります)
  • Extra
    • Using index(covering index これがでてくるとうれしい)

vachar なテーブルにセレクト掛けるとき

select * from sampletable WHERE var_column = 1000;

ではなく

select * from sampletable WHERE var_column = '1000';

のように、中に数字しか入っていないのだとしても、'などで囲む。

サブクエリの高速化

SET BIG_TABLES=1;

ダーティリード

トランザクションでのロックを無視して、レコードを読み込む。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

ダーティリードはあるトランザクションで変更されてCOMMIT される前のデータが別のトランザクションから読み取れるというもの。

クエリの最大長

show variables like 'max_allowed_packet';

文字列の長さ

SELECT LENGTH(列名) FROM テーブル名;

スレーブの止まってるクエリを飛ばし、レプを再開

SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
show slave status

Skip_Counter が 0 から 1 に変わってることを確認して

start slave;

スレーブの状態を確認

show slave status

行数を数える

重複する行を除く

select count(distinct カラム名) from テーブル名;

テーブルのレコード数を得る

select count(*) from テーブル名;

コネクション数

現在のコネクション数を知るには?

mysql> show status like 'Threads%';
Threads_cachedスレッドキャッシュ内のスレッド数
Threads_connected現在開いている接続の数
Threads_created接続を処理するために生成されたスレッド数
Threads_runningスリープ状態になっていないスレッド数

起動してからの累計接続数

mysql> show global status like 'Connections';

起動してからの同時最大接続数

mysql> show global status like 'Max_used%';

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-06-27 (水) 23:37:59 (2490d)