搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小丑西瓜9
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
景联文科技:用高质量数据采集标注赋能无人机技术,引领无人机迈入新纪元!
2
AI赋能分层模式,解构未来,智领风潮
3
huggingface-cli: command not found
4
git基本操作命令整理。
5
KAN网络技术最全解析—最热KAN能否干掉MLP和Transformer?(收录于GPT-4/ChatGPT技术与产业分析)
6
实习记录小程序|基于SSM的实习记录小程序设计与实现(源码+数据库+文档)_实习日记生成器小程序
7
spark 连接 mysql 出现 No suitable driver_no suitable driver spark
8
MybatisPlus报错Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 3, Size: 3_mybatisplus报错indexoutofbounds
9
【通过EM算法实现GMM学习的3D可视化】三维数据的高斯混合模型的 3D 可视化研究(Matlab代码实现)_三维 高斯分布
10
测绘院、国土局如何提升GIS系统数据的安全性?
当前位置:
article
> 正文
『MySQL 实战 45 讲』14 - count(*) 慢的根本原因_mysql count总数很慢
作者:小丑西瓜9 | 2024-05-06 16:40:49
赞
踩
mysql count总数很慢
count(*) 慢的根本原因
count(*) 的实现方式
MyISAM 引擎会把一个表的总行数存在了磁盘上
InnoDB 引擎需要把数据一行行读出,累计计数
为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢
由于多版本并发控制的原因(和快照读有关系),即同一时刻存在多个查询,InnoDB 表返回多少行不确定
例如三个用户对 A、B、C 并行开启事务会话,结构都不一样
会话 A 先启动事务并查询一次表的总行数
会话 B 启动事务,插入一行后记录后,查询表的总行数
会话 C 先启动一个单独的语句,插入一行记录后,查询表的总行数
MYSQL 对 count(*) 操作,仍然做了优化
MySQL 优化器会找数据量少的索引树(包括主键、普通索引树比较)来遍历获取结果
不要使用下面命令来获取行数,其中的 TABLE_ROWS 字段是统计索引值,不准确
show table status
1
不同的 count 用法
首先明确,count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是 NULL,累计值就加 1,否则不加
对于 count(主键 id) 、 count(1) 、 count(字段)、count(*) 的性能分析
count(主键 id)
会遍历整张表,把每一行的 id 值都取出来,返回给 server 层。server 层拿到 id 后,判断是不可能为空的,就按行累加
count(1)
遍历整张表,但不取值。server 层对于返回的每一行,放一个数字 “1” 进去,判断是不可能为空的,按行累加
count(字段)
如果这个 “字段” 是定义为 not null 的话,一行行地从记录里面读出这个字段,判断不能为 null,按行累加
如果这个 “字段” 定义允许为 null,需要判断累加
count(*)
做了专门优化,不取值。count(*) 肯定不是 null,按行累加
效率排序
count(字段)<count(主键 id)<count(1)≈count(*)
1
解决方案
用缓存系统保存计数
使用 Redis 服务保存这个表的总行数
这个表每被插入一行 Redis 计数就加 1,每被除一行 Redis 计数就减 1
然后把总行数定期地持久化存储起来
如果 Redis 异常重启以后,则到数据库里面单独执行一次 count(*) 获取真实的行数,然后把值写回到 Redis 里
注意:
将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的
在数据库保存计数
计数直接放到数据库里单独的一张计数表 C 中
如果有时序问题,就用事务来查表
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
【wpsshop博客】
推荐阅读
article
浅谈
MySQL
写
数据
一致性
保障机制_
mysql
双
写
机制保证
数据
一致性
...
MySQL
是通过2PC来保证
写
数据
一致性
的,具体步骤如下。redo-logredo-logpreparecommitbi...
赞
踩
article
美团
二面:
Redis
与
MySQL
双写
一致性
如何
保证
?_
美团
二面
redis
mysql
...
四月份的时候,有位朋友去
美团
面试,他说被问到
Redis
与
MySQL
双写
一致性
如何
保证
? 这道题其实就是在问缓存和数据库在...
赞
踩
article
Redis
与
MySQL
双写
一致性
如何
保证
?_怎样
保证
双写
原子性...
前言四月份的时候,有位好朋友去美团面试。他说,被问到
Redis
与
MySQL
双写
一致性
如何
保证
?这道题其实就是在问缓存和数...
赞
踩
article
Redis
mysql
双写一致性
_
f$
_
;
&hgx
mysql
...
意思是 当数据库数据更新时,redis中的缓存数据和数据库中的数据怎么保存一致;第一种方案:先更新再删除缓存。缺点:先更...
赞
踩
article
【
MySQL
进阶
之路
丨第五篇】
MySQL
Workbench
的
安装
与
配置
...
步骤1:
安装
MySQL
服务器这一步我们在【
MySQL
进阶
之路
丨第二篇】数据库的
安装
与
配置
中已做详细介绍,本文不再赘...
赞
踩
article
mysql
latid1
_
mysql
高性能
压力
测试
(总结了好久)...
前言:根据业务需要,需
测试
mysql
性能和
压力
测试
.这里我说下
测试
方法和
测试
过程以及
测试
中出错的问题估计很多人 跟我...
赞
踩
article
mysql
报错 ERROR 1396 (
HY000
): Operation
ALTER
USER
...
mysql
修改密码
ALTER
USER
'
root
'@'
localhost
' IDENTIFIED BY '123'...
赞
踩
article
Navicat
for
MySQL
安装和破解(完美)_
navicat
12
for
mysql
解压...
Navicat
工具使用方便,但需要破解。安装完成后,进行破解然后选择刚刚安装的
Navicat
安装路径下找到
navicat
...
赞
踩
article
Navicat
12 for
MySQL
最新版
激活(
注册机
)_
navicat
mysql
最新版
...
最新版
注册机
+
Navicat
下载:链接:https://pan.baidu.com/s/1TpJV9mWPXNm0AmN...
赞
踩
article
深入
OceanBase
分布式
数据库
:
My
SQL
模式
下的
SQL
基本操作
...
这种高度的兼容性使得企业在不改变原有业务逻辑的情况下,能够轻松地将数据和应用从
My
SQL
迁移到
OceanBase
,从而享...
赞
踩
article
com
.
mysql
.
jdbc
.exceptions.
jdbc
4.MySQLNonTransientC...
数据库连接问题老生常谈了,今天来说一个经常遇到的问题。
com
.
mysql
.
jdbc
.exceptions.
jdbc
4.M...
赞
踩
article
GitHub
Copilot
-
Elasticsearch
和
MySQL
单表查询耗时比对_co...
当单表数据库超过百万后,数据库查询明显变慢,为了对比
Elasticsearch
的效果,将百万级的测试数据导入到 El...
赞
踩
article
Mysql
-
聚合
函数
和
分组
查询...
通过本文的介绍,您应该对MySQL中的
聚合
函数
和
分组
查询有了更清晰的理解。这些功能可以帮助你对大量数据进行统计和分析,从...
赞
踩
article
【
MySQL
】
1
.
安装
与
配置
...
文件的安全性问题。文件不利于数据查询和管理。文件不利于存储海量数据。文件在程序中控制不方便。数据库存储介质:磁盘+内存。...
赞
踩
article
MySQL
-笔记-09.
存储
过程
及
触发器
的
使用
...
表示输出参数,要求在调用
存储
过程
时,必须为该参数传入一个用户会话变量(全局变量),用于将
存储
过程
运算中
的
结果带出到调用处...
赞
踩
article
mysql
多表
查询
详解_
MySql
多表
查询
优化详解...
本文来源于:java后端编程对数据表的
多表
查询
也是必不可少的,本篇内容主要给大家讲解
多表
联合
查询
的优化。一、
多表
查询
连接...
赞
踩
article
MySQL
字符串
操作(
substr
-截取、
locate
-
instr
-
position
子父串判断)_...
Mysql 常用的
字符串
操作函数,
substr
、
locate
、
instr
等_mysql
substr
ing截取
字符串
my...
赞
踩
article
MySQL
locate
()函数
_
mysql
的
locate
函数...
转载:https://www.yiibai.com/
mysql
/
mysql
_
function
_
locate
.html
_
m...
赞
踩
article
MySQL
-
locate
()
函数
_
mysql
locate
函数
...
判断字符串(string)中是否包含另一个字符串(subStr)
locate
(subStr,string) :
函数
返回...
赞
踩
article
mysql
中
的
locate
,
MySQL
LOCATE
()用法及代码示例...
MySQL
中
的
LOCATE
()函数用于查找字符串
中
子字符串
的
位置。它将返回字符串
中
子字符串首次出现
的
位置。如果字符串
中
不...
赞
踩
相关标签
mysql
数据库
java
redis
后端
sql
mysql进阶之路
mysql workbench
mysql latid1
工具
oceanbase
数据分析
数据挖掘
jdbc
github
copilot
elasticsearch