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


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值