MySQL クエリのパフォーマンス改善テクニック -その4- ORDER BY では、カラム名を記述しよう
フルスタックエンジニア()な 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)
ORDER BY では、カラム名を記述しよう
ORDER BY 句では、ソートキーを指定しますよね。
ここでは、本来のカラム名じゃなくて列番号を指定できます。
こんな感じです。
SELECT `id`, `username` FROM `sumple_users` ORDER BY 1 ASC;
でもこれ、カラムの位置番号を指定すると、本来のカラム名への変換処理が発生します。
ということは
そう。パフォーマンスが落ちるんです。
じゃあどうする?
答えは簡単。カラム名をキチンと書いてあげればいいんです。
SELECT `id`, `username` FROM `sumple_users` ORDER BY `id` ASC;
細かい話をすると、カラムの位置番号を使うことが有効そうな場面は、クエリを動的に生成するときでしょう。
普通にエディタや IDE で読む時、カラムの位置番号で書かれていたら、(上述の単純なクエリならそれほど問題じゃないですけど)どのカラムでソートしているのか、一発でわかるのはなかなか難しいと思います。なので、可読性が下がるからメンテとかしづらいです。
支援のお願い
素材引用元
アイコン
見出し
この記事が気に入ったらサポートをしてみませんか?