MySQLではSELECT *より列名を明示した方が高速?パフォーマンスの違いを解説
MySQLにおいて、SELECT *は必要な列だけを明示的に指定する方法よりも遅くなります。SELECTクエリを書く際は、取得したい列名を明示的に記述する方が良い選択とされています。ここでは、簡単なサンプルを使ってその違いを確認してみましょう。
テーブルの作成
まず、以下のようにテーブルを作成します。
mysql> create table DemoTable( Id int, Name varchar(20), Age int, ZipCode varchar(20), CountryName varchar(20) ); Query OK, 0 rows affected (0.82 sec)
レコードの挿入
次に、INSERTコマンドを使ってテーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable values(101,'Chris',23,'0909332','US'); Query OK, 1 row affected (0.48 sec) mysql> insert into DemoTable values(102,'Bob',24,'8747443','AUS'); Query OK, 1 row affected (0.50 sec) mysql> insert into DemoTable values(103,'Adam',21,'9988833','UK'); Query OK, 1 row affected (0.11 sec)
SELECT *ですべてのレコードを表示
まずはSELECT *を使って、テーブル内の全レコードを表示してみます。
mysql> select *from DemoTable;
実行すると、次のような出力が得られます。
+------+-------+------+---------+-------------+ | Id | Name | Age | ZipCode | CountryName | +------+-------+------+---------+-------------+ | 101 | Chris | 23 | 0909332 | US | | 102 | Bob | 24 | 8747443 | AUS | | 103 | Adam | 21 | 9988833 | UK | +------+-------+------+---------+-------------+ 3 rows in set (0.00 sec)
列名を明示してSELECTを実行
続いて、SELECT文ですべての列名を明示的に指定してみましょう。こちらの方が高速なアプローチとされています。
mysql> select Id,Name,Age,ZipCode,CountryName from DemoTable;
出力結果は先ほどと同じになります。
+------+-------+------+---------+-------------+ | Id | Name | Age | ZipCode | CountryName | +------+-------+------+---------+-------------+ | 101 | Chris | 23 | 0909332 | US | | 102 | Bob | 24 | 8747443 | AUS | | 103 | Adam | 21 | 9988833 | UK | +------+-------+------+---------+-------------+ 3 rows in set (0.00 sec)
なぜ列名を明示する方が良いのか?
小さなテーブルでは体感できる差はほとんどありませんが、本番環境の大規模なテーブルでは以下のようなメリットがあります。
- 不要なデータ転送を削減できる: 実際に必要な列だけを取得するため、ネットワーク帯域やメモリの使用量を抑えられます。特にTEXT型やBLOB型など大きなデータを持つ列がある場合に効果的です。
- カバリングインデックスを活用できる: 必要な列だけで構成されたインデックスが存在すれば、テーブル本体へのアクセスを回避でき、クエリが大幅に高速化します。
- 可読性・保守性の向上: どの列を使っているのかコードから明確になり、スキーマ変更時の影響範囲も把握しやすくなります。
- アプリケーションとの互換性: テーブルに新しい列が追加されても、既存のクエリ結果やアプリケーションの処理に予期しない影響を与えません。
以上の理由から、MySQLではSELECT *ではなく、必要な列名を明示的に指定するクエリの記述を心がけることがベストプラクティスといえます。
-
MySQLで重複している値(複数回出現するデータ)を抽出する方法
テーブル内に2回以上出現する値(重複データ)を抽出したい場合、「GROUP BY」句と「HAVING」句を「COUNT(*)」関数と組み合わせて使用します。WHERE句は集計前の行に対して条件を適用するため、集計後の結果を絞り込むにはHAVING句が必要になる点がポイントです。 1. サンプルテーブルを作成する まず、検証用のテーブルを作成しましょう。 mysql> create table DemoTable -> ( -> Value int &nbs
-
MySQLで2列の合計値が最大となるレコードを取得する方法
MySQLで2列の合計値が最大となるレコードを取得する方法 2列の合計値の最大値を取得するには、集計関数MAX()とサブクエリを組み合わせて使用します。まずはサンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1587 -> ( -> Value1 int, -> Value2 int -> ); Query OK, 0 rows affected (0.59 sec) 続いて、insertコマンドを使ってテーブルにいくつかのレコードを挿入します。 mysql> insert in