首页
学习
活动
专区
圈层
工具
发布

故障分析 | MySQL 优化案例 - select count(*)

---- 本文关键字:count、SQL、二级索引 相关文章推荐: 故障分析 | MySQL 优化案例 - 字符集转换 技术分享 | MySQL 监控利器之 Pt-Stalk 一、故事背景 项目组联系我说是有一张...500w 左右的表做 select count(*) 速度特别慢。...简单介绍下原理: 聚簇索引:每一个 InnoDB 存储引擎下的表都有一个特殊的索引用来保存每一行的数据,称为聚簇索引(通常都为主键),聚簇索引实际保存了 B-Tree 索引和行数据,所以大小实际上约等于为表数据量...在 select count(*) 的查询过程中,只需要将二级索引读取到内存缓冲区,只有几十 MB 的数据量,所以速度会非常快。...: NULL rows: 5117616 filtered: 100.00 Extra: Using index 七、案例总结 从上述这个测试结果可以看出,和之前的推论基本吻合

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

    性能大PK count(*)、count(1)和count(列)

    印象中网上有些“XX 面试官”系列的网文也有过类似问题的讨论,那 MySQL 统计数据总数 count(*) 、count(1)和count(列名) 哪个性能更优呢?今天我们就来聊一聊这个问题。...count(*) 性能与存储引擎相关 我们都知道,MySQL 常见的存储引擎有两种:MyISAM 和 InnoDB。...count(1) 和 count() 对比 当表的数据量大些时,对表作分析之后,使用 count(1)还要比使用 count(*)用时多了!...从执行计划来看, count(1) 和 count(*)的效果是一样的。但是在表做过分析之后, count(1) 会比 count(*)的用时少些(1w以内数据量),不过差不了多少。...因为 count(*)自动会优化指定到那一个字段,所以没必要去 count(1),用 count(*) sql会帮你完成优化的,因此:count(1) 和 count(*)基本没有差别!

    2K10

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

    ) 2 count(1)、count(*)是检索表中所有记录行的数目,无论是否包含null值 count(1)比count(*)效率高 count(字段),检索表中的该字段的非空行数,即不统计该字段值为...)比count(*)快 若表只有一个字段,count(*)最快 count(1)跟count(主键)一样,只扫描主键 count(*)跟count(非主键)一样,扫描整个表 明显前者更快。...执行效果 count(1) V.S count(*) 表数据量大,对表分析后,用count(1)还要比用count()用时多! 执行计划看,count(1)和count(*)效果一样。...因为count(*)会自动优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化。 因此:count(1)和count(*)基本无差。...count(*) count(1) count(列名) count(*)包括所有列,相当于行数。统计结果时,不忽略列值为NULL count(1)包括了忽略所有列,1代表代码行。

    4.5K20

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

    注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层,...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...性能对比结论 count(可空字段) count(非空字段) = count(主键 id) count(1) ≈ count(*) 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn

    3.5K10

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

    注:下面的讨论和结论是基于 InnoDB 引擎的。 首先要弄清楚 count() 的语义。...所以,count(*)、count(1)和count(主键 id) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...count(可空字段) 扫描全表,读到server层,判断字段可空,拿出该字段所有值,判断每一个值是否为空,不为空则累加 count(非空字段)与count(主键 id) 扫描全表,读到server层,...注意:count(1)执行速度比count(主键 id)快的原因:从引擎返回 id 会涉及到解析数据行,以及拷贝字段值的操作。 count(*) MySQL 执行count(*)在优化器做了专门优化。...性能对比结论 count(可空字段) count(非空字段) = count(主键 id) count(1) ≈ count(*)

    3.3K30

    MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

    但是,在实际使用过程中,我们可能会遇到不同的 COUNT 函数写法,比如 COUNT(*)、COUNT(主键id)、COUNT(字段) 和 COUNT(1),这些写法在效率上有何差别呢?...这里需要注意的是,如果主键是一个自增长列,那么 COUNT(*) 和 COUNT(主键id) 得到的结果是相同的,因为自增长列的值必定不为 NULL。那么,这两种写法的效率如何呢?...COUNT(字段) 表示计算该字段不为 NULL 的记录数,而 COUNT(1) 表示计算所有行数,这里需要注意的是,COUNT(1) 和 COUNT(*) 的作用是相同的。...综上所述,我们可以得出以下结论:当查询的表中不存在 WHERE 子句和 GROUP BY 子句时,COUNT(*) 可能比 COUNT(主键id) 稍微快一点。...在单表查询时,COUNT(1) 和 COUNT(字段) 的性能通常相同,因为它们使用的优化方案也相同。在多表查询时,COUNT(1) 通常比 COUNT(字段) 更快。

    2.2K30

    MySQL中count(*)、count(主键id)、count(字段)和count(1)那种效率更高?

    在select count(?) from t这样的查询语句里面,count(*)、count(主键id)、count(字段)和count(1)等不同用法的性能,有哪些差别。...所以,count(*)、count(主键id)和count(1) 都表示返回满足条件的结果集的总行数;而count(字段),则表示返回满足条件的数据行里面,参数“字段”不为NULL的总个数。...所以结论是: 按照效率排序的话,count(字段)count(主键id)count(1)≈count(*),所以我建议你,尽量使用count(*)。...其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。...InnoDB引擎支持事务,我们利用好事务的原子性和隔离性,就可以简化在业务开发时的逻辑。这也是InnoDB引擎备受青睐的原因之一。

    5.4K50

    生信学习小组day6--大姚

    ") library(dplyr) 示例数据采用内置数据集iris的简化版 test <- iris[c(1:2,51:52,101:102),] 二、dplyr五个基础函数 1.mutate(),新增列...Species分组,计算每组Sepal.Length的平均值和标准差 group_by(test, Species) summarise(group_by(test, Species),mean(Sepal.Length...), sd(Sepal.Length)) 三、dplyr两个实用技能 1:管道操作 %>% 可以直接把数据传递给下一个函数调用或表达式 快捷键(cmd/ctr + shift + M) group_by...中的数据直接传递给group_by函数使用,也可以将分组后的species数据传递给summarise函数使用 test %>% group_by(Species) %>% summarise...(mean(Sepal.Length), sd(Sepal.Length)) 2:count统计某列的unique值 count(test,Species) 四、dplyr处理关系数据 test1 <-

    1.1K00

    Day6-学习笔记(2024年2月3日)

    学习R包R包是多个函数的集合,具有详细的说明和示例,学习生信R语言必学的原因是丰富的图表和biocductor的各种生信分析R包,包的使用是一通百通的,以dplyr为例,讲解一下R包一、安装和加载R包1...")library(dplyr)示例数据直接使用内置数据集iris的简化版:test dplyr五个基础函数1.mutate(),新增列mutate...的平均值和标准差group_by(test, Species)summarise(group_by(test, Species),mean(Sepal.Length), sd(Sepal.Length)...)三、dplyr两个实用技能1.管道操作 %>% (cmd/ctr + shift + M)test %>% group_by(Species) %>% summarise(mean(Sepal.Length...), sd(Sepal.Length))(加载任意一个tidyverse包即可用管道符号)2.count统计某列的unique值count(test,Species)四、dplyr处理关系数据将2个表进行连接

    45010
    领券