読者です 読者をやめる 読者になる 読者になる

【MySQL】SELECT * (アスタリスク) (全取得)が遅いのか検証する

個人的にDBからデータを引っ張るときに必要なカラムのみを指定するのが嫌い。

カラム指定すると
検索条件が同じなのに、
必要なカラムが異なるだけで複数のAPIを実装し、
使う側は適切なAPIを選択しなければならない。
APIの命名にも苦労するし、そもそもDAOが肥大化する可能性があるのがイヤ。
命名も実装も上手くやれば問題ないんだろーけど、実際はそーもいかない気が・・・。

ということで、
必要なカラムのみ指定するのが正しいとは思うけど、
SELECT * で全カラム引っ張りたい。
でも、無駄なカラムを引っ張るとパフォーマンスが気になる。

ということで、検証してみた。

結論から言うと、結構変わるかもしれない。


以下がテスト環境。
CentOS 6.5
MySQL 5.5
メモリ:500MB(buffer_poolに384MB割り当て)


以下が今回のテストテーブル
int型のカラムを30個用意しました。

create table th (score1 int, score2 int, ....  score29 int, score30 int);


テストデータは各カラムにランダムな整数を入れて11万レコード用意しました。


テストケースは以下。

1. 全選択 ... select * from th;
2. 1カラム選択 ... select score1 from th;
3. 2カラム選択 ... select score1, score2 from th;
4. 5カラム選択 ... select score1 ~ score5 from th;
5. 10カラム選択 ... select score1 ~ score10 from th;
6. 20カラム選択 ... select score1 ~ score20 from th;



計測して実行時間だけまとめたのが以下。

1. 全選択 ... 0.4sec
2. 1カラム選択 ... 0.07sec
3. 2カラム選択 ... 0.08sec(実際は1カラム選択と変わらない)
4. 5カラム選択 ... 0.12sec
5. 10カラム選択 ... 0.17sec
6. 20カラム選択 ... 0.29sec


やっぱりデータ量が多くなるから実行速度は遅くなる。
1カラムと5カラムの差が 0.05sec というのも微妙に無視できない・・・。
とはいえ、11万件取得した場合だから、
主キーで1レコードしか取得しない場合は全カラム取得でもいいと思う。
もちろん、カラム数にもよる。

ちなみに詳細結果は以下。
詳細といっても profile 取っただけだけど・・・。

1. 全選択 … 0.4sec

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000058 |
| checking permissions | 0.000008 |
| Opening tables       | 0.000035 |
| System lock          | 0.000009 |
| init                 | 0.000053 |
| optimizing           | 0.000005 |
| statistics           | 0.000015 |
| preparing            | 0.000010 |
| executing            | 0.000003 |
| Sending data         | 0.498815 |
| end                  | 0.000008 |
| query end            | 0.000004 |
| closing tables       | 0.000007 |
| freeing items        | 0.000242 |
| logging slow query   | 0.000002 |
| cleaning up          | 0.000003 |
+----------------------+----------+


2. 1カラム選択 … 0.07sec

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000048 |
| checking permissions | 0.000007 |
| Opening tables       | 0.000019 |
| System lock          | 0.000009 |
| init                 | 0.000013 |
| optimizing           | 0.000004 |
| statistics           | 0.000010 |
| preparing            | 0.000007 |
| executing            | 0.000003 |
| Sending data         | 0.071014 |
| end                  | 0.000008 |
| query end            | 0.000004 |
| closing tables       | 0.000007 |
| freeing items        | 0.003563 |
| logging slow query   | 0.000004 |
| cleaning up          | 0.000002 |
+----------------------+----------+

3. 2カラム選択 … 0.08sec

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000051 |
| checking permissions | 0.000007 |
| Opening tables       | 0.000020 |
| System lock          | 0.000008 |
| init                 | 0.000014 |
| optimizing           | 0.000004 |
| statistics           | 0.000010 |
| preparing            | 0.000007 |
| executing            | 0.000003 |
| Sending data         | 0.086212 |
| end                  | 0.000008 |
| query end            | 0.000003 |
| closing tables       | 0.000007 |
| freeing items        | 0.003402 |
| logging slow query   | 0.000004 |
| cleaning up          | 0.000002 |
+----------------------+----------+

4. 5カラム選択 … 0.12sec

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000052 |
| checking permissions | 0.000007 |
| Opening tables       | 0.000020 |
| System lock          | 0.000008 |
| init                 | 0.000016 |
| optimizing           | 0.000004 |
| statistics           | 0.000011 |
| preparing            | 0.000009 |
| executing            | 0.000003 |
| Sending data         | 0.119277 |
| end                  | 0.000014 |
| query end            | 0.000004 |
| closing tables       | 0.000007 |
| freeing items        | 0.001274 |
| logging slow query   | 0.000010 |
| cleaning up          | 0.000003 |
+----------------------+----------+

5. 10カラム選択 … 0.17sec

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000056 |
| checking permissions | 0.000007 |
| Opening tables       | 0.000020 |
| System lock          | 0.000008 |
| init                 | 0.000020 |
| optimizing           | 0.000004 |
| statistics           | 0.000010 |
| preparing            | 0.000007 |
| executing            | 0.000002 |
| Sending data         | 0.170553 |
| end                  | 0.000009 |
| query end            | 0.000003 |
| closing tables       | 0.000007 |
| freeing items        | 0.000316 |
| logging slow query   | 0.000002 |
| cleaning up          | 0.000003 |
+----------------------+----------+

6. 20カラム選択 … 0.29sec

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000044 |
| checking permissions | 0.000005 |
| Opening tables       | 0.000014 |
| System lock          | 0.000006 |
| init                 | 0.000016 |
| optimizing           | 0.000003 |
| statistics           | 0.000008 |
| preparing            | 0.000005 |
| executing            | 0.000002 |
| Sending data         | 0.291784 |
| end                  | 0.000008 |
| query end            | 0.000004 |
| closing tables       | 0.000007 |
| freeing items        | 0.000313 |
| logging slow query   | 0.000002 |
| cleaning up          | 0.000003 |
+----------------------+----------+