(*)でMySQLを数えます

  • 異なるストレージエンジンを使用します

MySQLの、より一般的に使用されるのMyISAMとInnoDBの二つのストレージエンジンの日々の開発では。両者の違いは、使用回数である(*)関数は、テーブル内の行の特定の数を計算します。

行のMyISAMテーブルの特定の番号で保存されますので、このコードは、MyISAMストレージエンジンを実行しているので、MyISAMのは、単純に保存する行の良い番号をお読みください。テーブルには、トランザクション操作のように使用されていない場合はこのように、これが最良の最適化があります。しかし、InnoDBストレージエンジンは、テーブルの行の特定の番号を保存しませんどのように多くの行ので、InnoDBストレージエンジンでこのコードの実装では、InnoDBは再び計算するには、テーブル全体をスキャンします。

  • COUNT(*)関数の原則の実装

別々のストレージエンジンでは、COUNT(*)関数が実行されて異なっています。MyISAMストレージエンジンでは、(*)カウントテーブルを読み取り、保存されたデータを返し、ストレージエンジンInnoDBは、COUNT(*)は、開始の間テーブルメモリ内のデータを読み取るための機能である行の数の直接関数でありますバッファー、その後、全表走査線数が記録され得ます。

カウント機能、二つのストレージエンジンの効果は同じである使用条件に結合されたとき、それはアイテムのフィールド値を計算するの数にテーブル全体を走査します。句は、列の値は、統計の数とすることができると統計の結果セット内の行の数、MyISAMテーブルCOUNT()および他のストレージエンジンは異なっていない場合、もはや素晴らしい速度ではありません。

  • 近似値を使用します

時には完全にする必要はありませんCOUNTの正確な値、近似が、この時点で交換することができます。オプティマイザの推定値は良い近似である行数をEXPLAIN、EXPLAINの実装は、実際にクエリを実行する必要はありませんが、コストが非常に低いです。

実際にクエリを実行すると説明していないため、コマンドが速い説明し、クエリオプティマイザは、[しかし]行の数を推定しました。

  • (異なる数の使用量)を区別するために、

    カウント(主キーのID) 

      InnoDBエンジンは、テーブル全体を横断する、各行のID値は、サーバ層に戻し、取り出されます。サーバー層IDを取得し、判決は、蓄積された行は空になることはほとんどありません。

    カウント(1)

      InnoDBエンジンは、値をテーブル全体を横断し、なく。各行返さサーバ層に、蓄積された行を空にする決意が不可能である、に番号「1」を置きます。

    数(主キーのID)に高速に実行されたよりも、(1)カウント。復帰動作IDが解析されたデータライン、およびコピーエンジンからのフィールド値を伴うため。

    カウント(フィールド)

      「フィールド」はNOT NULLとして定義されている場合、その行によって、この行は、記録フィールド内から読み出され、NOT NULL、累積行決定されます。

      この「フィールドが」ヌルを許可するように定義されている場合は、時間の実装で、裁判官はNULLかもしれませんが、また、再び蓄積nullではないだけを取り出して値を決定します。 

    しかし、COUNT(*)は例外で

      すべてのフィールドを取り出すことはないが、具体的には、値が最適ではないでしょう。(*)確かにnullでないカウント、行が蓄積されます。

    結論があるので:ソート効率、そして、(フィールド)<数(主キーID)<数(1)≈count(*)をカウントし、我々は、使用回数(*)またはcount(1)を作成することをお勧めします。

 

次の例は、カウント最適化されます。

1.まず、我々はInnoDBのテーブルを作成する必要があり、大規模なフィールド(またはそれ以上含むフィールド)が含まれています:

 

CREATE TABLEを`qstardbcontent`(
  `)20(BIGINT id` NOT NULL DEFAULT '0'、
  'content` MEDIUMTEXT、
  `length` INT(11)NOT NULLデフォルト'0'、
  PRIMARY KEY(` id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8を

 

50万データを挿入し2、各データ5K

 

3.ドゥSELECT COUNT(*)qstardbcontentから

 

時間のかかる13分28秒を必要とする数(*)を実行するために50万人近く、より多くのコンテンツデータを見ることができます

レッツ・最適化され、長さフィールドにインデックスを追加し、SQLを実行します。ALTER TABLE qstardbcontentのADDのKEY(長さ);

 

インデックスの構築が完了した後、次いでqstardbcontentから選択数(*)を実行します。

 

私たちは、お問い合わせを完了するために、ちょうど354ミリ秒で、全体の統計クエリは非常に高速で見ることができます。

 

公開された21元の記事 ウォンの賞賛0 ビュー2257

おすすめ

転載: blog.csdn.net/hfaflanf/article/details/103702675