京东技术:MySQL性能优化浅析及线上案例讲解
点击“终码一生”,关注,置顶公众号
耗时8个月联合打造 《 2023年Java高薪课程 》,已更新了 102G 视频,累计更新时长 500+ 个小时,需要的小伙伴可以了解下,一次购买,持续更新,无需2次付费。
导读
本文重点介绍了MySQL数据库性能优化的常见手段、底层架构实现原理、互联网医院建设过程中的几个典型案例;读者可以通过本文了解到日常开发中的注意事项、数据库性能优化的解决思路、如何规避隐藏规则带来的风险等几个方面的知识。
本文重点介绍了MySQL数据库性能优化的常见手段、底层架构实现原理、互联网医院建设过程中的几个典型案例;读者可以通过本文了解到日常开发中的注意事项、数据库性能优化的解决思路、如何规避隐藏规则带来的风险等几个方面的知识。
01 数据库性能优化的原因和措施
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
业务发展初期,数据库量级一般都不高,也不太容易出一些性能问题或者出现的问题也不大,但是当数据库的量级达到一定规模之后,如果缺失有效的预警、监控、处理等手段则会对用户的使用体验造成影响,严重的则会直接导致订单、金额直接受损,因而就需要时刻关注数据库的性能问题。
数据库性能优化的常见手段有很多,比如添加索引、分库分表、优化连接池等,具体如下:
图1 数据库性能优化的常见措施
02 MySql性能优化
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。从设计稿出发,提升页面搭建效率,亟需解决的核心问题有数据来源:交易数据的来源,包含业务信息、联系人、数据接入协议
2.1 MySql底层架构
首先了解一下数据的底层架构,也有助于更好地优化。
图2 一次查询请求的执行过程
2.2 索引构建过程
目前比较常用的是InnoDB存储引擎,本文讨论也是基于InnoDB引擎。经常提到的加索引,那到底什么是索引、索引是如何形成、又是如何应用的呢?
这个话题其实很大也很小,说大是因为底层确实很复杂,说小是因为在大部分场景下程序员只需要添加索引就好,不太需要了解太底层原理,但是如果了解不透彻就会引发线上问题。因而本文平衡了大家的理解成本和知识深度,有一定底层原理介绍,但是又不会太过深入导致难以理解。
CREATE TABLE `t1`(
a int NOT NULL,
b int DEFAULT NULL,
c int DEFAULT NULL,
d int DEFAULT NULL,
e varchar(20) DEFAULT NULL,
PRIMARYKEY(a)
)ENGINE=InnoDB
insert into test.t1 values(4,3,1,1,'d');
insert into test.t1 values(1,1,1,1,'a');
insert into test.t1 values(8,8,8,8,'h');
insert into test.t1 values(2,2,2,2,'b');
insert into test.t1 values(5,2,3,5,'e');
insert into test.t1 values(3,3,2,2,'c');
insert into test.t1 values(7,4,5,5,'g');
insert into test.t1 values(6,6,4,4,'f');
https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
图7 MySQL官网上介绍的索引的叶子节点
2.3 MySql索引的使用规范
冗余索引: 单列索引:(字段1) 联合索引:(字段1 字段2) 重复索引:
2.4 执行计划
图8 执行计划
rows:预估的需要读取的记录条数。
03 线上案例
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。从设计稿出发,提升页面搭建效率,亟需解决的核心问题有:
案例1:
<!--统计医患下过去24小时内开的电子病历总数-->
<select id="getCountByDPAndTime" resultType="integer">
select count(1)
from jdhe_medical_record
where status = 1 and is_test = #{isTest,jdbcType=INTEGER} and electric_medical_record_status in (2,3)
<if test="patientId != null">
and patient_id = #{patientId,jdbcType=BIGINT}
</if>
<if test="doctorPin != null">
and doctor_pin = #{doctorPin,jdbcType=VARCHAR}
</if>
and created >#{dateStart,jdbcType=TIMESTAMP};
</select>
select rx_id, rx_create_time
from nethp_rx_info
where rx_status = 5
and status = 1
and rx_product_type = 0
and (parent_rx_id = 0 or parent_rx_id is null)
and business_type != 7
and vender_id = 8888
order by rx_create_time asc
limit 1;
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_rx_id` (`rx_id`),
KEY `idx_diag_id` (`diag_id`),
KEY `idx_doctor_pin` (`doctor_pin`) USING BTREE,
KEY `idx_rx_storeId` (`store_id`),
KEY `idx_parent_rx_id` (`parent_rx_id`) USING BTREE,
KEY `idx_rx_status` (`rx_status`) USING BTREE,
KEY `idx_doctor_status_type` (`doctor_pin`, `rx_status`, `rx_type`),
KEY `idx_business_store` (`business_type`, `store_id`),
KEY `idx_doctor_pin_patientid` (`patient_id`, `doctor_pin`) USING BTREE,
KEY `idx_rx_create_time` (`rx_create_time`)
04 总结
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
关于数据库的性能优化其实是一个很复杂的大课题,很难通过一篇帖子讲得全面和深刻,这也就是为什么本文的标题是‘浅析’,程序员的成长一定要付出代价和成本,因为只有真的在一线切身体会到当时的紧张和压力,对于一件事情才能印象深刻,但反之也不能太过于强调代价,如果可以通过别人的分享就可以规避一些业务的问题和错误的代价也是很不错的。
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
【福利】2023 高薪课程,全面来袭(视频+笔记+源码)
PS:防止找不到本篇文章,可以收藏点赞,方便翻阅查找哦。
往期推荐