MySQL COUNT関数の使用と最適化
COUNT関数は何に使いますか?
COUNTは1つの専用の関数で、通常は2つの異なる方法があります。値とデータ行を計算します。値とは、非空(Non-NULL)式(NULLの値が欠けている)を意味します。COUNTのパラメータで列名または他の表式を指定した場合、COUNT関数は値を計算する回数です。これは多くの人を困惑させて、相当部分の原因は値とNULLの概念がはっきりしないのです。
もう一つのCOUNTの形式は、単純に結果セットのデータライン数を計算することである。これは、MySQLがCOUNT関数パラメータを知っている表式がNULLではない場合の計算です。最も典型的な例はCOUNT(*)です。これはデータテーブルを展開するすべての列の代替の形だと思うかもしれません。実際には、すべての列を無視してデータの行数だけを記録します。
よくあるエラーはCOUNTのパラメータで列名を指定して、データ行をカウントすると思います。結果の行数を取得するには、常にCOUNT(*)を使用する必要があります。これはあなたの照会文の意図を明確にし、性能問題を回避することができます。
MyISAMの「不思議」なところ
よくある誤解はMyISAMがCOUNTクエリにとって非常に早いです。MyISAMのCOUNT検索は確かに早いですが、このような速いシーンは非常に限られています。COUNT()検索はWHEREの条件がない時にこのような効果が得られます。MySQLがこの文を最適化できるのは、データテーブルの正確な行数を常に記憶エンジンが知っているからです。もしMySQLが、1つの列colがNULLではないことを知っていれば、COUNT(col)をCOUNT(COUNT)に変換して最適化することもできる。
MyISAMはCOUNTクエリにWHERE条件があり、または他の値をカウントするときは「不思議」なところがありません。他の記憶エンジンよりも速くて遅いかもしれません。他の要因によって違います。
シンプルなCOUNT最適化
データ行のインデックスを高くカバーしたい場合、またすべての行の数を集計する必要がある場合、MyISAMエンジンのCOUNT(*)を採用して最適化することができます。以下の例は標準的な世界データベースを使って、検索IDが5より大きい都市数を示す時の最適化力を示しています。書いたSQL文は下記の通りかもしれません。
id。
select_.タイプ
テーブル
ローソン
Extra
1
PRIMARY
City
6
Using where;Using index
2
SUBQUERY
NULL
NULL
Select tables optimized way
共通の問題は、同じ列の異なる値の数のクエリーがどのようにしてクエリー文で完了するかです。例えば、一つの照会文を通じて、色によって対応する数を調べたいです。SELECT COUNTなどのFROM itemsを使ってクエリーを完了することはできません。これで色の違いに応じた数が分かりません。あなたもWHERE条件に色を入れてはいけません。例えばSELECT COUNT(*)FROM items WHEREカラー=blue'ANDカラー=red'は色自体がお互いに反発するので、以下の方法で解決できます。
正確な数が必要ではない場合もありますが、この場合は近似値が使えます。EXPLAN最適化器で与えられた推定行数は、通常このようなシーンを満たすことができ、その場合は、実際のクエリの代わりにEXPLANを使用することができる。
多くの場合,正確な数は近似値に比べて非効率的である。ある取引先は彼らのウェブサイトのアクティブなユーザー数を統計することを要求しました。ユーザー数はキャッシュされ、30分ごとに更新される。これ自体は正確ではないので、見積もりを使っても大丈夫です。このクエリは、複数のWHERE条件を使用して、非アクティブユーザまたはデフォルトユーザ(特別なIDを持つ)を統計しないことを保証しています。これらの条件を除去し、countを少し修正するとより効率的になります。さらに最適化したのは不要なDISTINCTを除去する操作であり、FIlesortを一回取り除く操作です。最適化後の照会速度はより速く、ほぼ正確な結果を返します。
より複雑な最適化
一般的に、COUNTクエリは最適化しにくいです。これは通常、多くの行(多くのデータにアクセスすること)を統計する必要があります。MySQLの他のオプションは、インデックスをカバーするために使用されます。もしまだ足りないなら、システム全体のアプリケーションアーキテクチャを調整する必要があります。例えば、統計データテーブルを考慮したり、Memcachedなどの外部キャッシュシステムを使用したりする。私たちはよく似たような二つの問題に直面します。快速、正確、簡単です。中から二つを選ぶしかないです。
以上がMySQL COUNT関数の使用と最適化の詳細です。MySQL COUNTの使用と最適化に関する詳細について、他の関連記事に注目してください。
COUNTは1つの専用の関数で、通常は2つの異なる方法があります。値とデータ行を計算します。値とは、非空(Non-NULL)式(NULLの値が欠けている)を意味します。COUNTのパラメータで列名または他の表式を指定した場合、COUNT関数は値を計算する回数です。これは多くの人を困惑させて、相当部分の原因は値とNULLの概念がはっきりしないのです。
もう一つのCOUNTの形式は、単純に結果セットのデータライン数を計算することである。これは、MySQLがCOUNT関数パラメータを知っている表式がNULLではない場合の計算です。最も典型的な例はCOUNT(*)です。これはデータテーブルを展開するすべての列の代替の形だと思うかもしれません。実際には、すべての列を無視してデータの行数だけを記録します。
よくあるエラーはCOUNTのパラメータで列名を指定して、データ行をカウントすると思います。結果の行数を取得するには、常にCOUNT(*)を使用する必要があります。これはあなたの照会文の意図を明確にし、性能問題を回避することができます。
MyISAMの「不思議」なところ
よくある誤解はMyISAMがCOUNTクエリにとって非常に早いです。MyISAMのCOUNT検索は確かに早いですが、このような速いシーンは非常に限られています。COUNT()検索はWHEREの条件がない時にこのような効果が得られます。MySQLがこの文を最適化できるのは、データテーブルの正確な行数を常に記憶エンジンが知っているからです。もしMySQLが、1つの列colがNULLではないことを知っていれば、COUNT(col)をCOUNT(COUNT)に変換して最適化することもできる。
MyISAMはCOUNTクエリにWHERE条件があり、または他の値をカウントするときは「不思議」なところがありません。他の記憶エンジンよりも速くて遅いかもしれません。他の要因によって違います。
シンプルなCOUNT最適化
データ行のインデックスを高くカバーしたい場合、またすべての行の数を集計する必要がある場合、MyISAMエンジンのCOUNT(*)を採用して最適化することができます。以下の例は標準的な世界データベースを使って、検索IDが5より大きい都市数を示す時の最適化力を示しています。書いたSQL文は下記の通りかもしれません。
SELECT COUNT(*) FROM world.City WHERE ID > 5;
SHOW STATUSで調べたら4079行スキャンしました。負の条件で検索し、それらのIDが5以下の都市の数を引くと、スキャン結果を5行に減らすことができることが分かります。
SELECT (SELECT COUNT(*) FROM world.City) - COUNT(*) FROM world.City WHERE ID <= 5;
このクエリがより少ない行を読み取るのは、クエリの最適化段階でクエリを定数に変換し、EXPLANを使用して見ることができるからです。id。
select_.タイプ
テーブル
ローソン
Extra
1
PRIMARY
City
6
Using where;Using index
2
SUBQUERY
NULL
NULL
Select tables optimized way
共通の問題は、同じ列の異なる値の数のクエリーがどのようにしてクエリー文で完了するかです。例えば、一つの照会文を通じて、色によって対応する数を調べたいです。SELECT COUNTなどのFROM itemsを使ってクエリーを完了することはできません。これで色の違いに応じた数が分かりません。あなたもWHERE条件に色を入れてはいけません。例えばSELECT COUNT(*)FROM items WHEREカラー=blue'ANDカラー=red'は色自体がお互いに反発するので、以下の方法で解決できます。
SELECT SUM(IF(color = 'blue', 1, 0)) AS blue,
SUM(IF(color = 'red', 1, 0)) as red FROM items;
もう一つの融通性のある形式はSUMではなくCOUNTであり、値のない表現だけを保証した判決表現はfalseである。
SELECT COUNT(color = 'blue' OR NULL) as blue,
COUNT(color = 'red' OR NULL) as red FROM items;
近似を使う正確な数が必要ではない場合もありますが、この場合は近似値が使えます。EXPLAN最適化器で与えられた推定行数は、通常このようなシーンを満たすことができ、その場合は、実際のクエリの代わりにEXPLANを使用することができる。
多くの場合,正確な数は近似値に比べて非効率的である。ある取引先は彼らのウェブサイトのアクティブなユーザー数を統計することを要求しました。ユーザー数はキャッシュされ、30分ごとに更新される。これ自体は正確ではないので、見積もりを使っても大丈夫です。このクエリは、複数のWHERE条件を使用して、非アクティブユーザまたはデフォルトユーザ(特別なIDを持つ)を統計しないことを保証しています。これらの条件を除去し、countを少し修正するとより効率的になります。さらに最適化したのは不要なDISTINCTを除去する操作であり、FIlesortを一回取り除く操作です。最適化後の照会速度はより速く、ほぼ正確な結果を返します。
より複雑な最適化
一般的に、COUNTクエリは最適化しにくいです。これは通常、多くの行(多くのデータにアクセスすること)を統計する必要があります。MySQLの他のオプションは、インデックスをカバーするために使用されます。もしまだ足りないなら、システム全体のアプリケーションアーキテクチャを調整する必要があります。例えば、統計データテーブルを考慮したり、Memcachedなどの外部キャッシュシステムを使用したりする。私たちはよく似たような二つの問題に直面します。快速、正確、簡単です。中から二つを選ぶしかないです。
以上がMySQL COUNT関数の使用と最適化の詳細です。MySQL COUNTの使用と最適化に関する詳細について、他の関連記事に注目してください。