2012-04-18 01:50

半年以上ブログの更新が止まっちゃいました。この 1 年くらいは日々の業務に追われて、TIPS 的なノウハウは溜めつつも公開できる状態にありませんでした。ノートに溜まっている役立ちそうな TIPS は徐々に公開していければと思います。
とりあえず、今日は MySQL のインデックスが使われているかの確認。様々な現場に行くと、使用する RDB も違うのですが、インデックスについては共通ですね。ただ、シンプルにプライマリーキーのみを使うプロジェクトなどもあり、設計や運用も様々で、インデックスを意識することがないまま日々が過ぎていく場合もあるでしょう。
しかし、実行している SELECT 文がインデックスを使っているかの確認程度はできるようになっておきたいものです。例えばこんなテーブルがあったとします。
CREATE TABLE IF NOT EXISTS hogehoge ( id int(11) NOT NULL, store_id varchar(128) NOT NULL DEFAULT '', store_name varchar(255) NOT NULL DEFAULT '', store_info varchar(255) NOT NULL DEFAULT '', update_date datetime DEFAULT NULL, PRIMARY KEY (id), INDEX (store_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO hogehoge VALUES(1, '1001', 'お店1', 'お店紹介1', NOW()); INSERT INTO hogehoge VALUES(2, '1002', 'お店2', 'お店紹介2', NOW()); INSERT INTO hogehoge VALUES(3, '1003', 'お店3', 'お店紹介3', NOW());
store_id を WHERE の条件として SELECT してみます。ここでは 1001 のデータを抽出することにします。インデックスが使われていないことがわかりますね。
mysql> EXPLAIN SELECT * FROM hogehoge WHERE store_id = 1001; +----+-------------+----------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | hogehoge | ALL | store_id | NULL | NULL | NULL | 3 | Using where | +----+-------------+----------+------+---------------+------+---------+------+------+-------------+
次に、WHERE の条件をシングルクォートで囲んでみます。key カラムに store_id が出力されました。これが MySQL が SELECT 実行時に採用した INDEX になります。
mysql> EXPLAIN SELECT * FROM hogehoge WHERE store_id = '1001'; +----+-------------+----------+------+---------------+----------+---------+-------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------+------+---------------+----------+---------+-------+------+-------------+ | 1 | SIMPLE | hogehoge | ref | store_id | store_id | 386 | const | 1 | Using where | +----+-------------+----------+------+---------------+----------+---------+-------+------+-------------+
数値項目だと思って何気なく SELECT を実行していると、実は VARCHAR だったなんてこともあるので、コンソール上で SQL を発行する時は意識しておきたいですね。PHP の場合はアプリ側でも注意しておいた方がいいのかな。