首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么mysql的count()方法这么慢?

为了获取满足某些条件的行数是多少,我们一般会使用count()方法。 这时候为了获取未发送的短信数据,我们很自然就想到了使用下面的sql语句进行查询。...我们先从count()方法的原理聊起。 count()的原理 count()方法的目的是计算当前sql语句查询得到的非NULL的行数。 我们知道mysql是分为server层和存储引擎层的。...为什么innodb不能像myisam那样实现count()方法 myisam和innodb这两个引擎,有几个比较明显的区别,这个是八股文常考了。...那如果不可避免要使用count(),有没有办法让它快一点? 各种count()方法的原理 count()的括号里,可以放各种奇奇怪怪的东西,想必大家应该看过,比如放个星号*,放个1,放个索引列啥的。...我们来分析下他们的执行流程。 count方法的大原则是server层会从innodb存储引擎里读来一行行数据,并且只累计非null的值。但这个过程,根据count()方法括号内的传参,有略有不同。

1.1K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

    注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...至于分析性能差别的时候,记住这么几个原则: server 层要什么就给什么; InnoDB 只给必要的值; 现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。

    2.5K30

    MySQL中count(字段) ,count(主键 id) ,count(1)和count(*)的区别

    注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加。最后返回累计值。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...至于分析性能差别的时候,记住这么几个原则: server 层要什么就给什么; InnoDB 只给必要的值; 现在的优化器只优化了 count(*) 的语义为“取行数”,其他“显而易见”的优化并没有做...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。

    2.4K10

    count(1)、count(*) 与 count(列名) 的执行区别

    从执行计划来看,count(1)和count(*)的效果是一样的。但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(*),自动会优化指定到那一个字段。...2、count(1) and count(字段) 两者的主要区别是 count(1) 会统计表中的所有的记录数,包含字段为null 的记录。...count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。...,相当于行数,在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候

    1.6K30

    MySQL的count(*)、count(1)和count(列名)区别

    假如有如下数据: 所有记录 统计行的总数 计算 Zara 的记录数 count(1)、count() 都是检索表中所有记录行的数目,不论其是否包含null值。...count(1)比count()效率高。 count(字段)是检索表中的该字段的非空行数,不统计这个字段值为null的记录。...从执行计划来看,count(1)和count()的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count() 会自动优化指定到那一个字段。...count(1) and count(字段) count(1) 会统计表中的所有的记录数,包含字段为null 的记录 count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。

    3.5K20

    count(1)、count(*) 与 count (列名) 的执行区别

    从执行计划来看,count(1)和count(*)的效果是一样的。但是在表做过分析之后,count(1)会比count(*)的用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(*),自动会优化指定到那一个字段。...2、count(1) and count(字段) 两者的主要区别是 count(1) 会统计表中的所有的记录数,包含字段为null 的记录。...count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。...,相当于行数,在统计结果的时候,不会忽略列值为NULL count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL count(列名)只包括列名那一列,在统计结果的时候

    3.1K10

    MySQL COUNT(*) COUNT(1) 与 COUNT(列) 的区别

    文章目录 1.COUNT() 2.COUNT(*) COUNT(1) 与 COUNT(列) 的功能? 3. 统计表行数性能区别 3.1 COUNT(主键) 的执行过程?...3.2 COUNT(1) 的执行过程? 3.3 COUNT(*) 的执行过程? 3.4 COUNT(字段) 的执行过程? 3.5 小结 4.为什么要通过遍历的方式来计数?...对于 COUNT 的使用,常见的使用方式是: COUNT(*) COUNT(1) COUNT(列) 三者在功能和性能上有区别吗?且听我一一道来。...统计表行数性能区别 统计表的总记录数下面这 4 种做法: COUNT(*) COUNT(1) COUNT(主键) COUNT(字段) 关于四者的性能,基于常用的 InnoDB 存储引擎来说明。...COUNT(字段) 的执行效率相比前面的 COUNT(1)、 COUNT(*)、 COUNT(主键) 执行效率是最差的。

    34410

    count(*) count(1)与count(col)的区别

    一、执行结果 count(*) 和count(1) 都是统计行数,而count(col) 是统计col列非null的行数 二、执行计划   MyISAM与InnoDB,正如在不同的存储引擎中,count...有主键或联合主键的情况下,count(*)略比count(1)快一些。  没有主键的情况下count(1)比count(*)快一些。  如果表只有一个字段,则count(*)是最快的。...3、count(字段),非主键字段,这样的使用方式最好不要出现,因为它不会走索引。 count(主键ID)比count(1)慢的原因?...从InnoDB引擎层返回ID会涉及到解析数据行、拷贝字段值的操作,因此count(主键 ID)执行要比count(1)执行慢。 count(主键id)走主键索引的时候效率较count(*)差的原因?...但是在做count(*)的时候并没有检索具体的一行或者一个范围,那么选择基数小的索引对count操作效率会更高。在做count操作的时候,mysql会遍历每个叶子节点,所以基数越小,效率越高。

    4.5K21

    Warning: count():302解决方法

    ytkah在调试项目时又弹出一个警告Warning: count(): Parameter must be an array or an object that implements Countable...in line 302,count()参数必须是一个数组或一个对象,和前面warning: a non-numeric value encountered in line错误类似,都是php7版本引起的...,版本更新,部分方法变得更加严谨了 当传递一个无效参数的时候,count()函数会抛出warning的警告   既然提示count()参数必须是一个数组或一个对象,那我们就直接将它设为数组试试,原来302...行代码是这样的 if (count($tombstones) > 0) :   我们把它改成 if (count((array)$tombstones) > 0) :   保存上传,清除缓存,刷新页面,...做开发还是要会一点英语比较好,不然文档看半天不知所云,有时翻译又牛头不对马嘴,还有国外的StackOverflow很强大,建议收藏!

    81920

    浅聊count(1)、count(*) 与 count(列名) 的区别

    简单来说: COUNT(1) 和 COUNT(*) 表示的是直接查询符合条件的数据库表的行数。而 COUNT(列名) 表示的是查询符合条件的列的值不为 NULL 的行数。...除了查询得到结果集有区别之外,在性能方面 COUNT(*) 约等于 COUNT(1),但是 COUNT(*) 是 SQL92 定义的标准统计行数的语法**。...COUNT 关于 COUNT 函数,在 MySQL 官网中有详细介绍: COUNT(expr) 返回 SELECT 语句检索的行中 expr 的值不为 NULL 的数量。...但是,值得注意的是,COUNT(*) 的统计结果中会包含值为 NULL 的行数。...综上所述,对于 COUNT(*) 和 COUNT(1) 的性能差异,可能取决于具体的情况和 MySQL 的版本。在实际情况中,可以根据具体的需求和环境选择合适的写法。

    61010

    案例解析:count(1)、count(*) 与 count(列名) 的执行区别

    其实不然,count(1)和count(*)都会对全表进行扫描,统计所有记录的条数,包括那些为null的记录,因此,它们的效率可以说是相差无几。...从执行计划来看,count(1)和count()的效果是一样的。但是在表做过分析之后,count(1)会比count()的用时少些(1w以内数据量),不过差不了多少。...如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。 因为count(),自动会优化指定到那一个字段。...2、count(1) and count(字段) 两者的主要区别是 1、count(1) 会统计表中的所有的记录数,包含字段为null 的记录。...2、count(字段)会统计该字段在表中出现的次数,忽略字段为null 的情况。即不统计字段为null 的记录。

    1.5K11

    python cpu count_Python multiprocessing.cpu_count方法代码示例

    参考链接: Python中的numpy.logical_or 本文整理汇总了Python中multiprocessing.cpu_count方法的典型用法代码示例。...如果您正苦于以下问题:Python multiprocessing.cpu_count方法的具体用法?Python multiprocessing.cpu_count怎么用?...Python multiprocessing.cpu_count使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。...您也可以进一步了解该方法所在模块multiprocessing的用法示例。  在下文中一共展示了multiprocessing.cpu_count方法的30个代码示例,这些例子默认根据受欢迎程度排序。...方法示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。

    69130

    Django学习笔记之Django QuerySet的方法

    一般情况下,我们在写Django项目需要操作QuerySet时一些常用的方法已经满足我们日常大多数需求,比如get、filter、exclude、delete神马的感觉就已经无所不能了,但随着项目但业务逻辑越来越复杂...就是你读出queryset可能会需要一些额外数据要添加进去的时候,你就可以用这个东东咯,使用方法看代码: >>> q = Blog.objects.annotate(Count('entry')) #...django才会从数据库读取这些数据,感觉在数据量变大后用这个方法很nice,具体用法如下: Blog.objects.defer("content").filter(publish=True).defer...答案在这里: django.models 的 on_delete参数,此参数有以下几个可选值: CASCADE:这就是delete()的默认选项,也就是关联删除 PROTECT:如果删除的model obj...12、Avg、Count、Sum、Max、Min、StdDev、Variance 这些方法就是求数据的相应结果咯,比如avg就是平均值啦,嗯,基本都看得懂,除了后两个,一个是方差,一个是标准差,具体用法其实前文里有

    59150

    MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析

    前言   相信在此之前,很多人都只是记忆,没去理解,只知道count(*)、count(1)包括了所有行,在统计结果的时候,不会忽略列值为NULL,count(列名)只统计列名那一列,在统计结果的时候,...count(*)一样   对于count(*)、count(1)或者任意的count(常数)来说,读取哪个索引的记录其实并不重要,因为server层只关心存储引擎是否读到了记录,而并不需要从记录中提取指定的字段来判断是否为...综上所述:   对于count(*)、count(常数)、count(主键)形式的count函数来说,优化器可以选择扫描成本最小的索引执行查询,从而提升效率,它们的执行过程是一样的,只不过在判断表达式是否为...NULL时选择不同的判断方式,这个判断为NULL的过程的代价可以忽略不计,所以我们可以认为count(*)、count(常数)、count(主键)所需要的代价是相同的。   ...count(二级索引列)只能选择包含我们指定的列的索引去执行查询,可能导致优化器选择的索引执行的代价并不是最小。

    1.4K20

    数据库面试题【十九、count(字段) &count(主键 id) &count(1)&count(*)的区别】

    count(1) 扫描全表,但不取值,server层收到的每一行都是1,判断不可能是null,按值累加。...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...因为count(*)返回的行一定不是空。扫描全表,但是不取值,按行累加。...看到这里,你会说优化器就不能自己判断一下吗,主键 id 肯定是非空的,为什么不能按照 count(*) 来处理,多么简单的优化。当然 MySQL 专门针对这个语句进行优化也不是不可以。...但是这种需要专门优化的情况太多了,而且 MySQL 已经优化过 count(*) 了,你直接使用这种语句就可以了。

    65530

    数据库COUNT(*)、COUNT(字段)和COUNT(1)的异同

    COUNT MySQL官网给出的解释是: 1、COUNT(expr) ,返回SELECT语句检索的行中expr的值不为NULL的数量。结果是一个BIGINT值。...而COUNT(列名)表示的是查询符合条件的列的值不为NULL的行数。 而COUNT(*)是SQL92定义的标准统计行数的语法,因为他是标准语法,所以MySQL数据库对他进行过很多优化。...所以,对于COUNT(1)和COUNT(*),MySQL的优化是完全一样的,根本不存在谁比谁快! 建议使用COUNT(*)!...相比COUNT(*),COUNT(字段)多了一个步骤就是判断所查询的字段是否为NULL,所以他的性能要比COUNT(*)慢。 总结 本文介绍了COUNT函数的用法,主要用于统计表行数。...因为COUNT()是SQL92定义的标准统计行数的语法,并且效率高,所以请直接使用COUNT()查询表的行数! Q.E.D.

    1.9K30

    Django笔记(九)Django的ORM,查询数据的方法

    建表 需求(1) 需求(2) 总结 value()函数,获取列表 value()函数,获取元组 总结 建表 目前有两个表,一个用户表,一个用户类型表,一个用户对应一类型,但是一个类型下面有好多的用户...外键是在用户表里面 需求(1) 根据查询出来的用户,获取他的用户类型,这个就是多表查询,实现代码是 先查询出用户,直接根据外键字段获取他的用户类型 需求(2) 根据一个用户类型,查询他下面的所有的用户...其实有一个隐含的字段,写法是 总结 value()函数,获取列表 value()函数,获取元组 总结 以上方法 字典和元组是不可以跨表查询的 以下的写法是可以跨表的

    88620
    领券