MySQL クエリのパフォーマンス改善テクニック -その7- テーブルにエイリアスをつけろ
フルスタックエンジニア()な clown の note にようこそ。
はじめに
今回やること
MySQL のクエリパフォーマンス改善のひとつとして、簡単にできるクエリ改修をします。
今回はエイリアスを扱います。
対象者
RSDB を使ってて、ユーザから重いって言われてるあなた
DB 担当になったけど、何から手を付けていいかわかんないあなた
MySQL を使っているあなた(他 DB でも基本はそんなに違わないです)
ざっくり説明
今日も DBMS と格闘してますか?
正直、クエリなんて究極は動けばいいんですけど、エイリアスを知ってるか知らないかだけの差で、パフォーマンスが変わります。
あなたの書いたこのクエリ。いつも、カラムがどのテーブルに属しているか解析させちゃってるよね?
なんていうお小言を貰っちゃったりします。
じゃあ、エイリアスを使ったクエリを書けばいいじゃない。
というのが今回の話。
そんなことも知らないの?とか言われるのが嫌!
クエリが遅いのは判ってるのに、なんら手をうてない自分が嫌!
という悩みを解決するのがこの記事です。
準備
下記のテーブルを用意します。
前段となる「MySQL で explain してますか?」の記事を読んでいただくと、より味わいが深くなります。
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;
このテーブルには、こんなデータが入っています。
mysql> select * from `sumple_users`;
+-------+------------+----------------------+----------+------------+---------------------+---------------------+
| id | username | email | password | login_hash | created_at | updated_at |
+-------+------------+----------------------+----------+------------+---------------------+---------------------+
| 1 | clown1 | clown1@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 2 | clown2 | clown2@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 3 | clown3 | clown3@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 4 | clown4 | clown4@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 5 | clown5 | clown5@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
~
中略
~
| 9995 | clown9995 | clown9995@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 9996 | clown9996 | clown9996@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 9997 | clown9997 | clown9997@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 9998 | clown9998 | clown9998@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 9999 | clown9999 | clown9999@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
| 10000 | clown10000 | clown10000@email.com | abc | def | 2023-08-13 00:00:00 | 0000-00-00 00:00:00 |
+-------+------------+----------------------+----------+------------+---------------------+---------------------+
10000 rows in set (0.01 sec)
エイリアスを使う
エイリアスってなぁに?
エイリアス(alias)は、英単語の和訳そのままの通り「別名」のことで、要するに渾名です。
あだ名をつけるとなんでパフォーマンスが変わるの?という疑問も一緒に解決しましょう。
エイリアスを使わないクエリ
こんなクエリ(↓)があります。
SELECT
`id`
, `username`
FROM
`sumple_users`
WHERE
`id` = 1;
比較的シンプルで、WHERE 句も用いていることから、このクエリでパフォーマンスが悪いと実感することはないですが、こういうクエリで SELECT しているカラムって、どのテーブルに属しているのか?を DB ミドルウェアが解析しちゃうんです。
便利な反面、解析する処理が走るため、ちょっと遅くなります。
そのちょっとが積み重なると…
ということでエイリアスを使って、このカラムはこのテーブルにあるよ!と教えてあげると良さそうです。
エイリアスを使うクエリ
こんな感じ(↓)になります。
SELECT
`SU`.`id`
, `SU`.`username`
FROM
`sumple_users` as SU
WHERE
`SU`.`id` = 1;
このようにエイリアスを指定してあげると、カラムがどのテーブルに属するか?という判定を省くことが可能になります。
ということは、パフォーマンスが改善する。ということです。
複数のテーブルを扱うクエリで絶大(というと大袈裟かも)な効果が出ます。
たったこれだけでクエリパフォーマンスを上げることが可能です。
支援のお願い
素材引用元
アイコン
見出し
この記事が気に入ったらサポートをしてみませんか?