2011-07-20 10 views
4

私は、(良いか悪いか)のパフォーマンスを知るためにクエリを分析する方法について質問があります。 私は多くのことを検索し、以下のようなものだ:analyze query mysql

SELECT count(*) FROM users; => Many experts said it's bad.

SELECT count(id) FROM users; => Many experts said it's good.

を表を参照してください。

+---------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+---------------+-------------+------+-----+---------+----------------+ 
| userId  | int(11)  | NO | PRI | NULL | auto_increment | 
| f_name  | varchar(50) | YES |  | NULL |    | 
| l_name  | varchar(50) | YES |  | NULL |    | 
| user_name  | varchar(50) | NO |  | NULL |    | 
| password  | varchar(50) | YES |  | NULL |    | 
| email   | varchar(50) | YES |  | NULL |    | 
| active  | char(1)  | NO |  | Y  |    | 
| groupId  | smallint(4) | YES | MUL | NULL |    | 
| created_date | datetime | YES |  | NULL |    | 
| modified_date | datetime | YES |  | NULL |    | 
+---------------+-------------+------+-----+---------+----------------+ 

しかし、私はそれのためにEXPLAINコマンドを使用しようとすると、私が得ました結果:

EXPLAIN SELECT count(*) FROM `user`; 

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
| 1 | SIMPLE  | user | index | NULL   | groupId | 3  | NULL | 83 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

EXPLAIN SELECT count(userId)からuserを選択してください。だから、

+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
| 1 | SIMPLE  | user | index | NULL   | groupId | 3  | NULL | 83 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

、私にとって最初のもの: が、それは同じ性能だI理解することができますか?


P/S:MySQLバージョンは5.5.8です。

答えて

11

いいえ、できません。 Explainはmysqlによって行われたすべての作業を反映しているわけではありません。

具体的には約count(*)count(id)とは何ですか?最初のものは常に2番目のものより遅くはなく、場合によってはより速いものもあります。

count(col)意味はamount of not null valuesであり、count(*)は行数です。

idNULLすることはできませんので、PKであるとして、おそらくMySQLは、同様count(*)に書き換えることでcount(col)を最適化することができます(ない場合 - それは速くされていない、NULLSのためにルックアップする)が、私はまだあなたがそのような中でCOUNT(*)を使用することを提案しますケース。

また、内部プロセスは、使用されているストレージエンジンによって異なります。 myisamの場合、両方の場合に返される事前計算された行数(WHEREを使用しない限り)。

0

この例では、パフォーマンスは同じです。

実行計画では、オプティマイザが、count(*)を使用したときにプライマリキーを使用してレコードの総数を検出する必要があることを知ることができます。

0

カウントの際に大きな違いはありません。その理由は、ほとんどのオプティマイザが、行を単独で数える最善の方法を見つけ出すためです。

パフォーマンスの違いは、値の検索とインデックスの欠落にあります。したがって、{f_name、l_name}に割り当てられたインデックスのないフィールドを検索し、{userID(mysqlは主キーのインデックスを自動的に使用する)フィールド、groupID(foraignキーのように見える)}を検索すると、パフォーマンスの違いが表示されます。