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

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

日常开发中,获取数据的总数是很常见的业务场景,但是我们发现随着数据的增长count(*)越来越慢,这个是为什么呢, count(*)的实现方式 我们要明确不同的存储引擎,他的实现方式不一样 MyiSAM...count(*),如果加了where条件的话,MyiSAM返回也不能返回的很快 由于我们现在如果使用mysql,大多使用的存储引擎都是innodb,因此由于他是一行行的累计计数,因此随着数据的越来越多...也是对count(*)是有进行优化的,我们知道我们的索引是一棵树,而主键索引叶子节点是数据,而普通索引叶子节点是主键索引,所以主键索引比普通索引的树大些,因此mysql优化器会拿到索引树小的,进行遍历计算...,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库优化的通用手段之一 此时你可能还依稀记得下面命令可以获取行的数量,但是据官方说明,这个命令返回的行数,是不准确的,只有达到40-50%,所以这个命令也不能直接使用...比如有个页面要显示近期操作的100条记录和总操作数,这页面的逻辑就是到redis获取总数,再到数据库获取100条记录,如下两种会发生数据不一致的情况 查询到100结果里面有最新插入的数据,而redis

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

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

    找了很多优化方案,最后另辟蹊径,选择了用explain来获取行数。 二、关于count的优化 网上关于count()优化的有很多。...MySQL中聚合函数count的使用和性能优化 (https://blog.csdn.net/lmy86263/article/details/73681633) mysql count(*) 会选哪个索引...三、使用explain获取行数 1、关于explain 关于explain,使用mysql的都知道,这个函数是专门用于查看sql语句的执行效率的,网上可供参考的文章很多。...我们使用explain之后,会看到返回很多参数,其中: rows:显示MySQL认为它执行查询时必须检查的行数。就是这个东西了,既然我们要获取的是数据表的行数,那么可以使用: ?...这样我们就能通过这个数组获取到我们需求的rows。 ? 这里直接获取这个值即可。速度极快。原来查询速度是2.33s,换成只用explain之后,速度仅为0008s,提升十分巨大。

    3.4K20

    浅谈MySQL 统计行数的 count

    MySQL count() 函数我们并不陌生,用来统计每张表的行数。但如果你的表越来越大,且是 InnoDB 引擎的话,会发现计算的速度会越来越慢。...由于 MVCC 的控制,使得 MySQL 具有并发的能力,也就是说对于同一时刻,InnoDB 返回的表的行数是不一定的,事务看到的行数与开启后的一致性视图有关,换句话说,每个事务能看到的数据版本是不一样的...但如果我们真的需要实时的获取的某个表的行数,应该怎么办呢? 手动保存表的数量 用缓存系统来保存计数 对于进行更新的表,可能会想到用缓存系统来支持。比如 Redis 里来保存某个表总行数。...而且还有一点,由于 redo log 的支持,在 MySQL 发生异常时,是可以保证 crash-safe。...总结 MySQL count() 函数的执行效率和底层的数据引擎有关。MyISAM 不加 where 条件,查询会很快,但不支持事务。

    3K30

    MYSQL统计行数时到底应该怎么COUNT

    相信每个人在写代码时都有遇到过要获取MYSQL表里数据行数的情况,多数人获取数据表行数时都用COUNT(*),但同时也流传了不少其他方式,比如说COUNT(1)、COUNT(主键)、COUNT(字段)。...文章中都是针对MySQL的InnoDB引擎展开讨论的,MyISAM引擎是把一个表的总行数记录在了磁盘里,查询时效率很高(如果加了where条件也不能直接从磁盘返回)。...所以这个版本COUNT的从低到高分别为: COUNT(字段) < COUNT(主键) < COUNT(1) ≈ COUNT(*) 所以建议你尽量使用 count(*)来获取记录行数。...另外要注意,很多人为了销量会把表的行数记录到Redis中,但这样不能保证Redis里的计数和MySQL表里的数据保持精确一致,这是两个不同的存储系统不支持分布式事务所以就无法拿到精确的一致性视图,如果为了效率把表行数单独存储那么最好存放在一个单独的...MySQL表里,这样无法拿到一致性视图的问题就能解决了.

    1.4K20

    获取导入百分比,使用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都会记录一个总条数,但是这个总条数由于各种空行等原因,不一定正确),无法精确获取,要精确获取的自己在监听器里面一条条统计 监听器举例: // 有个很重要的点

    94210
    领券