47
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQL初心者が、EXPLAINした時に見るもの

Last updated at Posted at 2016-05-30

概要

EXPLAIN の公式ドキュメント読んでも、情報量が多くて何を見ればいいのかよくわからないです。なので、どういうやつがやばいのかを示しておきます。

絶対に対処するもの

possible_keyNULL

WHERE 句に使っているカラムに、適切な INDEX を貼ってください。
できれば UNIQUE がいいけど、「 UNIQUE "っぽい" から」という理由で貼ると後悔します。「 UNIQUE でなければいけない」理由がない限りは、ただの INDEX に留めたほうが良いです。

type が、 system const eq_ref 以外

管理画面とか定時実行処理とかならセーフなもの

以下の type は、管理画面とか定時実行処理などのように、「1日数回しか実行しないこと」が保証されていれば、問題ないです。
「あるページにアクセスされるたびに実行される」とかだと、データ件数が増えると死ぬので、必ず改善してください。

  • ref
  • fulltext
  • ref_or_null
  • index_merge

管理画面や定時実行処理からしかアクセスされないテーブルならセーフなもの

以下の"type"は、管理画面とか定時実行処理などのように、「1日数回しか実行しない場所からしか参照されないこと」が保証されていれば、問題ないです。
重要のなのは、「参照されない」ことで、SELECTであっても、頻繁にされてはいけません

  • unique_subquery
  • index_subquery
  • range
  • index

ALL は存在悪。許してはいけない。

ALL は、フルテーブルスキャンなので、存在悪です。 WHERE 句にインデックス貼っとけばなんとかなったりすることもあります。

できるだけ直したほうが良いもの

EXPLAIN の結果が4行以上

元のSQLが複雑すぎるので、直したほうが良いかもしれないです。
戦略レベルの設計でやらかしてる事が多いので、リファクタリングするのは難しいことが多いかもです。

key_len が1024以上

インデックスが張られているカラムが不適切かもしれないです。
INTENUM 型にすることを検討する。 INT 型にする場合は、「 settingテーブル(いわゆるマスタ)+中間テーブル」という設計になる事が多いかもです。

調査したほうがいいかもしれないもの

reffunc

呼び出し元のスクリプト側で既に持っているデータで使えるデータがないかを調べましょう。
可能な限り、DBサーバの負担は減らしましょう。

47
46
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
47
46

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?