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とか書いてればいいっぽい
参考
一応 インデックス削除
alter table shipment_info drop index idx_reds;