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

MySQL 的 count(*) 的优化,获取千万级数据的总行数

来源:blog.csdn.net/LJFPHP/article/details/84400400 一、前言 这个问题是今天朋友提出来的,关于查询一个1200w的数据的总行数,用count(*)的速度一直提不上去...找了很多优化方案,最后另辟蹊径,选择了用explain来获取行数。 二、关于count的优化 网上关于count()优化的有很多。...这两个函数默认使用的是数据中最短的那个索引字段。我朋友这边因为中只有一个索引字段,所以使用count(1)和count()没什么区别。...三、使用explain获取行数 1、关于explain 关于explain,使用mysql的都知道,这个函数是专门用于查看sql语句的执行效率的,网上可供参考的文章很多。...我们使用explain之后,会看到返回很多参数,其中: rows:显示MySQL认为它执行查询时必须检查的行数。就是这个东西了,既然我们要获取的是数据行数,那么可以使用: ?

3.4K20

mysql源和目标端行数检查

导数据是很长有的事, 导完了总得检查一下把, 云上有DTS很方便, 但是有的环境只能手动导数据了, 这比较就比较麻烦了, 或者是用户自己导的, 让你检查检查, 总之检查两个库之间的数据量是很常见的工作...我分享下脚本检查mysql两库之间数据行数的脚本吧. 这个脚本是mysql的, 也可以改一改给pg或者oracle用, 我就不写了哈 1....例子: 并行度默认是本机线程数的2倍 默认该库所有 image.png 也可以手动指定库名: image.png 4. 脚本如下: #!.../bin/env bash #write by ddcw at 2021.06.26 #检查mysql数据是否一致, 只检查行数量 #用法, sh $0.sh src_user/src_passowrd...'{print $1}')\033[0m" echo -e "一致的: ${same_tbale} \t 不一致的: ${no_same_tbale}" } init_param # echo

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

Mysql获取数据的总行数count(*)很慢

引擎把一个的总行数存在了磁盘上,因此执行count(*)的时候直接返回个数,效率很高 而innoDB引擎就麻烦了,他的执行count(*)的时候,是一行行的累加计数 当然我们要知道此事的说的是没有带条件的...,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库优化的通用手段之一 此时你可能还依稀记得下面命令可以获取行的数量,但是据官方说明,这个命令返回的行数,是不准确的,只有达到40-50%,所以这个命令也不能直接使用...服务来保存这个行数,这个每插入一条数据,redis就加1,每次删除就减一,试想一下还有什么问题吗 缓存系统可能会发生数据丢失,由于redis不能永久的存储在内存中,因此我们可能会想到持久化存储起来...比如有个页面要显示近期操作的100条记录和总操作数,这页面的逻辑就是到redis获取总数,再到数据库获取100条记录,如下两种会发生数据不一致的情况 查询到100结果里面有最新插入的数据,而redis...不管上面那种时序去查询数据,最终的结果都会不准确, 使用数据库保存计数 我们可以使用在数据库新建一张C去记录操作的总行数,由于innodb支持崩溃恢复不丢失数据的,因此可以解决数据丢失的问题,是否能解决不准确的问题呢

4.9K20

MySQL十四:单最大2000W行数

转载~ 在互联网技术圈中有一个说法:「MySQL数据量大于 2000 W行,性能会明显下降」。网传这个说法最早由百度传出,真假不得而知。但是却成为了行业内一个默认的标准。...单超过2000W行数据一定会导致性能下降吗?我认为是不一定的,虽然说建议单不超过2000W,但是我不接受它的建议可不可以?那必然也是可以的。...一、单最大到底能存多少数据 先来看看下面这张图,了解一下mysql各个类型的大小 我们知道在MySQL是支持主键自增长的,不考虑其他因素的前提下,理论上只有主键没有用完,中的数据就可以一直增加。...但是数据量的大小却跟2000W没啥影响,既然百度大佬推荐单最大2000W行数据,那肯定不会是空口白话,一定定会有其他影响行数的因素」。...2.1 数据存储的结构 在MySQL中默认的存储引擎是InnoDB,在之前的《存储引擎》中有说过,InnoDB为每个都生成了两个文件: .frm文件:结构文件 .ibd文件:数据文件(聚簇索引包含数据与索引

3.7K50

获取导入百分比,使用easyexcel获取导入excel行数

背景 分批读取大量数据的excel文件,每次读取1000行数据,然后插入数据库,并且去执行一个方法,执行完毕后更新此行数据的状态。需要获取已更新数据的占比,即计算百分比。...因为可能一次读取的1000行数据更新状态很快,直接1000/1000 * 100=100%了。 但实际上excel文件中实际有1w行数据,那么我们要获取excel的总行数。...方法 使用easyexcel获取行数,记录一下, 在创建监听器时,重写invoke方法时,使用下面代码获取行数(含表头): public void invoke(DemoData data, AnalysisContext...context) { // 获取行数(含表头) Integer rowNumber = context.readSheetHolder().getApproximateTotalRowNumber(...); } 目前只能获取大概的条数(每个excel都会记录一个总条数,但是这个总条数由于各种空行等原因,不一定正确),无法精确获取,要精确获取的自己在监听器里面一条条统计 监听器举例: // 有个很重要的点

66610

为什么说MySQL行数不要超过2000w?

作为在后端圈开车的多年老司机,是不是经常听到过,“mysql最好不要超过 2000w”,“单超过 2000w 就要考虑数据迁移了”,“你这个数据都马上要到 2000w 了,难怪查询速度慢” 这些名言民语就和...单数量限制 首先我们先想想数据库单行数最大多大?...单建议值 下面我们就以 3 层,2 分叉(实际中是 M 分叉)的图例来说明一下查找一个行数据的过程。...,其实这个最大建议值也是不同的,而且影响查询性能的还有很多其他因素,比如,数据库版本,服务器配置,sql 的编写等等,MySQL 为了提高性能,会将的索引装载到内存中。...索引结构不会影响单最大行数,2kw 也只是推荐值,超过了这个值可能会导致 B + 树层级更高,影响查询性能。

53720

Mysql如何随机获取中的数呢rand()

上图我们发现sort_buffer中的位置信息,是个什么概念呢,而Mysql是如何定位一行数据的呢, 首先我们知道mysql中有以下规则 对于有主键的innodb来说,rowid就是我们的主键 对于没有主键的...而优先级算法,可以精准的获取最小的三个word 从临时获取前三行,组成一个最大堆 然后拿下一行数据,和最大堆的R比较,大于R,则丢弃,小于R,则替换 重复2的步骤,直到把10000行数据循环完成...因此我们可以使用下面算法,叫做随机算法2 获取整张的总行数C 计算出Y= floor(C * rand())。...floor函数在这里的作用,就是取整数部分 获取 limit Y ,1,得到一行数据 对应的sql如下 mysql> select count(*) into @C from t; set @Y =...现在如果要获取三个随机数,根据随机算法2的思路 获取整张的总行数C 根据同样的共识获取Y1,Y2,Y3 再执行limit Y,1.获取三个随机数 对应的sql语句如下 mysql> select

4.5K20

mysql 获取分区的最大值_MySQL分区测试「建议收藏」

分区,分区引擎测试 分区的存储引擎相同 mysql> Create table pengine1(id int) engine=myisam partition by range(id)(partition...同一个分区中的所有分区必须使用同一个存储引擎,并且存储引擎要和主表的保持一致。...4.分区类型 Range:基于一个连续区间的列值,把多行分配给分区; LIST:列值匹配一个离散集合; Hash:基于用户定义的表达式的返回值选择分区,表达式对要插入中的列值进行计算。...5.RANGE分区MAXVALUE值 及加分区测试; 创建 PRANGE,最后分区一个分区值是MAXVALUE mysql> Create table prange(id int) engine=myisam...要小心使用其中的一些函数,避免犯逻辑性的错误,引起全扫描。

2.8K30

Mysql实现获取自增id插入到其他

现在有这样一个需求,就是我向A中插入一条数据,id是自增的。...插入之后,还需要向B中插入一条数据,但是B中需要保存的数据中要使用刚刚A自增后的id, 这个其实是一个比较常见的需求,就是两张之间的一个关联,如果用程序来执行也是很容易实现。...比如我就在用sql执行之后,获取A的id插入到B中 实现方式如下: insert into A (id,name,code) values (null, "zhagnsan", "zs"); // 注意...A的id要设置为自增,给null值即可 set @id = @@IDENTITY; // 使用id变量保存刚刚自增生成的id insert into B (id,a_id,name) values...(null, @id, "lisi"); // 使用变量获取AId 上面是用自定义变量的形式进行保存的,如果你只是想查一下是多少,可以直接使用: select @@IDENTITY; 好了,如果对你有帮助

3.9K30
领券