首页 > 数据库 > MySQL > 正文

mysql中count(id) count(1) count(*)的用法区别

2024-07-24 12:37:06
字体:
来源:转载
供稿:网友

在mysql中很多朋友在写统计count时每次可能都不一样如,count(id) count(1) count(*)这三个统计出来的结果是一样的,但它们之间的性能有比较过吗?下面我来给大家举例说明一下.

表结构如下,代码如下:

  1. mysql> show create table userG; 
  2. *************************** 1. row *************************** 
  3.        Tableuser 
  4. Create TableCREATE TABLE `user` ( 
  5.   `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
  6.   `namevarchar(50) NOT NULL
  7.   `pwd` varchar(50) NOT NULL
  8.   `email` varchar(100) NOT NULL
  9.   `phone` varchar(30) NOT NULL
  10.   `sex` enum('F','M','N'NOT NULL DEFAULT 'N'
  11.   `addres` varchar(100) NOT NULL
  12.   `tag` varchar(100) NOT NULL
  13.   PRIMARY KEY (`id`), 
  14.   KEY `name` (`name`) 
  15. ) ENGINE=InnoDB AUTO_INCREMENT=5000003 DEFAULT CHARSET=utf8 COMMENT='用户表' 
  16. 1 row in set (0.00 sec) 

下面做一下explain,1、count(id),代码如下:

  1. mysql> select count(id) from user
  2. +-----------+ 
  3. count(id) | 
  4. +-----------+ 
  5. |   5000002 | 
  6. +-----------+ 
  7. 1 row in set (1.93 sec)mysql> explain select count(id) from user
  8. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows    | Extra       |+----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  9. |  1 | SIMPLE      | user  | index | NULL          | name | 152     | NULL | 4998401 | Using index |+----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+1 row in set (0.05 sec)2、count(1)  
  10. mysql> select count(1) from user
  11. +----------+ 
  12. count(1) | 
  13. +----------+ 
  14. |  5000002 | 
  15. +----------+ 
  16. 1 row in set (0.90 sec)mysql> explain select count(1) from user
  17. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  18. | id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows    | Extra       | 
  19. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  20. |  1 | SIMPLE      | user  | index | NULL          | name | 152     | NULL | 4998401 | Using index | 
  21. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  22. 1 row in set (0.00 sec)3、count(*)  
  23. mysql> select count(*) from user
  24. +----------+ 
  25. count(*) | 
  26. +----------+ 
  27. |  5000002 | 
  28. +----------+ 
  29. 1 row in set (0.87 sec)mysql> explain select count(*) from user
  30. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  31. | id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows    | Extra       | 
  32. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  33. |  1 | SIMPLE      | user  | index | NULL          | name | 152     | NULL | 4998401 | Using index | 
  34. +----+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 
  35. 1 row in set (0.00 sec) 

比较三个查询,explain的结果一模一样,这说明这三个的效率是一样的吗?再看看下面三个操作,带上where条件 sex='F',以下三个操作中间均会重启mysql服务,代码如下:

  1. 1、count(id)  
  2. mysql> select count(id) from user where sex='F'
  3. +-----------+ 
  4. count(id) | 
  5. +-----------+ 
  6. |   1681259 | 
  7. +-----------+ 
  8. 1 row in set (18.87 sec) 
  9. mysql> explain select count(id) from user where sex='F'
  10. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  11. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       | 
  12. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  13. |  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 4998401 | Using where | 
  14. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  15. 1 row in set (0.00 sec)2、count(1)  
  16. mysql> select count(1) from user where sex='F'
  17. +----------+ 
  18. count(1) | 
  19. +----------+ 
  20. |  1681259 | 
  21. +----------+ 
  22. 1 row in set (4.81 sec) 
  23. mysql> explain select count(1) from user where sex='F'
  24. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  25. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       | 
  26. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  27. |  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 4998401 | Using where | 
  28. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  29. 1 row in set (0.00 sec)3、count(*)  
  30. mysql> select count(*) from user where sex='F'
  31. +----------+ 
  32. count(*) | 
  33. +----------+ 
  34. |  1681259 | 
  35. +----------+ 
  36. 1 row in set (4.69 sec) 
  37. mysql> explain select count(*) from user where sex='F'
  38. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  39. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows    | Extra       | 
  40. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+   //Vevb.com 
  41. |  1 | SIMPLE      | user  | ALL  | NULL          | NULL | NULL    | NULL | 4998401 | Using where | 
  42. +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ 
  43. 1 row in set (0.00 sec) 

以上三种查询有一些差别,其中count(id)用时最长,count(*)比count(1)速度要稍微快一点.

两组查询,带条件的都没有使用到索引,扫描了全表,而没有条件的则使用了索引name,所以在应用中尽量不使用count(*)和count(1),杜绝使用count(primary_key).

网上有很多资料说:

没有主键,count(1)比count(*)快;

有主键的话,count(primary_key)最快,但是在上面的测试中发现,count(primary_key)是最慢的,难道是测试不准确?这个有待验证。

如果表只有一个字段,则count(*)是最快的.

说明:

count(1)中的1并不是指第一个column;

count(*)和count(1)一样,包括对值为NULL的统计;

count(column)不包括对值为NULL的统计,这里的column指的不是primary_key;

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表