|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
这里我们讨论用binlog来实现闪回的方案。我们在查询表中数据的数目时,有人喜好用count(*),有人用count(1),另有些伴侣会用count(主键),但这几种用法那种会更优一些呢?上面在csdn下面看到的一篇文章,摘抄以下:
关于COUNT的写法,大抵有以下几种:
COUNT(*)
COUNT(1)
COUNT(主键)
COUNT(列名)
我仍是写个小例子:
USETEMPDB
GO
IFOBJECT_ID(TB)ISNOTNULLDROPTABLETB
GO
CREATETABLETB(COL1INT,COL2INT,COL3INT,COL4INT)
GO
CREATECLUSTEREDINDEXINX_TB_COL1_COL2ONTB(COL1,COL2)
GO
CREATEINDEXINX_TB_COL3ONTB(COL3)
GO
INSERTINTOTB
SELECTT1.number,T2.number,CASEWHENT1.number%3=0THENNULLELSET1.numberEND,T1.NUMBER+T2.number
FROMMASTER..spt_valuesT1
INNERJOINMASTER..spt_valuesT2ONT1.number=T2.number-1
GO
SELECTCOUNT(*)
FROMTB
SELECTCOUNT(1)
FROMTB
SELECTCOUNT(COL1)
FROMTB
SELECTCOUNT(COL2)
FROMTB
SELECTCOUNT(COL3)
FROMTB
SELECTCOUNT(COL4)
FROMTB
SELECTCOUNT(DISTINCTCOL3)
FROMTB
SELECTCOUNT(1),
COUNT(COL3),
COUNT(DISTINCTCOL3),
COUNT(COL4),
COUNT(DISTINCTCOL4)
FROMTB
本人逐一运转SELECT看实行企图,你会发明前五个的实行企图看起来是一样的,都是走INX_TB_COL3,这是由于体系判别COL3的索引巨细小于COL1+COL2的会萃索引,并且COL3中包括了前五个语句所必要的一切列。
但看到第一步的INDEX_SCAN中,会发明COUNT(*)和COUNT(1)是没有输入工具的,即假输入,只输入前往行数,不输入详细的列。而COUNT(COL1),COUNT(COL2),COUNT(COL3)都有一个OutPutLIST,分离是这三列。这是由于体系要算这三列中有几非NULL的值,而COUNT(*)和COUNT(1)都是有一行算一行,不论是不是NULL。
COUNT(COL4)走的是INX_TB_COL1_COL2,也就是会萃索引扫描了,由于COL3中只包括键列COL1、COL2和值列COL3,以是COUNT(COL4)没法走COL3,只能走会萃索引扫描,也就是全表扫描。
前面的COUNT(DISTINCTCOL3)是为了让你们对照企图的,所谓DISTINCT,就是在输入了COL3再GROUPBY一下再盘算行数。
最初一句是演示COUNT用法,无别的意义。
结论:
COUNT(1)和COUNT(*)是一样的,你能够在内里写任何常量,如COUNT(CSDNDSB),不会输入一列常量,不会往体系内外找一切列名。
COUNT(1)和COUNT(列名)意义分歧,不克不及放在一同对照。独一可对照的情形是列名是单主键表的主键列,即会萃非空单键值索引,这类情形下除非想要强迫走会萃索引扫描,不然COUNT(1)优于COUNT(列名),由于前者同意企图选择最估索引,并且没有列输入。限制,如果WHERE子句的查询条件里有不等号(WHEREcoloum!=),MySQL将无法使用索引。类似地,如果WHERE子句的查询条件里使用了函数(WHEREDAY(column)=),MySQL也将无法使用索引。 |
|