20200616学习笔记

20200616学习笔记count(*) 的实现方式 在不同的 MySQL 引擎中,count(*) 有不同的实现方式 MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效…

20200616学习笔记

count(*) 的实现方式

在不同的 MySQL 引擎中,count(*) 有不同的实现方式

  • MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高
  • 而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数

注意讨论的是没有过滤条件的 count(*),如果加了 where 条件的话,MyISAM 表也是不能返回得这么快的

InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。所以,普通索引树比主键索引树小很多。对于 count(*) 这样的操作,遍历哪个索引树得到的结果逻辑上都是一样的。因此,MySQL 优化器会找到最小的那棵树来遍历

小结:

  • MyISAM 表虽然 count(*) 很快,但是不支持事务;
  • show table status 命令虽然返回很快,但是不准确;
  • InnoDB 表直接 count(*) 会遍历全表,虽然结果准确,但会导致性能问题。
  • 那么如果你现在有一个页面经常要显示交易系统的操作记录总数,到底应该怎么办呢?答案是,我们只能自己计数

不同的 count 用法

count(字段)<count(主键 id)<count(1)≈count(*)

  • count(主键 id) :,InnoDB 引擎会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加。
  •  count(1) : InnoDB 引擎遍历整张表,但不取值。server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加 , 单看这两个用法的差别的话,你能对比出来,count(1) 执行得要比 count(主键 id) 快。因为从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。
  •  count(字段) :
    • 如果这个“字段”是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加;
    • 如果这个“字段”定义允许为 null,那么执行的时候,判断到有可能是 null,还要把值取出来再判断一下,不是 null 才累加。
  • count(*)  :  肯定不是 null,按行累加 , 尽量使用 count(*)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7871.html

(0)
上一篇 2023-03-12 12:30
下一篇 2023-03-12

相关推荐

  • java操作redis_redis java

    java操作redis_redis java一、 使用Java操作Redis前,请先运行Redis服务与下载Redis驱动,以maven工程为例,引入如下jar <dependency> <groupId>redis.c

    2023-01-28
    172
  • oracle任务调度_oracle 作业和调度

    oracle任务调度_oracle 作业和调度以下例子在scott用户下进行: 一、查看 先查看一下 当前用户的scheduler 的所有数据字典,看看要关注什么 SET LINE 200 PAGESIZE 2000COL TABLE_NAME

    2023-05-29
    151
  • 安装Python教程

    安装Python教程Python是一种高级编程语言,它强调代码可读性和简洁的语法设计。它是一种动态类型、面向对象的语言,可以跨平台运行,非常适合用于数据分析、科学计算、自然语言处理、网站开发等多个领域。

    2024-04-28
    102
  • Python工程师:对称差集是什么?

    Python工程师:对称差集是什么?在python中,有很多数据结构和方法可以让我们更方便地处理数据,同时也提升了编写程序的效率。对称差集就是其中之一,它是指两个集合的元素中,不同时存在于两个集合中的元素构成的集合。在实际的开发中,对称差集常常被用来解决一些实际问题,尤其在处理数据时,更是发挥了重要的作用。在本篇文章中,我们将从多个角度对对称差集进行详细的介绍,让读者更好地理解和掌握这个方法。

    2024-07-05
    46
  • mysql知识点梳理_数学知识

    mysql知识点梳理_数学知识数据准备: –建表 create table customer_jia(CID int(4), Cname varchar(20), Csex varchar(2), Cage int(3), Cj

    2023-05-27
    130
  • Python中 elif 和 else 的条件判断差异

    Python中 elif 和 else 的条件判断差异条件判断语句是Python中常用的语句之一,它允许程序根据某个条件的真假来执行不同的操作。if语句是最基本的条件判断语句,如果条件成立,则执行if后面的代码块,否则不执行。在真假不是非黑即白的情况下,我们需要多个条件来判断,这时就需要elif和else的帮助了。

    2023-12-30
    116
  • 数据库是否适合使用k8s部署_学会数据库使用的重要性

    数据库是否适合使用k8s部署_学会数据库使用的重要性作者:Stephen Thorn 翻译:刘玲玲 原文:https://www.percona.com/blog/2020/10/08/the-criticality-of-a-kubernetes-o

    2023-06-01
    154
  • Python中的and和or用法

    Python中的and和or用法在Python中,and和or是逻辑运算符。and运算符是指两个条件同时成立,结果为True;or运算符是指两个条件中有一个成立,结果为True。

    2024-06-27
    46

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注