Mybatis-PageHelper自定义count查询

2023-05-16

1、问题描述

使用分页插件pagehelper实现分页功能,有个接口查询速度慢。

2、问题原因

排查问题发现是因为在分页时,查询总条数的sql执行慢,而查询总条数的sql是在分页插件执行时,在主sql外层嵌套一层得到:SELECT COUNT(*) FROM (主sql) table_count;

主SQL

SELECT
	a.id,
	ent_name,
	a.ent_org_code,
	ent_org_file,
	ent_org_file_name,
	a.ent_unit_class,
	ent_unit_type,
	ent_establish_date,
	ent_address,
	ent_provence,
	ent_city,
	ent_county,
	ent_regist_capital,
	ent_busi_license_num,
	ent_busi_license_file,
	ent_busi_license_file_name,
	ent_economic_type,
	ent_account_bank,
	ent_legal_rep,
	ent_res_person,
	ent_tech_director,
	ent_charge_departm,
	ent_approval_departm,
	ent_contact_man,
	ent_contact_tel,
	ent_remark,
	ent_in_out,
	ent_construction_type,
	website,
	email,
	ent_belong_to,
	'' AS ent_brief_introduction,
	'' AS pic1,
	'' AS pic_name1,
	'' AS pic2,
	'' AS pic_name2,
	a.audit_flag,
	a.history_flag,
	disable_flag,
	warning_flag,
	loginflag,
	is_local_ent,
	is_city_in,
	'' AS pic3,
	'' AS pic_name3,
	'' AS pic4,
	'' AS pic_name4,
	'' AS pic5,
	'' AS pic_name5,
	'' AS pic6,
	'' AS pic_name6,
	'' AS pic7,
	'' AS pic_name7,
	'' AS pic8,
	'' AS pic_name8,
	'' AS pic9,
	'' AS pic_name9,
	postal_code,
	id_card_type_num,
	legal_man_idcard,
	legal_man_duty,
	legal_man_pro_title,
	fact_reg_prin,
	principal_unit_num,
	office_phone,
	fax,
	is_proxy_enterprise,
	is_new_supervisor,
	is_cost_enterprise,
	0 AS hasBlackList
FROM
	ent_basic_info a
INNER JOIN ent_qualifi_info q ON a.ent_org_code = q.ent_org_code
WHERE
	a.audit_flag = 1
AND a.history_flag = 0
GROUP BY
	a.ent_org_code

分页插件查询总条数时拼接的SQL

SELECT
	count(0)
FROM
	(
		SELECT
			a.id,
			ent_name,
			a.ent_org_code,
			ent_org_file,
			ent_org_file_name,
			a.ent_unit_class,
			ent_unit_type,
			ent_establish_date,
			ent_address,
			ent_provence,
			ent_city,
			ent_county,
			ent_regist_capital,
			ent_busi_license_num,
			ent_busi_license_file,
			ent_busi_license_file_name,
			ent_economic_type,
			ent_account_bank,
			ent_legal_rep,
			ent_res_person,
			ent_tech_director,
			ent_charge_departm,
			ent_approval_departm,
			ent_contact_man,
			ent_contact_tel,
			ent_remark,
			ent_in_out,
			ent_construction_type,
			website,
			email,
			ent_belong_to,
			'' AS ent_brief_introduction,
			'' AS pic1,
			'' AS pic_name1,
			'' AS pic2,
			'' AS pic_name2,
			a.audit_flag,
			a.history_flag,
			disable_flag,
			warning_flag,
			loginflag,
			is_local_ent,
			is_city_in,
			'' AS pic3,
			'' AS pic_name3,
			'' AS pic4,
			'' AS pic_name4,
			'' AS pic5,
			'' AS pic_name5,
			'' AS pic6,
			'' AS pic_name6,
			'' AS pic7,
			'' AS pic_name7,
			'' AS pic8,
			'' AS pic_name8,
			'' AS pic9,
			'' AS pic_name9,
			postal_code,
			id_card_type_num,
			legal_man_idcard,
			legal_man_duty,
			legal_man_pro_title,
			fact_reg_prin,
			principal_unit_num,
			office_phone,
			fax,
			is_proxy_enterprise,
			is_new_supervisor,
			is_cost_enterprise,
			0 AS hasBlackList
		FROM
			ent_basic_info a
		INNER JOIN ent_qualifi_info q ON a.ent_org_code = q.ent_org_code
		WHERE
			a.audit_flag = 1
		AND a.history_flag = 0
		GROUP BY
			a.ent_org_code
	) table_count;

可以看出拼接之后的sql最终查询结果是count,但由于主SQL查询慢,导致整个count的查询慢,在主SQL中select的列值对于整个count查询来说没有关系,但却影响了count查询的速度,所以可以通过优化主SQL中的select列来优化count查询的sql。
但是,这个count查询的sql是由插件为我们拼接成的,我们只负责编写主SQL语句,想要优化count的sql中的select列值要相应的修改我们的主SQL,但这不符合我们相要的结果,因为我们的主sql中的select列值都是最终结果需要的。

3、解决方案

pagehelper的2017-08-01版本更新新增了自定义的count查询,用户可以自定义count查询语句,来替换插件为我们拼接的count查询语句。
参考:PageHelper增加手写 count 查询支持
最终使用自定义的count查询SQL:

SELECT
	count(0)
FROM
	(
		SELECT
			0
		FROM
			ent_basic_info a
		INNER JOIN ent_qualifi_info q ON a.ent_org_code = q.ent_org_code
		WHERE
			a.audit_flag = 1
		AND a.history_flag = 0
		GROUP BY
			a.ent_org_code
	) table_count;

结果:原先由插件拼接的count查询sql时间为1.4s左右,使用自定义的count查询sql时间在0.4s左右。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mybatis-PageHelper自定义count查询 的相关文章

  • list.count() 与 Counter() 性能

    在尝试查找字符串中一堆字符的频率时 为什么对 4 个不同的字符运行 string count character 4 次会比使用 collections Counter string 产生更快的执行时间 使用 time time 背景 给定
  • 如何计算具有两个变量的表中的行数

    我有一个名为 dF 的数据框 有两列 名称 区域 例如 Name Region a EU a EU b AM C AP 如果我执行 table dF 它将显示一个包含两个变量的表 比如像这样 table int 1 325 1 3 Regi
  • Oracle SQl Dev,如何计算2个日期之间的工作日数

    有谁知道如何计算两个日期字段之间的工作日数 我正在使用 oracle sql 开发人员 我需要找到多个开始日期和结束日期之间工作日的平均值 因此 我需要获取每条记录的天数 以便对它们进行平均 这是可以作为一行完成的事情吗 SELECT我的查
  • MyBatis 与 Guava 多重映射

    我想用番石榴多重地图 https google github io guava releases snapshot api docs com google common collect Multimap html as a 结果图 http
  • 从所有 WooCommerce 预订中获取所有人的总和

    我使用官方 woocommerce 预订插件 并尝试获取所有已预订产品的人员的数量 对于单个订单 没有问题 if is callable WC booking Data Store get booking ids from order id
  • 使用 myBatis 从数据库中以 byte[] 的形式获取 blob

    我在一个项目中使用 spring MyBatis 1 2 0 其中有一个查询从 Oracle 11g 数据库中的 BLOB 字段获取数据 我想以字节数组 byte 的形式检索该字段 我的代码是
  • MyBatis:使用动态查询比较字符串值

    我正在使用 MyBatis 来映射一些需要比较的查询String争论 myString 我的地图绘制者界面 is public Map
  • MySQL 中多列的不同

    我希望找出 MySQL 数据库中不同行的计数 id val1 val2 val3 1 1 1 1 2 1 1 1 3 2 2 2 4 2 2 2 在上表中 查询将返回 val1 val2 val3 count 1 1 1 2 2 2 2 2
  • Postgis - 如何通过 JDBC 使用数据类型“地理”

    从事一个网络项目 该项目使用postgresql 9 3 postgis 2 1 有一个类型的列geography在表中 它只存储一个point 现在我需要通过 JDBC 使用 Java 对象插入 选择类型 看完之后postgis手册 没有
  • 来自连接表的 SQL 计数

    我有一个表 lijsten 一个表 werknemerlijsten 和一个表 categorieen 现在我正在使用查询来获取计数 SELECT id naam beschrijving count wl werknemer id as
  • 计数累计和

    我想知道是否可以对计数进行累积和 我想举的一个例子是今年影响美国的风暴 我想要一个列出 2014 年月份的结果集 以及该月之前影响美国的风暴累计总数 我希望得到 3 列的内容 Month NumberofStorms 和 Cumulativ
  • 在 while 循环中使用枚举函数

    我有几种使用迭代来搜索正确答案的数学算法 这是一个例子 def Bolzano fonction a b tol 0 000001 while abs b a gt tol m a b 2 if sign fonction m sign f
  • Python:计算一个单词在文件中出现的次数

    我有一个文件 其中包含城市名称 然后文件中每行包含州名称 我应该计算状态名称出现的次数并返回值 例如 如果我的文件包含 Los Angeles California San Diego California San Francisco Ca
  • 在SPARQL中使用LIMIT时如何获取结果总数?

    我有一个 SPARQL 查询 它返回结果LIMIT共 20 个 在此查询中 我还想知道结果总数 而无需运行查询两次 一次运行LIMIT和一个没有LIMIT 例如 运行查询时 可能的结果总数为 500 个 其中LIMIT它一次只显示 20 个
  • 如何使用 LINQ 计算与条件匹配的元素数量

    我尝试了很多事情 但对我来说最合乎逻辑的似乎是这个 int divisor AllMyControls Take p gt p IsActiveUserControlChecked Count AllMyControls是一个集合UserC
  • 计算div内的div

    我已经尝试过此页面上的解决方案来计算父 类 div 内的div 但不幸的是我的结果总是显示现有子 div 的总数 因为示例中的两个 span 标签都将输出 7 为了更好地理解 这是代码 html 缺少什么 我绝对是新手 谢谢
  • 计算以某个单词开头的行数

    如何计算文本文件中以某个单词开头的行数 我不想使用sed进而wc l 有更好的解决办法吗 只需 grep 你的单词 然后使用 wc l 来计算行数 就像这样 grep your word path to file wc l
  • C 中的字符计数

    我正在尝试编写一个程序来计算字符串中的所有字符 我本来有它 但后来意识到我无法计算空格 我不明白为什么这不起作用 for m 0 z m 0 m if z m charcount 任何帮助表示赞赏 编辑 如果像这样扫描输入 字符串 会有什么
  • 计算 List 中相似的相邻项目数

    我试图在列表中找到相似的相邻项目并计算其数量 例如 List
  • 如何从数据框中删除少于 5 个观察值的个体 [重复]

    这个问题在这里已经有答案了 为了澄清这个问题 我将简要描述数据 中的每一行data frame是一个观察值 列代表与该观察值相关的变量 包括 观察到什么个体 观察时间 观察地点等 我想排除 过滤观察值少于 5 个的个体 换句话说 如果 in

随机推荐