浅谈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
FieldTypeNullKeyDefaultExtra
waybill_idbigint(20)NOPRINULLauto_increment
waybill_novarchar(20)NOMULNULL
post_datedatetimeNOMULNULL
order_idvarchar(50)YES NULL
batch_novarchar(50)YES NULL
biz_product_idvarchar(20)NO NULL
biz_product_novarchar(20)NO NULL
biz_product_namevarchar(50)NO NULL
sender_typevarchar(20)YES NULL
sender_idvarchar(50)YES NULL
sender_novarchar(50)YES NULL
sendervarchar(200)YES NULL
sender_linkervarchar(200)YES NULL
sender_fixtelvarchar(50)YES NULL
sender_mobilevarchar(50)YES NULL
sender_addrvarchar(200)YES NULL
sender_country_novarchar(20)YES NULL
sender_country_namevarchar(50)YES NULL
sender_province_novarchar(20)YES NULL
sender_province_namevarchar(50)YES NULL
sender_city_novarchar(20)YES NULL
sender_city_namevarchar(50)YES NULL
sender_county_novarchar(20)YES NULL
sender_county_namevarchar(50)YES NULL
sender_notesvarchar(1000)YES NULL
receiver_novarchar(50)YES NULL
receivervarchar(200)YES NULL
receiver_linkervarchar(200)YES NULL
receiver_fixtelvarchar(50)YES NULL
receiver_mobilevarchar(50)YES NULL
receiver_addrvarchar(200)YES NULL
receiver_country_novarchar(20)YES NULL
receiver_country_namevarchar(50)YES NULL
receiver_province_novarchar(20)YES NULL
receiver_province_namevarchar(50)YES NULL
receiver_city_novarchar(20)YES NULL
receiver_city_namevarchar(50)YES NULL
receiver_county_novarchar(20)YES NULL
receiver_county_namevarchar(50)YES NULL
insurance_flagchar(1)YES NULL
insurance_amountdecimal(12,2)YES NULL
pickup_typevarchar(20)YES NULL
payment_modevarchar(20)YES NULL
real_weightdecimal(8,0)YES NULL
fee_weightdecimal(8,0)YES NULL
volume_weightdecimal(8,0)YES NULL
lengthdecimal(8,0)YES NULL
widthdecimal(8,0)YES NULL
heightdecimal(8,0)YES NULL
quantityint(11)YES NULL
packagingvarchar(20)YES NULL
package_materialvarchar(20)YES NULL
goods_descvarchar(200)YES NULL
contents_quantityint(11)YES NULL
cod_flagchar(1)YES NULL
cod_amountdecimal(12,2)YES NULL
receipt_flagchar(1)YES NULL
receipt_waybill_novarchar(20)YES NULL
receipt_fee_amountdecimal(12,2)YES NULL
insurance_premium_amountdecimal(12,2)YES NULL
valuable_flagchar(1)YES NULL
cargo_total_pricedecimal(12,2)YES NULL
cargo_total_purchasing_pricedecimal(12,2)YES NULL
allow_fee_flagchar(1)YES NULL
is_feed_flagchar(1)YES NULL
manual_fee_typechar(1)YES NULL
fee_datedatetimeYES NULL
discount_ratedecimal(6,2)YES NULL
settlement_modevarchar(20)YES NULL
payment_statechar(1)YES NULL
payment_datedatetimeYES NULL
payment_idvarchar(50)YES NULL
manage_org_codevarchar(20)YES NULL
postage_suite_codevarchar(20)YES NULL
fee_area_suite_codevarchar(20)YES NULL
fee_area_codevarchar(20)YES NULL
fee_area_namevarchar(20)YES NULL
is_advance_flagchar(1)YES NULL
deliver_typechar(1)YES NULL
deliver_signvarchar(50)YES NULL
deliver_datechar(1)YES NULL
deliver_notesvarchar(1000)YES NULL
deliver_pre_datedateYES NULL
battery_flagchar(1)YES NULL
is_jinguanvarchar(20)YES NULL
workbenchvarchar(20)YES NULL
electronic_preferential_novarchar(50)YES NULL
electronic_preferential_amountdecimal(12,2)YES NULL
pickup_attributechar(1)YES NULL
adjust_typevarchar(20)YES NULL
postage_revokedecimal(12,2)YES NULL
print_flagchar(1)YES NULL
print_datedatetimeYES NULL
print_timesint(11)YES NULL
declare_sourcevarchar(20)YES NULL
declare_typevarchar(20)YES NULL
declare_curr_codevarchar(20)YES NULL
create_user_namevarchar(50)YES NULL
modify_user_namevarchar(50)YES NULL
volumedecimal(8,0)YES NULL
contents_type_novarchar(20)YES NULL
contents_type_namevarchar(200)YES NULL
contents_weightdecimal(8,0)YES NULL
transfer_typevarchar(20)YES NULL
postage_totaldecimal(12,2)NO NULL
postage_standarddecimal(12,2)YES NULL
postage_paiddecimal(12,2)YES NULL
postage_otherdecimal(12,2)YES NULL
is_deletedchar(1)YES 0
create_user_idbigint(20)YES NULL
gmt_createddatetimeYES NULL
modify_user_idbigint(20)YES NULL
gmt_modifieddatetimeYES NULL
reserved1bigint(20)YES NULL
reserved2bigint(20)YES NULL
reserved3bigint(20)YES NULL
reserved4varchar(200)YES NULL
reserved5varchar(200)YES NULL
reserved6varchar(200)YES NULL
reserved7varchar(200)YES NULL
reserved8varchar(200)YES NULL
reserved9datetimeYES NULL
reserved10textYES NULL
logistics_order_nobigint(50)YES NULL
inner_channelvarchar(20)YES NULL
base_product_idbigint(20)YES NULL
base_product_novarchar(20)YES NULL
base_product_namevarchar(20)YES NULL
is_special_marketingchar(1)YES NULL
product_typevarchar(20)YES NULL
biz_product_typevarchar(20)YES NULL
product_reach_areachar(1)YES NULL
contents_attributechar(1)YES NULL
contents_cargo_novarchar(1000)YES NULL
cmd_codevarchar(20)YES NULL
manual_charge_reasonvarchar(200)YES NULL
time_limitchar(1)YES NULL
io_typevarchar(20)YES NULL
ecommerce_novarchar(20)YES NULL
waybill_typevarchar(20)YES NULL
pre_waybill_novarchar(50)YES NULL
post_batch_idvarchar(50)YES NULL
biz_occur_datedatetimeYES NULL
post_org_idbigint(20)YES NULL
post_org_novarchar(50)YES NULL
org_drds_codevarchar(50)YES NULL
post_org_simple_namevarchar(50)YES NULL
post_org_product_namevarchar(20)YES NULL
post_person_idbigint(20)YES NULL
post_person_novarchar(50)YES NULL
post_person_namevarchar(50)YES NULL
post_person_mobilevarchar(50)YES NULL
sender_warehouse_idbigint(20)YES NULL
sender_warehouse_namevarchar(200)YES NULL
sender_safety_codevarchar(50)YES NULL
sender_im_typevarchar(20)YES NULL
sender_im_idvarchar(50)YES NULL
sender_id_typevarchar(20)YES NULL
sender_id_novarchar(50)YES NULL
sender_id_encrypted_codevarchar(50)YES NULL
sender_agent_id_typevarchar(20)YES NULL
sender_agent_id_novarchar(50)YES NULL
sender_id_encrypted_code_agentvarchar(50)YES NULL
sender_addr_additionalvarchar(200)YES NULL
sender_district_novarchar(20)YES NULL
sender_postcodevarchar(20)YES NULL
sender_gisvarchar(20)YES NULL
registered_customer_novarchar(50)YES NULL
receiver_typechar(1)YES NULL
receiver_idbigint(20)YES NULL
receiver_warehouse_idbigint(20)YES NULL
receiver_warehouse_namevarchar(200)YES NULL
receiver_safety_codevarchar(50)YES NULL
receiver_im_typevarchar(20)YES NULL
receiver_im_idvarchar(50)YES NULL
receiver_addr_additionalvarchar(200)YES NULL
receiver_district_novarchar(20)YES NULL
receiver_postcodevarchar(20)YES NULL
receiver_gisvarchar(20)YES NULL
receiver_notesvarchar(1000)YES NULL
customer_manager_idbigint(20)YES NULL
customer_manager_novarchar(50)YES NULL
customer_manager_namevarchar(50)YES NULL
salesman_idbigint(20)YES NULL
salesman_novarchar(50)YES NULL
salesman_namevarchar(50)YES NULL
order_weightdecimal(8,0)YES NULL
post_org_namevarchar(200)YES NULL

188 rows in set (0.00 sec)

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

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

mysql> show create table test2;
test2CREATE 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;
idname
1asd
2hahah
3www
4http
5java
6NULL

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值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值