count(*)这么慢,我该怎么办?
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(*)这么慢,我该怎么办?的更多相关文章
- nodejs api 中文文档
文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...
- C#中Length和Count的区别(个人观点)
这篇文章将会很短...短到比你的JJ还短,当然开玩笑了.网上有说过Length和count的区别,都是很含糊的,我没有发现有 文章说得比较透彻的,所以,虽然这篇文章很短,我还是希望能留在首页,听听大家 ...
- [PHP源码阅读]count函数
在PHP编程中,在遍历数组的时候经常需要先计算数组的长度作为循环结束的判断条件,而在PHP里面对数组的操作是很频繁的,因此count也算是一个常用函数,下面研究一下count函数的具体实现. 我在gi ...
- EntityFramework.Extended 实现 update count+=1
在使用 EF 的时候,EntityFramework.Extended 的作用:使IQueryable<T>转换为update table set ...,这样使我们在修改实体对象的时候, ...
- 学习笔记 MYSQL报错注入(count()、rand()、group by)
首先看下常见的攻击载荷,如下: select count(*),(floor(rand(0)*2))x from table group by x; 然后对于攻击载荷进行解释, floor(rand( ...
- count(*) 与count (字段名)的区别
count(*) 查出来的是:结果集的总条数 count(字段名) 查出来的是: 结果集中'字段名'不为空的记录的总条数
- 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 ...
- [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- [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 ...
随机推荐
- 系统基础优化( 创建yum私有仓库最详细操作及解释 )
目录 系统基础优化 一.Linux中安装软件的方式 安装方式 三种安装方式的区别 二.RPM安装☆ 1.安装及其他命令 2.手动下载软件包,可将其拖入shell中自动传入 1).手动网页下载软件包 2 ...
- Solution -「CF 1392H」ZS Shuffles Cards
\(\mathcal{Description}\) Link. 打乱的 \(n\) 张编号 \(1\sim n\) 的数字排和 \(m\) 张鬼牌.随机抽牌,若抽到数字,将数字加入集合 \(S ...
- SpringCloud微服务实战——搭建企业级开发框架(三十七):微服务日志系统设计与实现
针对业务开发人员通常面对的业务需求,我们将日志分为操作(请求)日志和系统运行日志,操作(请求)日志可以让管理员或者运营人员方便简单的在系统界面中查询追踪用户具体做了哪些操作,便于分析统计用户行为: ...
- Typora的使用教程.md
Typora的使用教程 原创:https://home.cnblogs.com/u/cn-zhouchao 2021.12.13 一.软件的介绍 Typora 是一款由 Abner Lee 开发的轻量 ...
- 软考高级及杭州E类人才申请经验分享
目录 前沿 软考高项 什么是软考 软考的基本过程 报名 是否报班 高项考些什么以及需要哪些书 如何准备 杭州E类人才申请 如何申请 大概的流程 前沿 挺久没更新了,自从成为房奴后,看书的时间就变少了, ...
- 【windows 操作系统】进程间通信(IPC)简述|无名管道和命名管道 消息队列、信号量、共享存储、Socket、Streams等
一.进程间通信简述 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进 ...
- 【C#反射】Type的用法
Type属性的应用 Type type = typeof(MyClass); Console.Write("$类型名:{ type.Name}"); Console.Write(& ...
- Vue之路由的使用
零.传统路由与SPA的区别 传统开发方式下,URL改变后,就会立刻发生请求去请求整个页面,这样可能请求加载的资源过多,可能会让页面出现白屏. 在SPA(Single Page Application) ...
- C# Md5Hash
/// <summary> /// MD5 32位加密(大写) /// </summary> /// <param name="str">< ...
- tp5.0 composer下载phpexcel 实现导出excel 表格
tp5.0 composer下载phpexcel 实现导出excel 表格 1.在下载好的tp5.0 框架里面使用 composer 下载phpexcel 的插件 composer require p ...