总结曾经项目中,460W的表中使用到的索引

本文探讨了一个包含460万条政府人员数据的表格,重点关注了如何通过建立索引提高查询效率,特别是在查询人员序号范围时,4秒和12秒的对比,以及关键字段的索引策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表介绍:这是一份政府系统的人员表,总计460W人员信息。

在这里插入图片描述
Name Code Data type Pk m Note
待审核主键 Dsh_ID VARCHAR2(32) * * 待审核主键
公务员主键(人员主键) Ry_ID VARCHAR2(32) 公务员主键
人员所属单位类别 Dwlx VARCHAR2(2) * 系统生成,人员所属的单位类型(单位类别),参见“s01 单位类型(添加机构类型)”字典项
机构编码 JGSY_CODE VARCHAR2(100) * 系统生成,人员所属机构的jgsy_code编码
特别说明:行政机构内设机构、事业单位内设机构、下设机构内设机构、街道乡镇内设机构这四类机构(包括这四类机构的内设机构)里面的人员需要填写他们的上级机构(行政、事业、下设、街道乡镇)的编码,例如:张三、河南省党委|信访局|接待一处(行政内设机构)则张三的jgsy_code为河南省信访局的jgsy_code,事业内设、下设内设、街道乡镇内设同理
区划代码 Geocode CHAR(6) * 系统添加,人员所在机构所属的区划代码,参见geocode表
人员所在单位编码 SZJG VARCHAR2(100) * 系统添加,人员所在机构的编码
人员在本单位序号 Xh NUMBER(10) 排序号
姓名 Xm VARCHAR2(50) * 必填项,用户填写
性别 Xb VARCHAR2(10) * 必选项,用户选择,参见“R01 人员性别”字典项
出生日期 Csrq Date * 必填项,填写身份证号码后自动生成,可修改
特别说明:鉴于历史原因,这里的出生日期特指人员人事档案里填写的出生日期,可能与身份证号对应的出生日期不一致,属正常情况
民族 Mz VARCHAR2(10) * 必选项,用户选择,参见“R02 人员民族”字典项
参加工作时间 Cjgzsj Date 用户填写,人员首次参加工作的日期
人员分类 RYFL VARCHAR2(10) * 必选项,用户选择,参见“r05 人员分类”字典项
职务级别 Zwjb VARCHAR2(10) 用户选择,参见“R07 人员领导职务级别”字典项
非领导职务级别 Zwjb2 VARCHAR2(10) 用户选择,参见“R08 非领导职务级别”字典项
身份证号 Sfzh CHAR(18) * 必填项,用户填写,按照要求15位或18位
领导职位标志 Ldzwbz VARCHAR2(8) 暂未使用
职务 Zw VARCHAR2(100) 可选择或填写,选择职务参照“r22 领导职务名称”字典项
政治面貌 Dp VARCHAR2(10) * 必选项,用户选择,参见“r03 政治面貌”字典项
学历 Whcd VARCHAR2(10) 用户填写,参见“r09 人员学历”字典项
学位 Xw VARCHAR2(10) 用户填写,参见“r10 人员学位”字典项
职称 Zyjszg VARCHAR2(10) 用户选择,参见“ZC表”
编制类型 Bzlx VARCHAR2(10) * 必选项,用户选择,参见“r04 行政机构人员编制类型”字典项
编制经费形式 BZJFXS VARCHAR2(10) * 必选项,用户选择,参见“r12 事业单位人员编制经费形式”字典项
进入时间 Jrsj Date * 必填项,用户填写,人员进入本单位的时间
聘任专业技术职务 Przyjszw VARCHAR2(10) 暂未使用
是否高配 Isgp VARCHAR2(2) 用户选择,1为高配,默认为空
进入对象或渠道 Jrdxhqd VARCHAR2(10) * 必选项,用户选择,参见“dict_jrxs表”
进入来源 ZJLY VARCHAR2(50) 用户填写
核减原因 Hjyy VARCHAR2(10) 暂未使用
核减时间 Hjsj Date 暂未使用
核减文号 HJWH VARCHAR2(100) 暂未使用
入编时间 Rubiandjsj DATE * 必选项,用户选择,人员进入本单位编制的时间
入编文号 RBWH VARCHAR2(100) 用户填写,即人员“入减编审核通知单”文号
所学专业 Sxzy VARCHAR2(200) 用户填写
在编状态(人员状态) Zbzt VARCHAR2(10) * 必选项,用户选择,参见“r06 人员状态”字典项
专业技术职称 Zyjszhch VARCHAR2(10) 暂未使用
岗位类别 Gwlb VARCHAR2(10) 必选项,用户选择,事业单位人员专属字段,参见“R13 事业单位人员岗位分类”字典项
毕业学校 Byxx VARCHAR2(200) 用户填写
毕业时间 Bysj Date 用户选择
入党团时间 Rdsj Date 用户选择
公务员登记是否登记 ISGWY VARCHAR2(2) 用户选择,1-登记,0-不登记,默认为0
任现职时间 RENXIANZHISJ DATE 用户选择
籍贯 JIGUAN VARCHAR2(200) 用户填写
控编单编号 KDBH VARCHAR2(100) 暂未使用
人员状态 States VARCHAR2(2) * 系统自动生成,1-正常,2-删除,3-作废
备注 Bz VARCHAR2(4000) 用户填写
更新日期 Update_time Date 暂未使用
更新部门 Update_unit VARCHAR2(100) 暂未使用
减少时间 Jssj Date * 减员时必选项,用户选择
减少去向 Jsqx VARCHAR2(50) 用户填写
减少原因 Jsyy VARCHAR2(10) * 减员人员必选项,用户选择,参见“r14 人员减员原因(减少原因)”
出编文号 Cbwh VARCHAR2(100) 用户填写,人员出编时填写
是否核减(减员) Ishj Integer * 必选项,用户选择,1-为不核减 2-为核减 默认为1
人员所在乡镇内设机构系统类别 Ry_Xzxtlb VARCHAR2(10) 暂停使用,已有值,参见“s10 街道乡镇内设机构系统类别”字典项
曾用名 Ry_oldnames VARCHAR2(500) 用户填写
附件ID Ysbh_pks VARCHAR2(128) 暂未使用
附件名字 File_names VARCHAR2(1000) 暂未使用
进人依据1 Ryjr_yiju1 Integer 暂未使用
进人依据2 Ryjr_yiju2 Integer 暂未使用
进人依据3 Ryjr_yiju3 VARCHAR2(200) 暂未使用
备用字段1 STANDBY1 VARCHAR2(100) 暂未使用
备用字段2 STANDBY2 VARCHAR2(100) 暂未使用
备用字段3 STANDBY3 VARCHAR2(100) 暂未使用
备用字段4 STANDBY4 VARCHAR2(100) 暂未使用
备用字段5 STANDBY5 VARCHAR2(100) 暂未使用
状态变更 AUDITING_ZTBG INTEGER 暂未使用
上报人员 AUDITING_SBRY VARCHAR2(15) 暂未使用
上报时间 AUDITING_SBSJ DATE 暂未使用
审核人员 AUDITING_SHRY VARCHAR2(15) 暂未使用
审核时间 AUDITING_SJSJ DATE 暂未使用
变更内容 GONGWY_XGLB VARCHAR2(4000) 暂未使用
是否审结 AUDITING_SJ INTEGER 暂未使用
是否单列管理行政编制 ISDLGLXZBZ VARCHAR2(2) 用户选择,1-是,空-否,默认为空
是否单列管理军转编制 ISDLGLJZBZ VARCHAR2(2) 用户选择,1-是,空-否,默认为空
个人拼音码 Grpym VARCHAR2(50) 用户填写
个人英文名称 Grywmc VARCHAR2(50) 用户填写
入减编通知单 Rjbtzd VARCHAR2(200) 暂未使用
电子编制证号 Dzbzzh VARCHAR2(50) 用户填写
职称级别 Zcjb VARCHAR2(10) 用户选择,参见“r15 事业单位人员职称级别”字典项
领导兼职职务名称 Ldjzzwmc VARCHAR2(50) 用户填写
技工类别 Jglb VARCHAR2(10) 用户选择,参见“r16 事业单位人员技工类别”字典项
技工等级 Jgdj VARCHAR2(10) 用户选择,参见“r17 事业单位人员技工等级”字典项
身份类别 Sflb VARCHAR2(10) 用户选择,参见“r20 事业单位人员身份类别”字典项
入编标志 Rbbz INTEGER 用户选择
减员标志 Jybz INTEGER 用户选择
聘用时间 Pysj DATE 用户选择
工龄 Gl VARCHAR2(5) 用户填写
基本工资 Jbgz VARCHAR2(10) 用户填写
基本离休费 Jblxf VARCHAR2(10) 用户填写
基本退休费 Jbtxf VARCHAR2(10) 用户填写
基本退职费 Jbtzf VARCHAR2(10) 用户填写
国家规定津补贴 Gjgdjbt VARCHAR2(10) 用户填写
地方出台津补贴 Dfctjbt VARCHAR2(10) 用户填写
实际执行工资 Sjzxgz VARCHAR2(10) 用户填写
工资来源 Gzly VARCHAR2(10) * 必选项,用户选择,参见“r18 人员工资来源”字典项
政法机构人员分类 Zfjgryfl VARCHAR2(10) 用户选择,参见“r19 政法机构人员分类”字典项
个人照片 Grzp VARCHAR2(200) 暂未使用
个人身份证扫描件 Grsfzsmj VARCHAR2(200) 暂未使用
入编审核依据 Rbshyj VARCHAR2(200) 暂未使用
身份信息相关手续 Sfxxxgsx VARCHAR2(200) 暂未使用
划转目标JGSY_CODE HZ_JGSY_CODE VARCHAR2(10) 暂未使用
调任单位名称 DRDW VARCHAR2(200) 暂未使用
调任单位jgsy_code DRDW_JGSYCODE VARCHAR2(10) 暂未使用
是否占用人才编制 SFZYRCBZ NUMBER(0) 用户选择,1-是 空-否,默认为空
是否财政统发工资 SFCZTFGZ NUMBER(0) 停止使用
GRFSZSMJ VARCHAR2(200) 未知含义,暂不使用
AUDITING_JJYY VARCHAR2 未知含义,暂不使用
EDITION 含义未知,暂不使用
入库时间 rksj VARCHAR2(20) * 人员正式入人员库的时间
军转干编制台帐 JZGBZWH VARCHAR2(100) 暂未使用
是否军转占用职数 JZSFZYZS VARCHAR2(2) 军转人员是否占用职数-0是不占用 1-占用

这是一个常用的查询功能,查询所有机构中,人员序号在某个范围的人员信息。

使用索引的情况:4s左右

在这里插入图片描述

分析执行情况,rang类型,使用到的索引IDX_T_RY_JBXX_XH

在这里插入图片描述

无索引的情况:12s左右

在这里插入图片描述

该表所建立的索引

在这里插入图片描述

当然还有其他更复杂的情况,最近比较忙,后面再接着写。

<think>嗯,用户问为什么在实际的Spring Boot项目中,大家比较少用Hibernate,而更多选择MyBatis。首先,我得回想一下这两个框架的特点和适用场景。Hibernate是一个全自动的ORM框架,而MyBatis是半自动的持久层框架,主要使用SQL映射。 可能的原因有几个方面。首先是灵活性,MyBatis允许开发者直接编写SQL,这对于复杂的查询或者需要优化性能的场景非常有用。而Hibernate自动生成的SQL有时候不够高效,尤其是在处理复杂查询时,可能需要花费额外的时间去调优。 然后是学习曲线的问题。Hibernate有自己的HQL和Criteria API,对于新手来说可能需要时间适应,而MyBatis直接使用SQL,对于熟悉SQL的开发者来说更容易上手。特别是在国内,很多团队更倾向于直接控制SQL,这样能更清楚地了解数据库操作细节,方便优化。 还有项目需求的因素。如果项目中有很多复杂的查询、存储过程或者需要高度优化的SQL,MyBatis会更合适。Hibernate更适合领域模型驱动设计的项目,比如快速开发CRUD应用,但国内很多项目可能更偏向复杂业务逻辑,需要灵活控制SQL。 另外,国内的技术生态也可能有影响。MyBatis在国内社区更活跃,文档和解决方案更多,而Hibernate可能在国外更流行。而且,MyBatis的插件生态,比如PageHelper分页插件,使用起来非常方便,这也是它受欢迎的原因之一。 还有团队习惯的因素。如果团队已经习惯了MyBatis,那么继续沿用可以减少学习成本和开发时间。而Hibernate可能需要更多的培训和适应期。 不过,也不能一概而论,有些项目还是会用Hibernate,特别是需要快速开发或者领域模型复杂的情况。比如Spring Data JPA就是基于Hibernate的,有些项目可能会用它来加速开发。 总结起来,主要原因是MyBatis在灵活控制SQL、处理复杂查询、学习成本和国内生态支持方面有优势,而Hibernate在快速开发和对象关系映射方面更强大,但可能在复杂查询和性能优化上不够灵活。</think>在实际Spring Boot项目中,$\text{Hibernate}$和$\text{MyBatis}$的选择主要基于技术特性、开发习惯和业务需求。以下是分点说明: --- ### 一、核心差异对比 $$ \begin{aligned} &\text{Hibernate (ORM框架)} && \text{MyBatis (SQL映射框架)} \\ &\text{全自动SQL生成} && \text{手动编写SQL} \\ &\text{对象-关系强映射} && \text{灵活控制SQL细节} \\ &\text{JPA规范实现} && \text{非JPA规范} \end{aligned} $$ --- ### 二、为何更倾向MyBatis? #### 1. **SQL控制灵活性** - $\text{MyBatis}$允许直接编写/优化SQL,适合: - 复杂联查询(如多层嵌套$\text{JOIN}$) - 高性能场景(如分页$\text{LIMIT/OFFSET}$调优) - 数据库特性语法(如Oracle的$\text{CONNECT BY}$) - $\text{Hibernate}$的HQL或Criteria API在复杂场景下可能生成低效SQL,需通过$\text{@Query}$覆盖或调试$\text{show\_sql}$。 #### 2. **学习与维护成本** - $\text{MyBatis}$仅需熟悉SQL和XML/注解映射,适合国内开发者习惯。 - $\text{Hibernate}$需掌握Session缓存、延迟加载、级联关系等概念,调试复杂问题时门槛较高。 #### 3. **遗留系统适配** - 国内许多项目基于老旧数据库设计(如存储过程、特殊索引),$\text{MyBatis}$能更直接适配,而$\text{Hibernate}$可能需绕道$\text{@NamedNativeQuery}$。 #### 4. **动态SQL支持** - $\text{MyBatis}$提供$\text{<if>}$, $\text{<foreach>}$等标签,便于组装动态条件: ```xml <select id="findUsers"> SELECT * FROM users WHERE 1=1 <if test="name != null"> AND name = #{name} </if> </select> ``` - $\text{Hibernate}$需依赖$\text{CriteriaBuilder}$或第三方库(如QueryDSL)实现类似功能。 --- ### 三、Hibernate的适用场景 虽然使用率较低,但$\text{Hibernate}$在以下场景仍有优势: 1. **快速CRUD开发**:通过$\text{Spring Data JPA}$(基于Hibernate)实现$\text{Repository}$接口自动化。 2. **领域驱动设计(DDD)**:强对象映射适合复杂领域模型。 3. **跨数据库兼容**:HQL语法可自动适配不同数据库方言。 --- ### 四、实际项目中的折中方案 1. **混合使用**:用$\text{Spring Data JPA}$处理简单CRUD,$\text{MyBatis}$处理复杂查询。 2. **工具增强**:结合$\text{MyBatis-Plus}$提供类似JPA的便捷接口,同时保留SQL灵活性。 --- ### 五、总结 选择依据可归纳为: $$ \text{选择} = \max\left( \frac{\text{SQL控制需求}}{\text{开发效率}}, \frac{\text{团队经验}}{\text{学习成本}} \right) $$ 国内项目更倾向$\text{MyBatis}$的本质原因:**在数据库性能敏感和复杂业务场景下,直接控制SQL比ORM抽象带来的收益更显著**。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值