范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

性能大PKcount()count(1)和count(列)

  hello,大家好,我是张张,「架构精进之路」公号作者。
  最近的工作中,我听到组内两名研发同学在交流数据统计性能的时候,聊到了以下内容:
  你怎么能用 count(*) 统计数据呢,count(*) 太慢了,要是把数据库搞垮了那不就完了么,用 count(1),这样比较快......
  有点儿好奇,难道 count(1) 的性能真的就比 count(*) 要好吗?
  印象中网上有很多的文章都有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。
  count(*) 性能与存储引擎相关
  在讨论问题之前,我们需要先搞明白一件事:MySQL 中 count() 的性能到底与什么相关呢?
  一件东西,我们知道如何取,必定需要提前知道如何存放才行,那我们可以初步判定,count() 性能应该与存储引擎相关!
  我们都知道,MySQL 常见的存储引擎有两种:MyISAM 和 InnoDB。
  在这两种存储引擎下,MySQL 对于使用 count(*) 返回结果的流程是不一样的:   MyISAM引擎:  每张表的总行数是存储在磁盘上,所以当执行 count(*) 时,直接从磁盘拿到这个值返回,能够快速返回。
  但要是在后面加了where查询条件时,统计总数也没有像想象中那么快了。InnoDB 引擎:  执行 count(*),需要将数据一行一行地读,再统计总数。
  看到这里,可能你会有这样的疑问:
  Q:为什么 InnoDB 引擎不像 MyISAM 引擎一样,把表总记录存储起来呢?
  这个问题非常好,在回答这个问题之前,我们先来了解一下 MVCC 是个什么东东。
  MVCC 简介
  所谓MVCC,全称:Multi-Version Concurrency Control,即多版本并发控制。
  MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
  MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
  就是因为要实现多版本并发控制,所以才导致 InnoDB 引擎不能直接存储表总记录数。因为每个事务获取到的一致性视图都是不一样的,所以返回的数据总记录也是不一致的。
  到这里,相信你已经知道 InnoDB 引擎为什么不像 MyISAM 引擎一样把表总记录存储起来了。
  主要是因为   InnoDB 支持事务,MyISAM 不支持事务  。
  MySQL 对 count() 的优化
  我们知道了count() 性能与存储引擎相关,那 MySQL 在执行 count() 操作的时候有没有对其性能做些优化呢?
  答案是肯定有的!
  InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。因此,普通索引树比主键索引树小很多。对于count(*)这样的操作,遍历哪个索引树得到的结果逻辑上都是一样的。因此,MySQL优化器会找到最小的那棵树来遍历。
  如果你使用过 show table status 命令的话,就会发现这个命令的输出结果里面也有一个 rows 值用于显示这个表当前有多少行。
  那么是不是这个rows值就能代替count(*)了吗?
  其实不能,rows这个是从从采样估算得来的,因此它也是不是准确。
  官方文档说是在40%到50%,所以此行数 rows 是不能直接使用的,如下所示:
  查询性能大PK
  基于MySQL的Innodb存储引擎,统计表的总记录数下面这4种做法,哪种效率最高?
  count(主键id)
  InnoDB引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。
  count(1)
  会统计表中的所有的记录数,包含字段为 null 的记录。
  同样遍历整张表,但不取值,server 层对返回的每一行,放一个数字1进去,判断是不可能为空的,按行累加。
  count(字段)
  分为两种情况,字段定义为 not null 和 null:
  1)为 not null 时:逐行从记录里面读出这个字段,判断不为 null,累加;
  2)为 null 时:执行时,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。
  count(*)
  需要注意的是,并不是带了 * 就把所有值取出来,而是 MySQL 做了专门的优化,count(*) 肯定不是null,按行累加。
  count(1) 和 count() 对比
  当表的数据量大些时,对表作分析之后,使用 count(1)还要比使用 count(*)用时多了!
  从执行计划来看, count(1) 和 count(*)的效果是一样的。但是在表做过分析之后, count(1) 会比 count(*)的用时少些(1w以内数据量),不过差不了多少。
  如果 count(1)是聚索引,那肯定是 count(1)快,但是差的很小。因为 count(*)自动会优化指定到那一个字段,所以没必要去 count(1),用 count(*) sql会帮你完成优化的,因此:count(1) 和 count(*)基本没有差别!
  总结
  基于 MySQL 的 InnoDB 存储引擎,统计表的总记录数按照效率排序:   count(字段) < count(主键id) < count(1)≈count(*)
  效率最高是 count(*),并不是count(1),所以建议尽量使用 count(*)。
  执行效果上:  count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为null  count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为null  count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null 的计数,即某个字段值为null 时,不统计。
  执行效率上:  列名为主键, count(列名) 会比 count(1)快  列名不为主键, count(1) 会比 count(列名)快  如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)  如果有主键,则 select count(主键) 执行效率是最优的  如果表只有一个字段,则 select count(*)最优。
  希望今天的讲解对大家有所帮助,谢谢!
  Thanks for reading!
  作者:架构精进之路,十年研发风雨路,大厂架构师,CSDN 博客专家,专注架构技术沉淀学习及分享,职业与认知升级,坚持分享接地气儿的干货文章,期待与你一起成长。
  关注并私信我回复"01",送你一份程序员成长进阶大礼包,欢迎勾搭。

铿锵玫瑰让韩国队患上恐中症7月23日,东亚杯女足比赛第二轮,中国女足在落后一球的情况下,最终以1比1战平韩国女足。两队最近9次交手,中国队保持着6胜3平的不败纪录。提到中国女足与韩国女足,人们首先想到的便是武则天用一招就让李治离不开她,慈禧也效仿,效果一样有用男尊女卑的思想贯彻在整个中国封建社会中,人们潜意识里面约定俗成的观点认为,女性不能成为政治上的中流砥柱。女子无才便是德困扰着封建社会中的女子,她们改变命运的机会往往是通过挑选合适的50年龙云之子被陈赓击毙,龙云大怒不已,毛主席你自己去看看吧龙云龙云是曾经称霸云南20年的云南王,也是让云南得以和平解放的大功臣。而在1950年定居于北京之后,他却收到噩耗,自己的儿子在云南被解放军击毙,这让他感到怒不可遏。他当即去找了毛主美国披露机密文件,暗中培养6万特种兵,多次挑起代理人战争美国的霸权主义是靠着强大的经济实力和顶尖科技,以及无止境地追求军事装备实力打造出来的。如果说美国只热衷秀秀优越感让人羡慕,或者震慑效果,假装欺负一下人也就算了,但是美国的所作所为还我国很奇异的奇门兵器今天给大家讲一件我国古代很特殊的奇门兵器,这件兵器经常出现在我国的武侠小说中一般由江湖书生持有,它的名字叫做二人夺,二人夺又叫做手杖剑,是我国古代确确实实存在的冷兵器,看名字大家就传真和尚其心可诛南京的和尚传真这回是摊上大事了!所有事情的真相他是全部知道的!愿不愿说,说不说全,现在都不是他可以左右的了。未来,他所说的一切都将最终证明他是一个百分之百的假和尚真坏蛋。也让我们来当寺庙成了名利场,出什么事儿都有可能当寺庙成了名利场,出什么事儿都不意外!文叶雨秋南京玄奘寺供奉日本甲级战犯牌位的事儿闹得群起激愤,大大伤害了中国人民的民族感情,这种赤裸裸挑衅民族底线的行为实在令人发指!当然,这件事美股见底了吗?在标准普尔500指数测试4,000点后,股市多头们探出头来,宣布2022年的抛售已经见底,因为指数从6月的低点延续反弹,但是,怀疑论者仍然看不到熊市反弹的迹象。标普500SPX指数复盘中国女足平韩国,看汪林琳盛世美颜,展望7月26日决战日本复盘中国女足11平韩国,展望7月26日决战日本女足。7月23日晚,东亚杯第二轮比赛继续进行,中国女足基本延续了首轮对阵台北的首发阵容,像王霜宋端唐佳丽等悍将依然没有首发。唐佳丽整个为啥新能源汽车烧起来更猛烈?林志颖父子从车祸火海中侥幸逃生许多人总对电动汽车燃烧感到奇怪,认为即便电池受到损伤只会没有电失去效能,但不会像燃油车那样剧烈燃烧,因为这种车既然没有易燃的燃油,怎么会燃烧呢?其实电动汽车烧起来比燃油车更猛烈,电俄乌冲突第150天,俄军又有4个新动作!普京强硬超乎美西方想象作者伊万(沃民高科沃德研究院研究员)7月18日,俄罗斯国防部长谢尔盖绍伊古大将视察了在乌克兰执行特别军事行动任务的俄军东部战役集群。绍伊古在视察期间指示,优先任务是摧毁乌军向顿巴斯
鸿蒙系统与安卓系统的区别华为鸿蒙已经发布快一年了,但是经常还有小伙伴说,鸿蒙不就是安卓系统套个壳么?类似小米的米UI和华为自有的EMUI。我们不可否认鸿蒙2。0系统跟安卓的界面确实很相似,但就因此判定鸿蒙脖子腋下长的小肉粒是什么?会损伤健康吗?早知道早去除现在的人对于身体的保养越来越重视,如果发现身体出现异常状况时总是担心得睡不着觉,恨不得立马跑去医院进行检查。尤其是在洗完澡照镜子的时候,会发现自己的脖子腋下以及腹股沟部位长出了一些美开始妥协了,正式解除了对欧菲光的限制老美妥协了,官宣了对中企的解禁,胜利的号角已经吹响!老美耗费这么大精力,精心去布局着一切,试图限制中国科技的发展,看似对中企产生了不小的影响,但实则是值得我们欢喜的,间接证明近些年武大博士喜提老旧宿舍,仿佛住在危房里,没胆的人不敢住随着我国教育水平的提升,现如今在社会上高学历人群的身影已经非常常见了。并且现在不少大学生都已经把考研纳入到了自己的规划之中,研究生群体的人数每年也在呈现上升的趋势。不止如此,现在准当林智坚成民进党选情的破口中时社论继论文门事件后,民进党桃园市长参选人林智坚近日再爆任内斥资12亿元(新台币,下同)改建的新竹市立棒球场,到处都有问题,甚至造成多名球员受伤。以新竹为主场的味全龙球迷强烈要求傅首尔为合作道歉,董宇辉直接拉黑,全网都在声讨趣店罗敏为什么没朋友?今天(7月26日),有关傅首尔道歉的消息,上榜多个热搜。傅首尔发文回应与趣店合作称和趣店预制菜的合作是单次,没有深度合作,也没有后续合作。对品牌前身确实缺乏了解,没有做好企业及市场退休后才明白,人到晚年最大的不幸,就是缺失这3张底牌银魂中有一句经典台词互相较量的时候,谁先亮出手中的底牌谁就算输,能将王牌留到最后一刻才是赢家。与他人较量,与生活较量,与岁月较量,手握底牌走到最后,才能保自己一世安稳。我们常以为,诸葛亮双腿没有病,为何打仗时总坐着轮椅?这才是他的精明之处说到诸葛亮国人可谓是无人不晓,妇孺皆知。鞠躬尽瘁死而后已,这是后人对诸葛孔明的一种赞誉,更是一代先哲的高风亮节。然而一直以来关于诸葛亮总是有个疑问,那就是这位原本身体好好的,腿脚也梦游阴间这个礼拜,我老公和儿子都去外省了,我本就胆小,只要是一个人在家,都要开灯睡觉。但是这样明显睡不好,整个人都很疲倦,影响第二天的工作。昨晚,我壮着胆子关灯睡觉,却不想做了这个终生难忘李自成进入紫禁城后,皇宫中的妃嫔结局如何,说出来你别不信崇祯十七年三月,北京紫禁城内一片慌乱,原本安静祥和的后宫充斥着哭声,向来受宠的长平公主跪倒在地,抱着崇祯皇帝的衣角苦苦哀求父皇,求你不要杀我。然而,崇祯皇帝手起刀落,砍下了长平公主火葬场火化遗体时,为什么不让家属靠近?火化师怕家属接受不了同村的老吴曾经是一名火化师,在殡仪馆工作了将近10年,据说焚烧的遗体不下7000具,见识过各种各样的死者。如今老吴已经退休,平时喜欢跟我们年轻人聊聊人生,吹吹牛,讲一讲火化场那些事