浅谈MySQL中count(*) 与 count(1)的问题

原文链接

摘要: 有问题或者不正确的地方请多指教~

浅谈MySQL select count(*) 与 count(1) 
最近看到同事在讨论MySQL关于count(1)、count(*)的执行效率等的问题,感兴趣去搜索并且自己做了一些实验,这里只探讨innnodb存储引擎

一、 首先看下MySQL5.6官方文档对于count函数的说明
COUNT(expr)

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.

COUNT(1) is only subject to the same optimization if the first column is defined as NOT NULL.

MySQL官方文档上对于count(1)和count()的比较没有过多的说明,只是说在第一个列为 NOT NULL时,count(1)与count()走同样的优化。

很多人说count(1)比count()快,因为count()操作会多一步转换操作,会将翻译成一个固定值,转换成count(1)类型 通过查阅相关资料发现现在随着MySQL版本的升级count(1)与count()的已经几乎相同。

二、 count(*)或count(1)的执行计划比较
1、 表结构
创建一个一千多万行记录的表
| huayu_test1 | CREATE TABLE huayu_test1 (
waybill_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '?????',
waybill_no varchar(20) NOT NULL COMMENT '???',
post_date datetime NOT NULL COMMENT '????????',
order_id varchar(50) DEFAULT NULL COMMENT '?????????',
batch_no varchar(50) DEFAULT NULL COMMENT '???',
biz_product_id varchar(20) NOT NULL COMMENT '??????',
biz_product_no varchar(20) NOT NULL COMMENT '??????',
biz_product_name varchar(50) NOT NULL COMMENT '??????',
sender_type varchar(20) DEFAULT NULL COMMENT '0 ?? 1????',
sender_id varchar(50) DEFAULT NULL COMMENT '??????',
sender_no varchar(50) DEFAULT NULL COMMENT '??????(??????)',
sender varchar(200) DEFAULT NULL COMMENT '??????',
sender_linker varchar(200) DEFAULT NULL,
sender_fixtel varchar(50) DEFAULT NULL COMMENT '??????',
sender_mobile varchar(50) DEFAULT NULL COMMENT '??????',
sender_addr varchar(200) DEFAULT NULL COMMENT '??????',
sender_country_no varchar(20) DEFAULT NULL COMMENT '??????',
sender_country_name varchar(50) DEFAULT NULL COMMENT '??????',
sender_province_no varchar(20) DEFAULT NULL COMMENT '??????',
sender_province_name varchar(50) DEFAULT NULL COMMENT '??????',
sender_city_no varchar(20) DEFAULT NULL COMMENT '??????',
sender_city_name varchar(50) DEFAULT NULL COMMENT '??????',
sender_county_no varchar(20) DEFAULT NULL COMMENT '??????',
sender_county_name varchar(50) DEFAULT NULL COMMENT '??????',
sender_notes varchar(1000) DEFAULT NULL COMMENT '????',
receiver_no varchar(50) DEFAULT NULL COMMENT '??????????????',
receiver varchar(200) DEFAULT NULL COMMENT '??????',
receiver_linker varchar(200) DEFAULT NULL,
receiver_fixtel varchar(50) DEFAULT NULL COMMENT '??????',
receiver_mobile varchar(50) DEFAULT NULL COMMENT '??????',
receiver_addr varchar(200) DEFAULT NULL COMMENT '??????',
receiver_country_no varchar(20) DEFAULT NULL COMMENT '??????',
receiver_country_name varchar(50) DEFAULT NULL COMMENT '??????',
receiver_province_no varchar(20) DEFAULT NULL COMMENT '??????',
receiver_province_name varchar(50) DEFAULT NULL COMMENT '??????',
receiver_city_no varchar(20) DEFAULT NULL COMMENT '??????',
receiver_city_name varchar(50) DEFAULT NULL COMMENT '??????',
receiver_county_no varchar(20) DEFAULT NULL COMMENT '??????',
receiver_county_name varchar(50) DEFAULT NULL COMMENT '??????',
insurance_flag char(1) DEFAULT NULL COMMENT '????????????1:?? 2:?? 3:??',
insurance_amount decimal(12,2) DEFAULT NULL COMMENT '??????',
pickup_type varchar(20) DEFAULT NULL COMMENT '?????0 ???????1 ??????',
payment_mode varchar(20) DEFAULT NULL COMMENT '????(???) 1:??? 2:??? 3:??? 4:??????? 5:?? 6:?/??? 7:???',
real_weight decimal(8,0) DEFAULT NULL COMMENT '????',
fee_weight decimal(8,0) DEFAULT NULL,
volume_weight decimal(8,0) DEFAULT NULL,
length decimal(8,0) DEFAULT NULL,
width decimal(8,0) DEFAULT NULL,
height decimal(8,0) DEFAULT NULL,
quantity int(11) DEFAULT NULL,
packaging varchar(20) DEFAULT NULL,
package_material varchar(20) DEFAULT NULL,
goods_desc varchar(200) DEFAULT NULL,
contents_quantity int(11) DEFAULT NULL,
cod_flag char(1) DEFAULT NULL,
cod_amount decimal(12,2) DEFAULT NULL,
receipt_flag char(1) DEFAULT NULL,
receipt_waybill_no varchar(20) DEFAULT NULL,
receipt_fee_amount decimal(12,2) DEFAULT NULL,
insurance_premium_amount decimal(12,2) DEFAULT NULL,
valuable_flag char(1) DEFAULT NULL,
cargo_total_price decimal(12,2) DEFAULT NULL,
cargo_total_purchasing_price decimal(12,2) DEFAULT NULL,
allow_fee_flag char(1) DEFAULT NULL,
is_feed_flag char(1) DEFAULT NULL,
manual_fee_type char(1) DEFAULT NULL,
fee_date datetime DEFAULT NULL,
discount_rate decimal(6,2) DEFAULT NULL,
settlement_mode varchar(20) DEFAULT NULL,
payment_state char(1) DEFAULT NULL,
payment_date datetime DEFAULT NULL,
payment_id varchar(50) DEFAULT NULL,
manage_org_code varchar(20) DEFAULT NULL,
postage_suite_code varchar(20) DEFAULT NULL,
fee_area_suite_code varchar(20) DEFAULT NULL,
fee_area_code varchar(20) DEFAULT NULL,
fee_area_name varchar(20) DEFAULT NULL,
is_advance_flag char(1) DEFAULT NULL,
deliver_type char(1) DEFAULT NULL,
deliver_sign varchar(50) DEFAULT NULL,
deliver_date char(1) DEFAULT NULL,
deliver_notes varchar(1000) DEFAULT NULL,
deliver_pre_date date DEFAULT NULL,
battery_flag char(1) DEFAULT NULL,
is_jinguan varchar(20) DEFAULT NULL,
workbench varchar(20) DEFAULT NULL,
electronic_preferential_no varchar(50) DEFAULT NULL,
electronic_preferential_amount decimal(12,2) DEFAULT NULL,
pickup_attribute char(1) DEFAULT NULL,
adjust_type varchar(20) DEFAULT NULL,
postage_revoke decimal(12,2) DEFAULT NULL,
print_flag char(1) DEFAULT NULL,
print_date datetime DEFAULT NULL,
print_times int(11) DEFAULT NULL,
declare_source varchar(20) DEFAULT NULL,
declare_type varchar(20) DEFAULT NULL,
declare_curr_code varchar(20) DEFAULT NULL,
create_user_name varchar(50) DEFAULT NULL,
modify_user_name varchar(50) DEFAULT NULL,
volume decimal(8,0) DEFAULT NULL COMMENT '??',
contents_type_no varchar(20) DEFAULT NULL COMMENT '??????',
contents_type_name varchar(200) DEFAULT NULL COMMENT '??????',
contents_weight decimal(8,0) DEFAULT NULL COMMENT '??????',
transfer_type varchar(20) DEFAULT NULL COMMENT '????',
postage_total decimal(12,2) NOT NULL COMMENT '???=????+????',
postage_standard decimal(12,2) DEFAULT NULL COMMENT '????',
postage_paid decimal(12,2) DEFAULT NULL COMMENT '????',
postage_other decimal(12,2) DEFAULT NULL COMMENT '????',
is_deleted char(1) DEFAULT '0' COMMENT '?????n0??n1??',
create_user_id bigint(20) DEFAULT NULL COMMENT '???id',
gmt_created datetime DEFAULT NULL COMMENT '????',
modify_user_id bigint(20) DEFAULT NULL COMMENT '???id',
gmt_modified datetime DEFAULT NULL COMMENT '????',
reserved1 bigint(20) DEFAULT NULL COMMENT '????1',
reserved2 bigint(20) DEFAULT NULL COMMENT '????2',
reserved3 bigint(20) DEFAULT NULL COMMENT '????3',
reserved4 varchar(200) DEFAULT NULL COMMENT '????4',
reserved5 varchar(200) DEFAULT NULL COMMENT '????5',
reserved6 varchar(200) DEFAULT NULL COMMENT '????6',
reserved7 varchar(200) DEFAULT NULL COMMENT '????7',
reserved8 varchar(200) DEFAULT NULL COMMENT '????8',
reserved9 datetime DEFAULT NULL COMMENT '????9',
reserved10 text COMMENT '????10',
logistics_order_no bigint(50) DEFAULT NULL,
inner_channel varchar(20) DEFAULT NULL,
base_product_id bigint(20) DEFAULT NULL,
base_product_no varchar(20) DEFAULT NULL,
base_product_name varchar(20) DEFAULT NULL,
is_special_marketing char(1) DEFAULT NULL,
product_type varchar(20) DEFAULT NULL,
biz_product_type varchar(20) DEFAULT NULL,
product_reach_area char(1) DEFAULT NULL,
contents_attribute char(1) DEFAULT NULL,
contents_cargo_no varchar(1000) DEFAULT NULL,
cmd_code varchar(20) DEFAULT NULL,
manual_charge_reason varchar(200) DEFAULT NULL,
time_limit char(1) DEFAULT NULL,
io_type varchar(20) DEFAULT NULL,
ecommerce_no varchar(20) DEFAULT NULL,
waybill_type varchar(20) DEFAULT NULL,
pre_waybill_no varchar(50) DEFAULT NULL,
post_batch_id varchar(50) DEFAULT NULL,
biz_occur_date datetime DEFAULT NULL,
post_org_id bigint(20) DEFAULT NULL,
post_org_no varchar(50) DEFAULT NULL,
org_drds_code varchar(50) DEFAULT NULL,
post_org_simple_name varchar(50) DEFAULT NULL,
post_org_product_name varchar(20) DEFAULT NULL,
post_person_id bigint(20) DEFAULT NULL,
post_person_no varchar(50) DEFAULT NULL,
post_person_name varchar(50) DEFAULT NULL,
post_person_mobile varchar(50) DEFAULT NULL,
sender_warehouse_id bigint(20) DEFAULT NULL,
sender_warehouse_name varchar(200) DEFAULT NULL,
sender_safety_code varchar(50) DEFAULT NULL,
sender_im_type varchar(20) DEFAULT NULL,
sender_im_id varchar(50) DEFAULT NULL,
sender_id_type varchar(20) DEFAULT NULL,
sender_id_no varchar(50) DEFAULT NULL,
sender_id_encrypted_code varchar(50) DEFAULT NULL,
sender_agent_id_type varchar(20) DEFAULT NULL,
sender_agent_id_no varchar(50) DEFAULT NULL,
sender_id_encrypted_code_agent varchar(50) DEFAULT NULL,
sender_addr_additional varchar(200) DEFAULT NULL,
sender_district_no varchar(20) DEFAULT NULL,
sender_postcode varchar(20) DEFAULT NULL,
sender_gis varchar(20) DEFAULT NULL,
registered_customer_no varchar(50) DEFAULT NULL,
receiver_type char(1) DEFAULT NULL,
receiver_id bigint(20) DEFAULT NULL,
receiver_warehouse_id bigint(20) DEFAULT NULL,
receiver_warehouse_name varchar(200) DEFAULT NULL,
receiver_safety_code varchar(50) DEFAULT NULL,
receiver_im_type varchar(20) DEFAULT NULL,
receiver_im_id varchar(50) DEFAULT NULL,
receiver_addr_additional varchar(200) DEFAULT NULL,
receiver_district_no varchar(20) DEFAULT NULL,
receiver_postcode varchar(20) DEFAULT NULL,
receiver_gis varchar(20) DEFAULT NULL,
receiver_notes varchar(1000) DEFAULT NULL,
customer_manager_id bigint(20) DEFAULT NULL,
customer_manager_no varchar(50) DEFAULT NULL,
customer_manager_name varchar(50) DEFAULT NULL,
salesman_id bigint(20) DEFAULT NULL,
salesman_no varchar(50) DEFAULT NULL,
salesman_name varchar(50) DEFAULT NULL,
order_weight decimal(8,0) DEFAULT NULL,
post_org_name varchar(200) DEFAULT NULL,
PRIMARY KEY (waybill_id),
KEY auto_shard_key_post_date (post_date),
KEY auto_shard_key_waybill_no (waybill_no)
) ENGINE=InnoDB AUTO_INCREMENT=568964219 DEFAULT CHARSET=utf8 COMMENT='???????' |

注意:该表上有三个索引,(一个主键索引,两个二级索引)
PRIMARY KEY (waybill_id),
KEY auto_shard_key_post_date (post_date),
KEY auto_shard_key_waybill_no (waybill_no)

2、查看表的数据量以及执行计划

1、查看执行计划

mysql> select count(1) from huayu_test1;
count(1)
15861881

1 row in set (2.16 sec)

mysql> select count(*) from huayu_test1;
count(*)
15861881

1 row in set (2.16 sec)

mysql> explain select count(1) from huayu_test1G
1. row **

       id: 1

select_type: SIMPLE

    table: huayu_test1
     type: index

possible_keys: NULL

      key: auto_shard_key_post_date
  key_len: 5
      ref: NULL
     rows: 15412951
    Extra: Using index

1 row in set (0.00 sec)

mysql> explain select count(*) from huayu_test1G
1. row **

       id: 1

select_type: SIMPLE

    table: huayu_test1
     type: index

possible_keys: NULL

      key: auto_shard_key_post_date
  key_len: 5
      ref: NULL
     rows: 15412951
    Extra: Using index

1 row in set (0.00 sec)

通过执行计划发现count(1)和count(*)没有区别,后续就不再说明。该查询是走了一个二级索引

2、将该二级索引删除再次执行查询语句

mysql> explain select count(*) from huayu_test1G
1. row **

       id: 1

select_type: SIMPLE

    table: huayu_test1
     type: index

possible_keys: NULL

      key: auto_shard_key_waybill_no
  key_len: 62
      ref: NULL
     rows: 14061153
    Extra: Using index

1 row in set (0.00 sec)

mysql> explain select count(1) from huayu_test1G
1. row **

       id: 1

select_type: SIMPLE

    table: huayu_test1
     type: index

possible_keys: NULL

      key: auto_shard_key_waybill_no
  key_len: 62
      ref: NULL
     rows: 14061153
    Extra: Using index

1 row in set (0.00 sec)

mysql> select count(*) from huayu_test1;
count(*)
15861881

1 row in set (12.70 sec)

mysql> select count(1) from huayu_test1;
count(1)
15861881

1 row in set (2.27 sec)

mysql> select count(*) from huayu_test1;
count(*)
15861881

1 row in set (2.26 sec)

发现执行计划走的是另外一个二级索引,并且执行时间相比第一次略有增加。

(这里还有一个问题,就是删除之前走的那条索引重新执行select count(*)后,第一次执行的时间比较长,后续就正常了)

3、将上一个执行计划中用到的二级索引页删除,执行语句

mysql> explain select count(*) from huayu_test1G
1. row **

       id: 1

select_type: SIMPLE

    table: huayu_test1
     type: index

possible_keys: NULL

      key: PRIMARY
  key_len: 8
      ref: NULL
     rows: 14061153
    Extra: Using index

1 row in set (0.00 sec)

mysql> explain select count(1) from huayu_test1G
1. row **

       id: 1

select_type: SIMPLE

    table: huayu_test1
     type: index

possible_keys: NULL

      key: PRIMARY
  key_len: 8
      ref: NULL
     rows: 14061153
    Extra: Using index

1 row in set (0.00 sec)

mysql> select count(*) from huayu_test1;
count(*)
15861881

1 row in set (39.66 sec)

mysql> select count(1) from huayu_test1;
count(1)
15861881

1 row in set (54.20 sec)

mysql> select count(*) from huayu_test1;
count(*)
15861881

1 row in set (1 min 6.71 sec)

mysql> select count(1) from huayu_test1;
count(1)
15861881

1 row in set (1 min 6.90 sec)

这次是采用到了主键索引,花费的时间也是超过了一分多钟

3、原理分析

MySQL查询优化器目标就是为了减少SQL的执行时间,那为什么会用二级索引而不去用主键索引呢,因为在统计行数的操作中涉及到磁盘IO问题,降低磁盘IO问题就大大的减少执行时间。IO带宽是一定的,索引占用的空间越小产生的IO次数就越少。而innodb的主键索引包括key,事务id和rollpointer,而二级索引包括key和主键id,所以使用二级索引的开销会比较少。所以innodb的select count( )操作一般都是通过二级索引来进行统计操作

InnoDB的主键索引采用聚簇索引存储,使用的是B+Tree作为索引结构,但是叶子节点存储的是key和数据本身。 
InnoDB的二级索引不使用聚蔟索引,叶子节点存储的是KEY和主键值。因此,通过二级索引查询首先查到是主键值,然后InnoDB再根据查到的主键值通过主键索引找到相应的数据块。

三、那count(1)中”1”是什么意思呢? 
1、下面是几个测试:

mysql> select count(waybill_id) from huayu_test1;
count(waybill_id)
15861881

1 row in set (2.53 sec)

mysql> select count(2) from huayu_test1;
count(2)
15861881

1 row in set (2.16 sec)

mysql> select count(0) from huayu_test1;
count(0)
15861881

1 row in set (2.16 sec)

mysql> select count(111) from huayu_test1;
count(111)
15861881

1 row in set (2.16 sec)

mysql> select count(222) from huayu_test1;
count(222)
15861881

1 row in set (2.14 sec)

mysql> select count(999) from huayu_test1;
count(999)
15861881

1 row in set (2.14 sec)

mysql> desc huayu_test1g
Field Type Null Key Default Extra
waybill_id bigint(20) NO PRI NULL auto_increment
waybill_no varchar(20) NO MUL NULL  
post_date datetime NO MUL NULL  
order_id varchar(50) YES   NULL  
batch_no varchar(50) YES   NULL  
biz_product_id varchar(20) NO   NULL  
biz_product_no varchar(20) NO   NULL  
biz_product_name varchar(50) NO   NULL  
sender_type varchar(20) YES   NULL  
sender_id varchar(50) YES   NULL  
sender_no varchar(50) YES   NULL  
sender varchar(200) YES   NULL  
sender_linker varchar(200) YES   NULL  
sender_fixtel varchar(50) YES   NULL  
sender_mobile varchar(50) YES   NULL  
sender_addr varchar(200) YES   NULL  
sender_country_no varchar(20) YES   NULL  
sender_country_name varchar(50) YES   NULL  
sender_province_no varchar(20) YES   NULL  
sender_province_name varchar(50) YES   NULL  
sender_city_no varchar(20) YES   NULL  
sender_city_name varchar(50) YES   NULL  
sender_county_no varchar(20) YES   NULL  
sender_county_name varchar(50) YES   NULL  
sender_notes varchar(1000) YES   NULL  
receiver_no varchar(50) YES   NULL  
receiver varchar(200) YES   NULL  
receiver_linker varchar(200) YES   NULL  
receiver_fixtel varchar(50) YES   NULL  
receiver_mobile varchar(50) YES   NULL  
receiver_addr varchar(200) YES   NULL  
receiver_country_no varchar(20) YES   NULL  
receiver_country_name varchar(50) YES   NULL  
receiver_province_no varchar(20) YES   NULL  
receiver_province_name varchar(50) YES   NULL  
receiver_city_no varchar(20) YES   NULL  
receiver_city_name varchar(50) YES   NULL  
receiver_county_no varchar(20) YES   NULL  
receiver_county_name varchar(50) YES   NULL  
insurance_flag char(1) YES   NULL  
insurance_amount decimal(12,2) YES   NULL  
pickup_type varchar(20) YES   NULL  
payment_mode varchar(20) YES   NULL  
real_weight decimal(8,0) YES   NULL  
fee_weight decimal(8,0) YES   NULL  
volume_weight decimal(8,0) YES   NULL  
length decimal(8,0) YES   NULL  
width decimal(8,0) YES   NULL  
height decimal(8,0) YES   NULL  
quantity int(11) YES   NULL  
packaging varchar(20) YES   NULL  
package_material varchar(20) YES   NULL  
goods_desc varchar(200) YES   NULL  
contents_quantity int(11) YES   NULL  
cod_flag char(1) YES   NULL  
cod_amount decimal(12,2) YES   NULL  
receipt_flag char(1) YES   NULL  
receipt_waybill_no varchar(20) YES   NULL  
receipt_fee_amount decimal(12,2) YES   NULL  
insurance_premium_amount decimal(12,2) YES   NULL  
valuable_flag char(1) YES   NULL  
cargo_total_price decimal(12,2) YES   NULL  
cargo_total_purchasing_price decimal(12,2) YES   NULL  
allow_fee_flag char(1) YES   NULL  
is_feed_flag char(1) YES   NULL  
manual_fee_type char(1) YES   NULL  
fee_date datetime YES   NULL  
discount_rate decimal(6,2) YES   NULL  
settlement_mode varchar(20) YES   NULL  
payment_state char(1) YES   NULL  
payment_date datetime YES   NULL  
payment_id varchar(50) YES   NULL  
manage_org_code varchar(20) YES   NULL  
postage_suite_code varchar(20) YES   NULL  
fee_area_suite_code varchar(20) YES   NULL  
fee_area_code varchar(20) YES   NULL  
fee_area_name varchar(20) YES   NULL  
is_advance_flag char(1) YES   NULL  
deliver_type char(1) YES   NULL  
deliver_sign varchar(50) YES   NULL  
deliver_date char(1) YES   NULL  
deliver_notes varchar(1000) YES   NULL  
deliver_pre_date date YES   NULL  
battery_flag char(1) YES   NULL  
is_jinguan varchar(20) YES   NULL  
workbench varchar(20) YES   NULL  
electronic_preferential_no varchar(50) YES   NULL  
electronic_preferential_amount decimal(12,2) YES   NULL  
pickup_attribute char(1) YES   NULL  
adjust_type varchar(20) YES   NULL  
postage_revoke decimal(12,2) YES   NULL  
print_flag char(1) YES   NULL  
print_date datetime YES   NULL  
print_times int(11) YES   NULL  
declare_source varchar(20) YES   NULL  
declare_type varchar(20) YES   NULL  
declare_curr_code varchar(20) YES   NULL  
create_user_name varchar(50) YES   NULL  
modify_user_name varchar(50) YES   NULL  
volume decimal(8,0) YES   NULL  
contents_type_no varchar(20) YES   NULL  
contents_type_name varchar(200) YES   NULL  
contents_weight decimal(8,0) YES   NULL  
transfer_type varchar(20) YES   NULL  
postage_total decimal(12,2) NO   NULL  
postage_standard decimal(12,2) YES   NULL  
postage_paid decimal(12,2) YES   NULL  
postage_other decimal(12,2) YES   NULL  
is_deleted char(1) YES   0  
create_user_id bigint(20) YES   NULL  
gmt_created datetime YES   NULL  
modify_user_id bigint(20) YES   NULL  
gmt_modified datetime YES   NULL  
reserved1 bigint(20) YES   NULL  
reserved2 bigint(20) YES   NULL  
reserved3 bigint(20) YES   NULL  
reserved4 varchar(200) YES   NULL  
reserved5 varchar(200) YES   NULL  
reserved6 varchar(200) YES   NULL  
reserved7 varchar(200) YES   NULL  
reserved8 varchar(200) YES   NULL  
reserved9 datetime YES   NULL  
reserved10 text YES   NULL  
logistics_order_no bigint(50) YES   NULL  
inner_channel varchar(20) YES   NULL  
base_product_id bigint(20) YES   NULL  
base_product_no varchar(20) YES   NULL  
base_product_name varchar(20) YES   NULL  
is_special_marketing char(1) YES   NULL  
product_type varchar(20) YES   NULL  
biz_product_type varchar(20) YES   NULL  
product_reach_area char(1) YES   NULL  
contents_attribute char(1) YES   NULL  
contents_cargo_no varchar(1000) YES   NULL  
cmd_code varchar(20) YES   NULL  
manual_charge_reason varchar(200) YES   NULL  
time_limit char(1) YES   NULL  
io_type varchar(20) YES   NULL  
ecommerce_no varchar(20) YES   NULL  
waybill_type varchar(20) YES   NULL  
pre_waybill_no varchar(50) YES   NULL  
post_batch_id varchar(50) YES   NULL  
biz_occur_date datetime YES   NULL  
post_org_id bigint(20) YES   NULL  
post_org_no varchar(50) YES   NULL  
org_drds_code varchar(50) YES   NULL  
post_org_simple_name varchar(50) YES   NULL  
post_org_product_name varchar(20) YES   NULL  
post_person_id bigint(20) YES   NULL  
post_person_no varchar(50) YES   NULL  
post_person_name varchar(50) YES   NULL  
post_person_mobile varchar(50) YES   NULL  
sender_warehouse_id bigint(20) YES   NULL  
sender_warehouse_name varchar(200) YES   NULL  
sender_safety_code varchar(50) YES   NULL  
sender_im_type varchar(20) YES   NULL  
sender_im_id varchar(50) YES   NULL  
sender_id_type varchar(20) YES   NULL  
sender_id_no varchar(50) YES   NULL  
sender_id_encrypted_code varchar(50) YES   NULL  
sender_agent_id_type varchar(20) YES   NULL  
sender_agent_id_no varchar(50) YES   NULL  
sender_id_encrypted_code_agent varchar(50) YES   NULL  
sender_addr_additional varchar(200) YES   NULL  
sender_district_no varchar(20) YES   NULL  
sender_postcode varchar(20) YES   NULL  
sender_gis varchar(20) YES   NULL  
registered_customer_no varchar(50) YES   NULL  
receiver_type char(1) YES   NULL  
receiver_id bigint(20) YES   NULL  
receiver_warehouse_id bigint(20) YES   NULL  
receiver_warehouse_name varchar(200) YES   NULL  
receiver_safety_code varchar(50) YES   NULL  
receiver_im_type varchar(20) YES   NULL  
receiver_im_id varchar(50) YES   NULL  
receiver_addr_additional varchar(200) YES   NULL  
receiver_district_no varchar(20) YES   NULL  
receiver_postcode varchar(20) YES   NULL  
receiver_gis varchar(20) YES   NULL  
receiver_notes varchar(1000) YES   NULL  
customer_manager_id bigint(20) YES   NULL  
customer_manager_no varchar(50) YES   NULL  
customer_manager_name varchar(50) YES   NULL  
salesman_id bigint(20) YES   NULL  
salesman_no varchar(50) YES   NULL  
salesman_name varchar(50) YES   NULL  
order_weight decimal(8,0) YES   NULL  
post_org_name varchar(200) YES   NULL  

188 rows in set (0.00 sec)

通过测试可以发现,count( )中的id,并没有特殊的含义,也不是按照第几列统计行数,因为通过表结构可以发现总共有188个列,但是count(999)跟count(1)的结果是一样的。

2、重新建一个有空值的表来测试:

mysql> show create table test2;
test2 CREATE TABLE test2 (

id int(11) NOT NULL AUTO_INCREMENT,
name varchar(20) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 |

mysql> select * from test2;
id name
1 asd
2 hahah
3 www
4 http
5 java
6 NULL

6 rows in set (0.00 sec)

mysql> select count(*) from test2;
count(*)
6

1 row in set (0.00 sec)

mysql> select count(1) from test2;
count(1)
6

1 row in set (0.00 sec)

mysql> select count(2) from test2;
count(2)
6

1 row in set (0.00 sec)

mysql> select count(name) from test2;
count(name)
5

1 row in set (0.00 sec)

mysql> select count(id) from test2;
count(id)
6

1 row in set (0.00 sec)

mysql> select count(999) from test2;
count(999)
6

1 row in set (0.00 sec)
3、通过测试发现,count( 1)中,1只是一个固定值,没有什么具体的意义,更不是指第一个列,也可以看成一个虚值,count(*)和count(1)操作会统计表中列的行数,包括NULL列,count(col)操作会统计指定列的行数,不包括NULL值。


猜你喜欢

转载自blog.csdn.net/weixin_40581980/article/details/81017939
今日推荐