数据库优化(详)——单机

一般主要是优化查询,增删改的效率其实还是比较高的。(发现→分析→解决问题)
解决思路:先是定位到慢sql,再通过某些方式优化sql。
做优化都是指的单机优化,当单机优化不了时,再考虑做集群(多机优化)。

思考:为什么需要优化?

1.高并发读写的情况下,应用本身的并发能力需要提 上来之外,同时数据库的并发能力也需要提上来,否则程序的性能可能就是上不去。
2.海量数据读写的情况下,当一张表数据量大的时候,一般达到几百万就会很明显感觉这个表就很慢了,此时就必须对其做优化,否则就是查不出来,再如果加上sql写得比较复杂的话,就会发现几秒或者十几秒也查不出数据来。(甚至比如联表)
3.高扩展性和可用性的情况下,主要是做集群,不让数据库那么容易挂掉。

思考:对数据库性能影响的因素有哪些?

常见:本就是高并发量的情况下、实时更新(需定时任务、redis)、不合理需求、数据库设计不合适、多联表、热点数据(需做缓存)、不拆表、select *、硬件环境、网络环境。
比如:大表查询,用like去匹配的话,性能极低,就可以用ES。

常见优化手段(单机):

①.合适表结构3NF(三范式)和反3NF。
3NF是哪三范式:行唯一(主键ID不重复)、列不可再分(只能存一个类型的数据,列本来就只存一个值)、当前表只能出现其它表的主键。
反3NF:将冗余字段去减少json联表;就是当前表可以出现其它表的其它字段。
②合适引擎(根据业务特性选择不同的引擎)
③索引(对数据的查询性能提升是非常大的)
④分表(垂直分表和水平分表)水平分表比较复杂
⑤sql优化技巧

Mysql的执行原理/架构

客户端向MySQL发起一个比如说查询,它是怎么去执行的?
客户端就是JDBC,Java都是用JDBC去连接MySQL的,在MySQL中他会有一个连接器,就是一个socket;
就是客户端会发一个网络请求,会携带账号和密码,它们中间会进行一个管理连接权限验证,验证之后,就连接上MySQL连接器了,MySQL自带查询缓存功能,但MySQL8.0以后就没有自带查询缓存功能了,因为命中率比较低,官方自己取消掉了,会带着sql作为命中条件去缓存中看一下,有没有对应的数据,有的话就返回,但注意它这个缓存是用你的sql和参数作为key去命中这个缓存中有没有相应的数据,缓存都是key-value结构;
带着sql到分析器里面(它会把你的sql进行拆解,比如select * from 表名 where 条件,就会拆成select、表、where,就底层已经不算是一个sql了),分析你的语法、关键字等,看sql是否正确,如果sql写错了这里就会报错,说你的sql有误;
正确的话,就会进入优化器,MySQL优化器会按照它自己的方式来对你的sql进行优化,然后生成一个执行计划,选择合适的索引;(这个优化器,如select * from qq where user like “%xm%” and id=6;一看就是先执行id条件效率更高,所以MySQL优化器会自动做这个事情,就会找到索引ID为6的数据,如果没有所以就没办法,但注意sql复杂语句,优化器优化的sql不是最优的)
然后调用执行器去执行,执行器就会调用存储引擎(如:InnoDB、MyISAM、Memory);
就会去磁盘上IO去加载数据,加载数据页,加载到内存中,根据你的执行计划去处理数据。
以上就是MySQL执行原理或MySQL架构,最耗时就是存储引擎,去磁盘上去IO加载数据是很耗时的;其次就是当数据量很到的时候,优化器中会生成执行计划也很耗时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值