はい。違いは、節が集計の後HAVING
に評価され、節が前に評価されることです。WHERE
通常、これにより を使用することでパフォーマンスが向上しますが、WHERE
常に 100% とは限りません。たとえば、次のようにします。
create table foo(type int, data int);
create index bar on foo(id);
insert into foo values(1,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(2,3);
insert into foo values(3,3);
insert into foo values(5,3);
このクエリは次のように優れていWHERE
ます。
select type, sum(data)
from foo
where type = 5
group by type;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo ref bar bar 5 const 1 100 where の使用
select type, sum(data)
from foo
group by type
having type = 5;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo インデックスバー 5 8 100
しかし、値が十分に選択的でないため、このクエリは実際には としてパフォーマンスが向上します。HAVING
type=2
select type, sum(data)
from foo
where type = 2
group by type;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo ALL bar 8 62.5 where の使用
select type, sum(data)
from foo
group by type
having type = 2;
ID SELECT_TYPE テーブル タイプ POSSIBLE_KEYS KEY KEY_LEN REF ROWS FILTERED EXTRA
1 SIMPLE foo インデックスバー 5 8 100