1

3 つの列 (すべて INT) で構成される約 1 億行のテーブルがあります。

id | c_id | l_id

基本でもインデックスを使っているのに

select count(*), c_id 
from   table 
group by c_id;

完了するまでに 16 秒 (MYISAM) から 25 秒 (InnoDB) かかります。

別のテーブルでカウントを追跡せずにこのプロセスを高速化する方法はありますか (トリガーを使用するなど)?

/編集: すべての列にインデックスがあります

4

2 に答える 2

2

同じクエリを実行するための可能な方法については、実行プランを参照してくださいSqlFiddle

SELECT COUNT(id)c_id私が提供したテストセットでインデックスが作成されていない場合は、より高速になります。

それ以外の場合はCOUNT(*)、インデックスの最適化がクエリで使用されない可能性があるため、を使用する必要があります。

また、mysqlはこの事実に基づいて何が優れているかを判断するため、DBの行数とENGINEタイプにも依存します。

selectの前に入力して、クエリを実行する前に、クエリの実行プランを常に確認する必要がEXPLAINあります。

ほとんどの場合、大きなデータセットでは、同じ実行プランになるはずですCOUNT(*)COUNT(id)

于 2013-02-12T11:33:49.540 に答える
1

パフォーマンスの問題を引き起こすのは ではなく、Count(*)1 億行にグループ化することです。

c_id 列にインデックスを追加する必要があります

于 2013-02-12T11:19:30.690 に答える