性能优化之数据库篇

性能优化-数据库篇1

首先我们要谈论什么是性能?

  • 吞吐和延迟
  • 没有量化就没有改进 :监控和度量指标可以指导我们从哪里入手
  • 80/20原则:先优化性能瓶颈的地方
  • 过早的优化是万恶之源:选择合适的优化时机
  • 脱离场景谈性能都是耍流氓:对性能的要求要符合实际

一般来说,DB/SQL操作的消耗在一次处理中占比最大。DB/SQL优化是业务系统的性能核心

关系数据库

什么是关系数据库?

1970年Codd提出关系模型,以关系代数理论为数学基础。建立在关系数据库模型基础上的数据库,称为关系数据库。

数据库设计范式

  1. 第一范式(1NF):所有属性都不可再分
  2. 第二范式(2NF): 在满足1NF的基础上,消除非主属性对码的部分函数依赖
  3. 第三范式(3NF):在满足2NF的基础上,消除非主属性对码的传递函数依赖。消除表中列不依赖主键,而是依赖表中非主键列的情况。

名词解释:

函数依赖:一张表中,属性X的值确定的情况下,必定能确定属性Y的值,那么就说Y函数依赖于X。写作X->Y

完全函数依赖
设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X

部分函数依赖
设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

传递函数依赖:Z函数依赖于Y,且Y函数依赖于X,那么称Z传递函数依赖于X。

:设K为某表中的一个属性或属性组,除K外的所有属性都完全函数依赖于K,那么称K为候选码,简称码。

非主属性:除去主属性的就是非主属性

举例说明:

下面表是否符合第二范式?

(学号、课名)可以作为码。

有 (学号,课名)->姓名,但是学号->姓名,存在非主属性“姓名”对码的部分函数依赖。

有 (学号,课名)->系名,但是学号->系名,存在非主属性“系名”对码的部分函数依赖。

所以不符合第二范式。

下面表是否符合第三范式?

主属性是学号,有学号->系名,系名->系主任。所以系主任传递函数依赖于学号,所以不符合第三范式。

常见数据库

结构化查询语言包含6个部分:

  1. 数据查询语言(DQL),用于从表里获得数据
  2. 数据操作语言(DML),用于添加、修改、删除
  3. 事务控制语句(TCL),用于事务提交、保存点、回滚
  4. 数据控制语言(DCL):它的语句通过GRANT或REVOKE实现权限控制
  5. 数据定义语言(DDL):其语句包括动词CREATE、ALTER和DROP,创建表、修改表、删除表、加索引等。
  6. 指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO用于对一个或多个表单独行的操作。

MySQL数据库

MySQL数据库的版本

  • 4.0支持InnoDB,事务
  • 2003年,5.0
  • 5.6 历史使用最多的版本
  • 5.7 近期使用最多的版本
    • 多主
    • MGR高可用
    • 分区表
    • json
    • 修复XA
  • 8.0 较新和功能最完善的版本
    • 通用表达式
    • 持久化参数
    • 自增列持久化
    • 默认编码utf8mb4
    • DDL原子性
    • JSON增加
    • 不再对group by进行隐式排序

MySQL简化的执行流程:

MySQL详细执行流程

MySQL执行引擎:

存储引擎 myisam innodb memory archive
存储限制 256TB 64TB
事务 - 支持 - -
索引 支持 支持 支持 -
锁的粒度 表锁 行锁 表锁 行锁
数据压缩 支持 - - 支持
外键 - 支持 - -

2.1 MySQL 索引原理

数据是按页分块的,当一个数据被用到时,其附近的数据也通常会马上被使用

MySQL索引结构:

Mysql innodb的索引结构是B+树。

B+树简单的说是一种平衡查找树,所有的记录节点都是按大小顺序存放在同一层的叶子节点上,由各叶子节点的指针开始连接。页之间是双向链表连接,页里面的数据是单向链表。

B+树索引又分为聚集索引和辅助索引

聚集索引:

按照每张表的主键构造一颗B+树,同时叶子节点存放的为整张表的行记录数据,也叫聚集索引的叶子节点称为数据页。由于实际的数据页只能按照一颗B+树进行排序,因此每个表只能拥有一个聚集索引。

很多文档说:聚集索引按照顺序物理的存储数据,其实不是,它的存储不是物理上连续的,而是逻辑上连续的。

非聚集索引

也叫辅助索引,叶子节点除了包含键值外,还包含找到与索引对应的行数据的指针。

如果需要在一颗高度为3的辅助索引中查找数据,需要遍历3次找到指定主键,如果聚集索引树高度也为3,那么还需要对聚集索引树进行3次查找,最终找到一个完整的行数据所在页。

为什么一般单表的数据不能超过2000万?

答:首先一个页16K。

  • 按一行数据1k,那么叶子节点一页存16条数据。
  • id占8字节,指针占6字节,一共14字节。非叶子节点一页存(16*1024/(8+6))1170个这样的单元。

可以算出2层的B+树放1170x16=18724条数据。如果3层的B+树1170x1170x16=21,902,400条数据。

所以如果超过这么多数据,那么B+树就会变为4层,那么查询就慢了。

2.2 参数配置优化

连接请求的变量

  1. max_connections: 最大连接数,一般配置个5k-10k
  2. back_log
  3. wait_timeout和interative_timeout

缓冲区变量
4. key_buffer_size
5. query_cache_size(查询缓存简称 QC)
6. max_connect_errors:
7. sort_buffer_size
8. max_allowed_packet=32M
9. join_buffer_size=2M
10. thread_cache_size=300

配置 Innodb 的几个变量
11. innodb_buffer_pool_size
12. innodb_flush_log_at_trx_commit
13. innodb_thread_concurrency=0
14. innodb_log_buffer_size
15. innodb_log_file_size=50M
16. innodb_log_files_in_group=3
17. read_buffer_size=1M
18. read_rnd_buffer_size=16M
19. bulk_insert_buffer_size=64M
20. binary log

原文地址:https://www.cnblogs.com/javammc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = "hello"; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let's briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越