チェ・ゲバムラの日記

脱犬の道を目指す男のブログ

Mysqlでインデックスをつけたときのメモ

ページが落ちた時に原因を調べたらどうもページが開かれるたびにクエリが実行されていた。DBでselectされるときだけの話なのでこれをしたからといって消費者には特に関係ないが、アクセスが集中したときにページが重くなって落ちることは多分なくなる。

やることはDBのレコードに目次をつけたいというだけなんだけど概念を知らないとてこずる。

 

まあ結論だけいうと

ALTER TABLE shipment_info ADD INDEX idx_reds(bill_accnt_no,shp_dt);

これを実行しただけ。

 

解説

まずfuelでかいてあるやつを普通のselect文にするため、これを貼り付けてページに出す

/var/www/dhl-thanksclub.com/html/fuel/app/views/widgets/reds_campaign_entry_form.php
<?php
echo DB::last_query();
logger('DEBUG', \DB::last_query()); // 実行後にSQL出力
?>

つまりほんとに実行されるのはこれ


SELECT COUNT(shipment_info.bill_accnt_no) AS shipment FROM `shipment_info`
WHERE `shipment_info`.`bill_accnt_no` = '111222333'
AND `shipment_info`.`shp_dt` >= '2016-06-01 00:00:00' AND `shipment_info`.`shp_dt` <= '2016-06-30 23:59:59';


ここからが本題

 

※インデックスの書き方(カラム名をカンマ区切りで複合インデックスが可能)
ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);

 

★インデックスを付ける(ここがポイント)
ALTER TABLE shipment_info ADD INDEX idx_reds(bill_accnt_no,shp_dt);

shipment_innfoのテーブルにインデックスをつける

idex_redsという名前にしてみた

bill_accnt_no,shp_dtという二つの関係しているカラムを指定した

 

テーブル全体のインデックス確認
SHOW INDEX FROM shipment_info;


explainをつけてindexが実行されてるか確認


explain SELECT COUNT(shipment_info.bill_accnt_no) AS shipment FROM `shipment_info`
WHERE `shipment_info`.`bill_accnt_no` = '111222333'
AND `shipment_info`.`shp_dt` >= '2016-06-01 00:00:00' AND `shipment_info`.`shp_dt` <= '2016-06-30 23:59:59';

 

結果

たぶんこんなんでるはず

※引用です。すみません。

possible_keysは使えるインデックスの候補

keyは実際今回使われたインデックス

ExtraはUsing indexとか書いてればいいっぽい

+----+-------------+--------+-------+---------------+------+---------+------+-
  | possible_keys | key  | key_len | ref  | rows   | Extra                    |
+----+-------------+--------+-------+---------------+------+---------+------+--------+--------------------------+
  | dt            | dt   | 9       | NULL | 201710 | Using where; Using index |
+----+-------------+--------+-------+---------------+------+---------+------+-

 

参考


一応 インデックス削除
alter table shipment_info drop index idx_reds;


http://qiita.com/kkyouhei/items/e3502ef632c48d94541d