sharding jdbc分库分表之后查询优化

  • 背景
  • 需求
  • 研发历程
    • 1、单线程(sharding jdbc 内置查询机制)
    • 2、多线程(sharding jdbc 内置查询机制)
    • 3、sql调整
  • 结论

背景

springboot项目,集成了shardingsphere,使用sharding jdbc进行分库分表。具体版本如下:
springboot:2.3.2.RELEASE

<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.1.1</version>
</dependency>

需求

统计人数,统计条件已实名、身份证前四位模糊查找

研发历程

1、单线程(sharding jdbc 内置查询机制)

思路: 根据身份证前四位,统计出不同区域(12个区划),然后依次获取每个区域的数量 查询sql如下:

`select count(1) as count_num  from user_0 t where t.papersnumber LIKE '6203%' and t.isReal = '1'`

结论:查询会触发索引,总耗时:277677ms。

2、多线程(sharding jdbc 内置查询机制)

思路:根据身份证前四位,统计出不同区域,开启多线程执行查询,查询sql与上面一样,多线程代码如下:

public Map<String, Integer> natualUserCityCount() throws Exception {// 根据存放量 指定map大小  避免扩容  【此处为多线程,故map为线程安全的ConcurrentHashMap】Map<String, Integer> result = new ConcurrentHashMap<>(CountConstants.MAP_SIZE);// 不同地市 对应区划 常量类Map<String, String> allCityType = CountConstants.getAllCityType();// 线程数量 计算 因为区划值为空 无需查询数据库 故过滤值为空的数量int count = Math.toIntExact(allCityType.values().stream().filter(areaVal -> StringUtils.isNotBlank(areaVal)).count());log.info("需等待进程数:" + count);// 创建线程池ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(15, 30, 10, TimeUnit.MICROSECONDS, new SynchronousQueue<>());//  因需要接收返回值 故此处需根据线程数 计算线程是否全部执行完毕CountDownLatch countDownLatch = new CountDownLatch(count);// 循环获取常量类中的区域值   一个区域开启一个线程allCityType.forEach((flag, area)->{if(StringUtils.isNotBlank(area)){threadPoolExecutor.submit(() -> {log.info("{}执行开始|{}:{}", Thread.currentThread().getName(), flag, area);// 调用mybatis-plus 自定义的selectCount接口  getCityCountQuer 查询sql拼接方法Integer num = userMapper.selectCount(getCityCountQuery(area));result.put(flag, num);log.info("{}执行完毕|{}:{}:{}", Thread.currentThread().getName(), flag, area, num);// 业务执行完毕 必须手动标记改线程结束 此处对应上面CountDownLatch ,若次数不手动操作,则主线程一直为等待状态 认为线程没有全部执行完毕countDownLatch.countDown();log.info("{}执行完毕|{}", Thread.currentThread().getName(), JSONObject.toJSON(result));});}result.put(flag, 0);});// 线程池关闭threadPoolExecutor.shutdown();// 等待所有线程执行完毕countDownLatch.await();log.info("所有线程执行完毕");return result;}

结论:查询耗时65512ms,时间值缩短的,但该值仍不是合理的。

3、sql调整

思路:数据库数量上千万,所以从sql方面进行优化。

# 构造身份证的虚拟列  并创建联合索引
alter table user_0 add v_papernumber VARCHAR(4) generated always as (left(papersnumber, 4)), add index v_papernum_isreal(v_papernumber,isReal)
// sql语句
SELECT COUNT( 1 ) FROM user_0  WHERE ((v_papernumber = ? OR v_papernumber = ?) AND isReal = ?)

结论:该sql模式下单线程耗时4576ms,多线程耗时3796ms 。

结论

使用mysql的虚拟列、复合索引、多线程【此处可用单线程】

【一直觉得是sharding jdbc分库分表之后 内置的全量查询功能不好,原来并不是】

sharding-jdbc4.1.1 分库分表后 mysql查询优化(count)相关推荐

  1. mysql分表后怎么索引_分库分表后的索引问题

    摘要 最近遇到一个慢sql,在排查过程中发现和分库分表后的索引设置有关系,总结了下问题. 问题 在进行应用健康度盘点时,发现有个慢sql 如下 select brandgoodid from bran ...

  2. mysql pdo 插入没效果_MySQL分库分表后用PHP如何来完美操作

    当单表达到几千万时,查询一次要很久,如果有联合查询,有可能会死在那 分库分表主要就是解决这个问题,减小数据库的负担,缩短查询时间分库 1)按功能分 用户类库.商品类库.订单类库.日志类.统计类库... ...

  3. 数据库分库分表后,如何部署上线?

    1. 引言 我们先来讲一个段子 面试官:"有并发的经验没?" 应聘者:"有一点." 面试官:"那你们为了处理并发,做了哪些优化?" 应聘者: ...

  4. php 分库分表例子,mysql分库分表实战及php代码操作完整实例

    当单表达到几千万时,查询一次要很久,如果有联合查询,有可能会死在那 分库分表主要就是解决这个问题,减小数据库的负担,缩短查询时间 分库: 1)按功能分 用户类库.商品类库.订单类库.日志类.统计类库. ...

  5. mysql 分库分表 后怎么操作,MySQL要分表分库怎么进行数据切分?

    导读:关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数.处理能力都有限.当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库.优化索引,做很多操作时性能仍下降严重.此时 ...

  6. 为什么分库分表后不建议跨分片查询

    来源:阿飞的博客 写在前面:如果对分库分表还不是很熟悉的,可以参考笔者之前的文章<分库分表技术演进&最佳实践>. 在这篇文章中提到了一个场景,即电商的订单.我们都知道订单表有三大主 ...

  7. 深入理解分布式技术 - 分库分表后的扩容解决方案

    文章目录 概述 路由规则与扩容方案 对主键进行哈希取模 优点 缺点 基于数据范围进行拆分 结合数据范围和哈希取模 小结 概述 在实际开发中,数据库的扩容和不同的分库分表规则直接相关,今天我们从系统设计 ...

  8. mysql为什么表大了要重建_为什么MySQL分库分表后总存储大小变大了?

    [MySQL系列相关] 1.聊一聊关于MySQL的count(*) 1.背景 在完成一个分表项目后,发现分表的数据迁移后,新库所需的存储容量远大于原本两张表的大小.在做了一番查询了解后,完成了优化. ...

  9. mysql sharding 知乎_分库分表系列(1)-shardingsphere核心概念

    欢迎关注公众号: 戏说码农职场 咱们不闲扯, 就直接入正题, 这次总结说下sharding-jdbc 分库分表的工具.整体架构 Apache ShardingSphere 是一套开源的分布式数据库中间 ...

最新文章

  1. 针对还没搞懂javascript中this关键字的同学
  2. 诊断案例:从实例挂起到归档失败和内存管理的蝴蝶效应
  3. java 多模块项目 包路径冲突_多智能体仿真建模在交通中的应用|MATSim入门指南...
  4. python输入城市名称_python 查询天气(输入城市名,输出天气)
  5. Java语言的特点和特性
  6. 一步一步SharePoint 2007之二十八:实现WebPart的单步调试
  7. html烟火源码,HTML5:烟火
  8. Android文本输入框EditText方法说明和属性
  9. 3d slicer调整窗宽窗位_3D游戏模型制作技巧,掌握这些技术你也能进鹅厂!
  10. github 安装浏览器导航插件Octotree
  11. Scrapy网络爬虫系统
  12. 【软考 系统架构设计师】软件架构设计⑦ 构件与中间件技术
  13. 合成分红游戏源码_ThinkPHP宠物养成合成类游戏APP陀螺世界程序源码 已优化
  14. 五一假期游泰国:曼谷景点游玩省钱攻略
  15. web端接收读卡器卡片信息
  16. 恒辉信达全数据AI管控云平台动态运维管控
  17. 分享一个全站繁体转换
  18. 秋日露营好去处,安化云台山星空露营公园
  19. An Invitation to Algebraic Geometry
  20. 读俞敏洪老师自传有感

热门文章

  1. 【资讯】天啦鲁,这十余款创客设计居然由FPGA搞定 [转]
  2. matlab:神经网络分类预测鸢尾花(iris)
  3. DNN(全连接神经网络)
  4. 腾讯云安装docker
  5. 基于知识图谱的推荐系统(一):综述
  6. 全球与中国单晶硅外延片市场深度研究分析报告
  7. Android 4主线程访问网络
  8. Hype Cycle (技术成熟度曲线)
  9. 液压缸压力闭环控制器
  10. PyTorch随笔 - Sequential 和 ModuleList 的简要介绍