![見出し画像](https://assets.st-note.com/production/uploads/images/121231793/rectangle_large_type_2_277b70a02619ffe194f801f2edbb3fad.png?width=1200)
MySQL クエリのパフォーマンス改善テクニック -その3- 必要なカラムのみを取得してみる
フルスタックエンジニア()な clown の note にようこそ。
はじめに
今回やること
MySQL のクエリパフォーマンス改善のひとつとして、簡単にできるクエリ改修をします。
対象者
RSDB を使うシステムに関わってて、ユーザから重いって言われてるあなた
DB 担当になったけど、何から手を付けていいかわかんないあなた
MySQL を使っているあなた(他 DB でも基本はそんなに違わないです)
ざっくり説明
今日も DBMS と格闘してますか?
正直、クエリなんて究極は動けばいいんですけど、データ取得に数時間数日かかるようだと、「パソコンが動かないんですけお?ウィルスですか?」とか言われます。
じゃあ、クエリパフォーマンスを改善すればいいじゃない。
というのが今回の話。
でも、パフォーマンス改善ってどうやって?
という悩みをひとつだけ解決するのがこの記事です。
SELECT するカラムは必要なものだけにしろ!
ワイルドカード(SELECT * ~のアスタリスク部分)を使って全部のカラムを取得してバックエンドのスクリプトで処理するのもアリですが、ここで問題が発生します。
ワイルドカードで SELECT すると
クエリ実行にあたってカラム名への変換処理が行われる
結果セットに含めるデータ量がカラムの数だけ増えるので、メモリを無駄に消費する
単純に、何のカラムが必要な処理なのかわかんなくて可読性とかメンテ性が落ちる
という欠点があるんです。
じゃあこの逆にしたらいいんじゃないっすかね?
ってことで必要なカラムだけ SELECT したら
カラム名へ変換する処理がなくなるから無駄な処理が減る
全カラムが必要でも、アスタリスクを使わないで全項目を書くと、変換処理を省けるから無駄な処理が減る
結果セットに含めるデータ量が減ってメモリを節約できる(従量課金なら、なおさらお金も節約できる)
必要なカラムが判るから可読性が上がるので、メンテも楽
例えばこんなテーブルがあるとき
CREATE TABLE `sumple_users` (
`id` int(11) NOT NULL AUTO_INCREMENT
,`username` varchar(64) NOT NULL DEFAULT ''
,`email` varchar(255) NOT NULL
,`password` varchar(255) NOT NULL
,`login_hash` varchar(255) NOT NULL DEFAULT ''
,`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
SELECT * FROM `sumple_users`;
こういうクエリを
SELECT `id`, `username`, `email`, `password`, `login_hash`, `created_at`, `updated_at` FROM `sumple_users`;
という感じに書きます。
これでオーバーヘッドが減ります。