MySQLのCOUNT(DISTINCT)処理が遅い原因と、インデックスを使った高速化の方法
MySQLのCOUNT(DISTINCT)を高速化するにはインデックスが有効
MySQLでCOUNT(DISTINCT)を実行した際に処理が遅くなる場合は、対象カラムにINDEX(インデックス)を作成することで大幅に高速化できます。ここでは、複合インデックスを設定したテーブルを作成し、実際にCOUNT(DISTINCT)クエリを実行する手順を解説します。
1. インデックス付きテーブルを作成する
まず、FirstNameとLastNameの2つのカラムに複合インデックスを設定したテーブルを作成します。
mysql> create table DemoTable1905
(
FirstName varchar(20),
LastName varchar(20),
INDEX F_L_Name(FirstName,LastName)
);
Query OK, 0 rows affected (0.00 sec)2. テストデータを挿入する
INSERTコマンドを使って、サンプルレコードをいくつか登録します。意図的に重複データも含めています。
mysql> insert into DemoTable1905 values('John','Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('John','Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('Adam','Smith');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('John','Doe');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('Chris','Brown');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1905 values('Adam','Smith');
Query OK, 1 row affected (0.00 sec)3. 登録されたレコードを確認する
SELECT文で全レコードを表示してみましょう。
mysql> select * from DemoTable1905;
実行結果は以下の通りです。
+-----------+----------+ | FirstName | LastName | +-----------+----------+ | Adam | Smith | | Adam | Smith | | Chris | Brown | | John | Doe | | John | Doe | | John | Smith | +-----------+----------+ 6 rows in set (0.00 sec)
4. COUNT(DISTINCT)で重複を除いた件数を取得する
次に、重複を除外してFirstNameの一意な値をカウントするクエリを実行します。
mysql> select count(distinct FirstName) from DemoTable1905;
実行結果は以下の通りです。
+---------------------------+ | count(distinct FirstName) | +---------------------------+ | 3 | +---------------------------+ 1 row in set (0.00 sec)
まとめ
この例では、FirstNameとLastNameに複合インデックス「F_L_Name」を事前に作成しておくことで、COUNT(DISTINCT)クエリがインデックスを活用できるようになります。大量のデータを扱うテーブルでは特に効果が大きく、フルテーブルスキャンを回避できるため、クエリの応答時間を大幅に短縮できます。
なお、インデックスは検索対象となるカラムの組み合わせに合わせて適切に設計することが重要です。WHERE句やGROUP BYで頻繁に使用されるカラムに対してインデックスを張ることで、全体的なパフォーマンス向上が期待できます。
-
MySQLで重複のない値とその件数を取得する方法
MySQLでテーブル内の重複を除いた一意の値と、それぞれの値が出現する件数を一緒に取得したい場合は、GROUP BY句とCOUNT()関数を組み合わせるのが基本です。この記事では、具体的な手順をサンプルコード付きで解説します。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成します。mysql> create table DemoTable754 (ProductPrice int);Query OK, 0 rows affected (0.48 sec)2. テストデータを挿入するINSERTコマンドを使って、意図的に重複を含むデータを登録します。mysql> in
-
MySQLでSELECT DISTINCTを高速化する方法:インデックス活用テクニック
MySQLでSELECT DISTINCTを高速化するには MySQLでSELECT DISTINCTクエリの実行速度を改善したい場合、対象となるカラム(またはカラムの組み合わせ)にインデックスを作成するのが最も効果的な方法です。インデックスが存在すると、MySQLは重複値の排除を効率的に行えるため、大量データでも高速な処理が可能になります。 ここからは、実際にサンプルテーブルを使いながら手順を解説します。 1. サンプルテーブルを作成する まずは検証用のテーブルを作成しましょう。 mysql> create table DemoTable ( Name varchar(40)