2012/05/22

[mysql]テーブルスキャンを避ける方法

mysqlのドキュメントに「6.2.15 テーブルスキャンを避ける方法」っていうのがある。
一部コピペになるけれど、自分の理解のために書いてみる。

MySQLがあるクエリを実行する際に、テーブルスキャン(=フルスキャン)をするかどうかは、
EXPLAINを使うとわかる。EXPLAINの結果、
+----+-------------+------------+-------+・・・
| id | select_type | table      | type  |・・・
+----+-------------+------------+-------+・・・
|  1 | SIMPLE      | xxxxx      | const |・・・
|  1 | SIMPLE      | xxxxx      | ALL   |・・・
|  1 | SIMPLE      | xxxxx      | ALL   |・・・
+----+-------------+------------+-------+・・・
のように、type列が"ALL"になっているテーブルは、フルスキャンが実行され、パフォーマンスが劣化する場合がある。 typeがALLになる条件のは、
  • テーブルが小さい。
  • (INDEXを張っていても)WHERE句でINDEXを使用するに至らない。
  • (INDEXを張っていても)WHERE句でINDEXをキーとして除外する行数が小さい。
といった時になりそう(誤解してなければ・・)。 というわけで、まずは、適切にインデックスを張る、ことが最初の一歩だと確信している。

0 件のコメント: