1)计算一个表有多少行数用什么命令?

  • select count(*) from t

2)count(*)底层是怎样实现的?

  • 在MYISAM中,是把这个总行数存到磁盘中去的,要的时候直接去读就行,特别快。

  • 而在InnoDB引擎中,这个总数是需要去一行一行的扫描表,然后累加起来看有多少行。所以当数据量大之后,count(*)就变慢了。

3)为什么InnoDB引擎不像MYISAM一样把总数直接存到磁盘中?

  • 总数是不断变化的,并且InnoDB还有MVCC多版本并发控制,每一行都要判断对当前这个会话是否可见,每个会话下面读到的值可能都不一样。变数比较大,所以不能写死 。

4)针对InnoDB这种引擎,要想快速读取count(*),有什么优化方案吗?

  • 可以考虑用redis来存总数,插入一行总数+1,删除一行-1。但是用redis的话 不能保证数据的一致性,有可能有些计数没有保存但是redis挂掉了。

  • 针对redis挂掉会造成数据一致性问题我们考虑直接将这个总数放在数据库某张表中存起来,这样即使数据库挂了,重启之后也是能恢复数据的。

5)MYSQL对count(*)一点优化都没有吗 ?

  • 还是有点优化的,我们知道主键索引存的是整行记录,非主键索引存的是主键值。那非主键索引生成的这棵树是远远要小于主键索引这棵树的。我count(*)走主键索引查和走非主键索引查,得到的结果都是一样的,那我当然走树小的非主键索引这棵。

6)有一个命令是show table state,他查出来的里面有个TABLE_ROWS值,那我们可不可以用这个命令来代替count(*)呢?

  • 当然不可以,show table state他算总数的话是估算,误差是比较大的,一半的误差左右。

7)MYISAM虽然查总数快,但不支持事务,show table state呢又不精准,count(*)呢又会有性能问题,那现在我有一个页面要经常显示总数,那我们该怎么办?

  • 自己计数。找一个地方,把总数存起来。就是我们4)中的两个方案。

8)count(*),count(1),count(字段),count(主键id)有什么区别?

下面的引擎都指的是InnoDB

  • count(1) :引擎扫描全表,但不取值,直接全部丢给server层去。server 层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,加起来的结果就是总数。

  • count(主键 id):引擎扫描全表 ,把id值取出来,返回给server层。到了server层之后,server层把id不为空的加起来就是结果。

  • count(字段):引擎扫描,一行一行取出来,然后拿给server层。

    • 如果这个字段定位为not null:那server层直接数有多少行

    • 如果这个字段可以为null:server层看返回的这些行,字段不为空的那就累加起来返回。

  • count(*):MYSQL有优化,确保行中肯定不为null,所以直接数有多少行,这个速度还是挺快的,所以我们首选还是得这个。

count(*)这么慢,我该怎么办?的更多相关文章

  1. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

  2. C#中Length和Count的区别(个人观点)

    这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...

  3. [PHP源码阅读]count函数

    在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现. 我在gi ...

  4. EntityFramework.Extended 实现 update count+=1

    在使用 EF 的时候,EntityFramework.Extended 的作用:使IQueryable<T>转换为update table set ...,这样使我们在修改实体对象的时候, ...

  5. 学习笔记 MYSQL报错注入(count()、rand()、group by)

    首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table group by x; 然后对于攻击载荷进行解释, floor(rand( ...

  6. count(*) 与count (字段名)的区别

    count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数

  7. BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 5217  Solved: 1233 ...

  8. [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数

    Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...

  9. [LeetCode] Count of Range Sum 区间和计数

    Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...

  10. [LeetCode] Count of Smaller Numbers After Self 计算后面较小数字的个数

    You are given an integer array nums and you have to return a new counts array. The counts array has ...

随机推荐

  1. 7、前端--jQuery简介、基本选择器、基本筛选器、属性选择器、表单选择器、筛选器方法、节点操作、绑定事件

    jQuery简介 宗旨:Write less, do more. 内部封装了js代码 是编程更加简单并且兼容所有的主流浏览器 版本:1.x 2.x 3.x # 可以使用3.x最新版 是第三方的类库:使 ...

  2. Solution Set -「ABC 217」

      大家好屑兔子又来啦! [A - Lexicographic Order]   说个笑话,\(\color{black}{\text{W}}\color{red}{\text{alkingDead} ...

  3. Solution -「NOI 2012」「洛谷 P2050」美食节

    \(\mathcal{Description}\)   Link.   美食节提供 \(n\) 种菜品,第 \(i\) 种的需求量是 \(p_i\),菜品由 \(m\) 个厨师负责制作,第 \(j\) ...

  4. 微服务从代码到k8s部署应有尽有系列(五、民宿服务)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  5. ZCC2410同步升压变换芯片

    ZCC2410???? 22V/25A同步升压变换器  ZCC2410是一种高效率.高功率密度.宽输入范围.电流模式升压变换器.该转换器集成了一个10mΩ.24V电源开关和一个同步门高转换器效率的驱动 ...

  6. 使用传统的三层架构出现的问题.引入Spring底层实现原理来解决(工厂模式+反射+XML配置文件/注解)

    以前写的代码 mapper层 public interface PersonMapper { void selectPersonList(); } public class PersonMapperI ...

  7. 软件性能测试分析与调优实践之路-Java应用程序的性能分析与调优-手稿节选

    Java编程语言自从诞生起,就成为了一门非常流行的编程语言,覆盖了互联网.安卓应用.后端应用.大数据等很多技术领域,因此Java应用程序的性能分析和调优也是一门非常重要的课题.Java应用程序的性能直 ...

  8. Windows server 2012安装VM tools异常解决办法

    在VMWare虚拟机上安装Windows Server 2012之 后安装VMWare Tools时报如下错误信息: 问题:缺少KB2919355补丁 (先安装KB2919442,在安装KB29193 ...

  9. springMVC整合mybatis,spring

    使用spring-mvc创建一个项目的过程 spring的配置十分复杂,很难记忆. 这篇博客用于记录springmvc整合创建过程,虽然步骤有点多,但是每一步都很容易理解,便于以后忘记后参考和记忆. ...

  10. 【C# 线程】interLocked锁

    overview 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...