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

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

引擎把一个表的总行数存在了磁盘上,因此执行count(*)的时候直接返回个数,效率很高 而innoDB引擎就麻烦了,他的执行count(*)的时候,是一行行的累加计数 当然我们要知道此事的说的是没有带条件的...,所以主键索引比普通索引的树大些,因此mysql优化器会拿到索引树小的,进行遍历计算,在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库优化的通用手段之一 此时你可能还依稀记得下面命令可以获取行的数量...比如有个页面要显示近期操作的100条记录和总操作数,这页面的逻辑就是到redis获取总数,再到数据库获取100条记录,如下两种会发生数据不一致的情况 查询到100结果里面有最新插入的数据,而redis...不管上面那种时序去查询数据,最终的结果都会不准确, 使用数据库保存计数 我们可以使用在数据库新建一张表C去记录操作的总行数,由于innodb支持崩溃恢复不丢失数据的,因此可以解决数据丢失的问题,是否能解决不准确的问题呢...由于事物可见性的特性,会话A没有提交的操作在会话B中是不可见的,查询计数值总数和查询最近100记录数据上是一致的。

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

    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.5K20

    OEA ORM中的分页支持

    (在 C/S 结构下使用这种方案,数据都已经到达客户端,所以在分页时不需要额外的数据查询,响应速度较快。) 缺点: * 不用于太大的数据分页。...优点: * 减少了首次的网络传输,对于客户端而言,调用的是分页的 API。 * 简单。 * 通用性强,与数据库无关,方案可以跨多种数据库。 * 统计总行数不需要发起二次查询。...缺点: * 占用内存,依然不能用于太大的数据分页。 数据层分页     这种方案一般使用 IDataReader 实现。...只把需要的数据读取到内存中。 * 简单。 * 通用性强,与数据库无关,方案可以跨多种数据库。 * 统计总行数不需要发起二次查询。 缺点: * 查询的 SQL 会查询很大的一张表。...但是,在分页时,往往要在界面中显示一个分页脚,用于显示当前页号、所有页数。所以在进行查询的同时,往往还需要对结果集中所有数据的总行数进行统计,并把之与查询出的实体列表数据一同返回。

    1.3K80

    分页 模糊查询「建议收藏」

    一、所有的web项目都会用到分页显示和模糊查询,对于有些人不知道该怎么写 二、今天我用springMVC 和 myBatis 写的分页和模糊分享给大家,不喜勿喷 三、数据库是mysql 四、其实写分页就是新建一个分页的类...,定义 页码 每页数量 共几页 当前页数 总数量 五、判断多少页,获取总数量除以每页显示的数量,有余数+1页 六、sql语句就是用 limit 显示的数量,把从多少条开始,到显示几条传到sql...; /** * 总行数 */ private int totalRows; /** * 总页数 */ private int totalPages; /** * 起始行号...总行数/每页行数:总行数/每页行数+1 this.totalPages = totalRows % pageRows == 0 ?...-- 查询总行数 --> select count(id) from user <

    45120

    MySQL索引(六)索引优化补充,分页查询、多表查询、统计查询

    回到小鱼刚刚提到的条件:根据 id 主键分页,同时主键自增且连续。对于其他条件还适用吗? 若主键不连续,得到的分页结果可能就不正确。...然后,定义了一个名为 insert_t1 的存储过程,该存储过程用于向 t 1 表中插入 1 万行记录。使用一个循环,从 1 到 10000,逐行插入数据,并将该数据的值作为 a 和 b 字段的值。...同样,定义了一个名为 insert_t2 的存储过程,用于向 t2 表中插入 100 行记录。使用一个循环,从 1 到 100,逐行插入数据,并将该数据的值作为 a 和 b 字段的值。...答案是二级索引相对于主键索引存储的数据较少,检索的效率更高。 优化 若使用myisam 存储引擎,每个表会维护一个总行数,查询总行数是不需要进行计算的。...若只需要估算总行数,可以使用 SHOW TABLE STATUS LIKE 'employees' 使用缓存维护总行数,再更新数据行时将数据表名作为key,总行数作为value 更新至redis,这种方式需要考虑数据的一致性

    18210

    【MySQL】count()查询性能梳理

    通常情况下,分页接口一般会查询两次数据库,第一次是获取具体数据,第二次是获取总的记录行数,然后把结果整合之后,再返回。...在MySQL中,count(*)的作用是统计表中记录的总行数。而count(*)的性能跟存储引擎有直接关系,并非所有的存储引擎,count(*)的性能都很差。...在MySQL中使用最多的存储引擎是:innodb和myisam。在myisam中会把总行数保存到磁盘上,使用count(*)时,只需要返回那个数据即可,无需额外的计算,所以执行效率很高。...count(*) :它会获取所有行的数据,不做任何处理,行数加1。count(1):它会获取所有行的数据,每行固定值1,也是行数加1。...count(未加索引列):它会全表扫描获取所有数据,解析中未加索引列,然后判断是否为NULL,如果不是NULL,则行数+1。

    39420

    高级查询(化繁为简、分页提升性能)

    PageIndex和PageSize指定页序号和每页大小,这是内部建立分页查询的核心依据; Sort 指定排序字段,Desc 指定是否降序(默认升序); RetrieveTotalCount 指定是否或者总记录数...,若为true,则在查询记录集之前,先查询满足条件的总行数TotalCount,用于分页PageCount。...如果 Meta.Count 评估认为本表总行数超过100万,且FindAll查询没带有条件,则page.TotalCount直接取Meta.Count(少量偏差),以避免极大的FindCount耗时。...Meta.Count 的初始值来自于数据库元数据索引表,里面有该表主键的总行数,取得该值后如果小于100万再异步select count一次。...group by name As,聚合别名 Count,计数 Sum,求和 Min,最小 Max,最大 查询的本质 查询的本质是五参数版FindAll(where, order, selects, start

    1.3K20

    JMeter接口测试实战-动态数据验证

    使用断言的目的: 在request的返回层面增加一层判断机制, 因为request成功了,并不代表结果一定正确。...我们上面还没有介绍的variable names Variables names参数使用方法:   Jmeter官网给出的解释是:如果给这个参数设置了值,它会保存sql语句返回的数据和返回数据的总行数。..._#=2 (总行数)   C_1=第3列, 第1行   C_2=第3列, 第2行 如果返回结果为0,那么A_#和C_#会被设置为0,其它变量不会设置值。...如果第一次返回6行数据,第二次只返回3行数据,那么第一次多的3行数据变量会被清除。 可以使用${A_#}、${A_1}...来获取相应的值....数组对象和内容都得到了,那怎么一个个传递给百度接口呢? 这里就要用到另外一个功能叫计数器, 他在配置元件->计数器可以找到.

    1.4K20

    MySQL战记:Count( *)实现之谜与计数策略的选择

    每一行记录都要判断自己是否对这个会话可见,因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。...在保证逻辑正确的前提下,尽量减少扫描的数据量,是数据库系统设计的通用法则之一。...所以,count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。...你可以用一个 Redis 服务来保存这个表的总行数。这个表每被插入一行 Redis 计数就加 1,每被删除一行 Redis 计数就减 1。...当然了,这还是有解的。比如,Redis 异常重启以后,到数据库里面单独执行一次 count(*) 获取真实的行数,再把这个值写回到 Redis 里就可以了。

    9610

    MySQL深入学习第十四篇-count(*)这么慢,我该怎么办?

    假设表 t 中现在有 10000 条记录,我们设计了三个用户并行的会话。 1. 会话 A 先启动事务并查询一次表的总行数; 2. 会话 B 启动事务,插入一行后记录后,查询表的总行数; 3....每一行记录都要判断自己是否对这个会话可见,因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。...用缓存系统保存计数 对于更新很频繁的库来说,你可能会第一时间想到,用缓存系统来支持。 你可以用一个 Redis 服务来保存这个表的总行数。...当然了,这还是有解的。比如,Redis 异常重启以后,到数据库里面单独执行一次 count(*) 获取真实的行数,再把这个值写回到 Redis 里就可以了。...所以,count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

    1.9K10

    MySQL实战第十四讲-count(*)这么慢,我该怎么办?

    假设表 t 中现在有 10000 条记录,我们设计了三个用户并行的会话。 1. 会话 A 先启动事务并查询一次表的总行数; 2. 会话 B 启动事务,插入一行后记录后,查询表的总行数; 3. ...每一行记录都要判断自己是否对这个会话可见,因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。...用缓存系统保存计数 对于更新很频繁的库来说,你可能会第一时间想到,用缓存系统来支持。 你可以用一个 Redis 服务来保存这个表的总行数。...当然了,这还是有解的。比如,Redis 异常重启以后,到数据库里面单独执行一次 count(*) 获取真实的行数,再把这个值写回到 Redis 里就可以了。...所以,count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

    1.7K10

    count(*)慢,该怎么办?

    会话 A 先启动事务并查询一次表的总行数;会话 B 启动事务,插入一行后记录后,查询表的总行数;会话 C 先启动一个单独的语句,插入一行记录后,查询表的总行数。...每一行记录都要判断自己是否对这个会话可见,因此对于 count(*) 请求来说,InnoDB 只好把数据一行一行地读出依次判断,可见的行才能够用于计算“基于这个查询”的表的总行数。...可以用一个 Redis 服务来保存这个表的总行数。这个表每被插入一行 Redis 计数就加 1,每被删除一行 Redis 计数就减 1。...当然了,这还是有解的。比如,Redis 异常重启以后,到数据库里面单独执行一次 count(*) 获取真实的行数,再把这个值写回到 Redis 里就可以了。...所以,count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数;而 count(字段),则表示返回满足条件的数据行里面,参数“字段”不为 NULL 的总个数。

    29900

    MySQL数据库原理学习(二十二)

    我们一起来看看执行limit分页查询耗时对比: 通过测试我们会看到,越往后,分页查询效率越低,这就是分页查询的问题所在。...因为,当在进行分页查询时,如果执行 limit 2000000,10 ,此时需要MySQL排序前2000010 记录,仅仅返回 2000000 - 2000010 的记录,其他记录丢弃,查询排序的代价非常大...MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个 数,效率很高;但是如果是带条件的count,MyISAM也慢。...InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出 来,然后累积计数。...如果说要大幅度提升InnoDB表的count效率,主要的优化思路:自己计数(可以借助于redis这样的数 据库进行,但是如果是带条件的count又比较麻烦了)。

    52620

    如何使用Selenium Python爬取多个分页的动态表格并进行数据整合和分析

    本文将介绍如何使用Selenium Python这一强大的自动化测试工具来爬取多个分页的动态表格,并进行数据整合和分析。...我们需要用Selenium Python提供的各种定位方法,如find_element_by_id、find_element_by_xpath等,来找到表格元素和分页元素,并获取它们的属性和文本。...数据整合和分析。我们需要用Pandas等库来对爬取到的数据进行整合和分析,并用Matplotlib等库来进行数据可视化和展示。...案例 为了具体说明如何使用Selenium Python爬取多个分页的动态表格并进行数据整合和分析,我们以一个实际的案例为例,爬取Selenium Easy网站上的一个表格示例,并对爬取到的数据进行简单的统计和绘图...代码实现 为了实现这个目标,我们需要用到以下几个库: selenium:用于控制浏览器驱动和模拟用户操作 requests:用于发送HTTP请求和获取响应 BeautifulSoup:用于解析HTML文档和提取数据

    1.7K40

    SQL统计函数的用法分析

    在SQL中,COUNT() 是一个聚合函数,用于计算行数。COUNT() 函数可以有不同的用法,具体取决于它的参数。...下面是 COUNT(*)、COUNT(1)、COUNT(id) 和 COUNT(name) 之间的主要区别和用法示例:1.COUNT(*):COUNT(*) 计算的是查询结果中的总行数,无论列是否包含...2.COUNT(1):COUNT(1) 同样计算的是查询结果中的总行数。它与 COUNT(*) 类似,但 COUNT(1) 明确地对每一行进行计数,包括 NULL 值。...3.COUNT(id):COUNT(id) 计算的是查询结果中 id 列非 NULL 的行数。如果 id 列中有 NULL 值,这些行将不会被 COUNT(id) 计数。...总结来说,COUNT(*) 和 COUNT(1) 通常用于计算总行数,而 COUNT(id) 和 COUNT(name) 用于计算特定列非 NULL 值的行数。

    25410

    大数据ClickHouse进阶(十五):ClickHouse的LIMIT BY和 LIMIT子句

    ​ClickHouse的LIMIT BY和 LIMIT子句一、LIMIT BY子句LIMIT BY 子句运行在Order by 之后和LIMIT 之前,能够按照指定分组,最多返回前n行数据,如果数据总行少于...n行,则按实际数量返回,常用于TOPN的查询场景,功能类似Hive中的开窗函数。...LIMIT BY 的常规语法如下:LIMIT n BY expressn指的是获取几条数据;express通常是一到多个字段,即按照express分组获取每个分组的前n条数据。...,具体语法如下:#按照express分组,获取跳过y行后的top n行数据。...n行数据,常用于分页场景,它的三种语法形式如下:#返回前n行数据LIMIT n#指定从第m行开始返回前n行数据LIMIT n OFFSET m#指定从第m行开始返回前n行数据简化写法LIMIT m,n-

    1.9K71

    MySQL---数据库从入门走向大神系列(十七)-JavaWeb分页技术实例演示2

    分页,是一种将所有数据分段展示给用户的技术.用户每次看到的不 是全部数据,而是其中的一部分,如果在其中没有找到自己想要的内容,用户可以通过指定页码或是点上/下一页的方式进行翻页。...本例演示静态分页,也就是先设置好每页显示10行,再根据总行数,来算出总页数,并且只显示10个页码。增加查询功能,并且查询后的页面也进行分页。页码也进行分页 !...查询功能的实现,需要我们在servlet向后台传输一个person,封装我们的查询条件 相关算法(技术): 总行数(num): select count(1) from stud; 每页显示的行数(n...0:1 ) 当前页号: currentPage 当前要显示的页面数据的起始行号和终止行号 startN: (currentPage-1)*pageSize 如何显示从startN开始的pageSize...0:1 ) // 总行数rows String sql = "select count(1) from person where 1=1 ";// 用来查总行数

    40610
    领券