MySQLのカウントが(1)実際に(*)よりも速く、それを数える?とにかく、私の同僚が言っているが、私は暫定的に右に感じる、そして正確に自分を見ていませんか?私は彼らのようにあなたを伝える場合、あなたはそれを信じますか?
あります Where
条件 count
スキャンコードの結果に基づいて、count
任意の数の行では、その性能はあなたにもっと依存している Where
そうではないだけの記事のために私たちは、条件 Where
の状況を説明しました。
MyISAMのエンジンがダウンしたレコードの行数を一覧表示されますので、実行 count(*)
時間は、直接、高効率の数を返します。デフォルトのMySQL 5.5エンジンが原因で増加したバージョンコントロール(MVCC)の理由ではInnoDB、InnoDBのに切り替えられた後、複数のトランザクションが同時に存在しているデータや更新操作にアクセスするための時間があり、各トランザクションは、彼の視界を維持する必要がある場合、各トランザクション問い合わせへの行の数は、あなたが特定の行数をキャッシュすることはできませんので、彼は常にする必要があり、異なる count
行数のすべてを見てください。まあ count(1)
と count(*)
違いますか?
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
これは説明の公式サイト、単純にクリックされた阅读原文
公式テキストを見て、そう実際には2つの実装と同じ、その後、具体的な理由は同じ?
私たちが最初に理解する必要があり、この質問探検 count
以下の意味は公式ウェブサイトで与えられた定義ですが
Returns a count of the number of non-NULL values of expr in the rows retrieved by a SELECT statement. The result is a BIGINT value.
説明は、それが重合の機能、そしてSELECT結果セットがカウントされているすべての最初の私たちが見るここ列式exprを取得するための実質的に非NULL値が返され、カウントSELECT文で、ですが、パラメータがNULLではない必要があります。だから我々は、公式ウェブサイトの内容を読み続けます:
COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.
大雑把に内容が異なる(*)カウント、と言うことです、彼は数(1)1(*)カウント、一定の真の表現であるため、戻り値は彼のカウントは空になります計算さを気にしたりはカウントされません(1 )すべての結果セットの数であるため、その性質上違いはありません。
もちろん、この場所はInnoDB自体は、それがために、二次インデックスの最小値を使用するいくつかの最適化を行っている count
最適化を照会します。二次インデックスがクラスタ化インデックスを選択しないだろうがある場合は、この設計は、多くのオーバーヘッドを節約の観点から、単一のIOです。
ここでは、本質的には上記と同じである、実際にはCOUNT(*)とcount(1)を参照してください、そして、カウント(列)は、それが起こったのかですか?
COUNT(列)は、テーブル全体を横断するが、それは再び二つの主要キーに従って必要な場合の差は、コンテンツの主キーを解決する必要がある場合、それは、次に蓄積、気柱かの決意後の値を取得することですコンテンツへのアクセスだけでなく、IO操作効率が言葉に従ったものである場合には、カウント数(列)の性能は、確かに最初の二つの自分ほど良好ではありません。count(*)=count(1)>count(primary key)>count(column)
クエリのカウント(*)は、すべてのデータセットに依存するので、それは我々がそれを数える全額を避けるために、可能な限り設計に必要なものではないのですか?多くの場合、我々は予見可能なカウントクエリのための適切なバッファは、Redisのことができ、個別のMySQLは、もちろん、我々は一貫性の問題を検討する必要があるのいずれかの方法をテーブルをカウントすることができます。