数据库性能优化思路

本文探讨了数据库查询效率优化的多种方法,包括SQL语句优化、索引构建、慢查询处理、表结构设计、读写分离、分库分表,以及微服务和分布式带来的挑战和解决方案。
摘要由CSDN通过智能技术生成

说到数据库的查询效率优化问题,首先就能想到以下几种方式:

这里是说基于数据库的优化,还有其它的优化方式;比如,增加缓存,把频繁使用的数据放到redis中,这样可以加快速度;但同样会带来数据的一致性问题。

所以,这里只讨论数据库层面的优化。

1. sql语句优化,索引优化,慢查询

2. 数据表结构优化

3. 读写分离

4. 分库分表

面试或工作过程中,问到数据库提升性能的思路,无法以上几种。

第一, sql优化,最简单直接的就是不要使用select *等语句,一是可能导致索引等失效;二是会导致查询到大量不需要到数据,导致系统响应缓慢。

其次,就是在适当的字段上面建立索引,这样可以大大提升数据库的查询效率;还有就是慢查询。

所谓的慢查询就是sql语句查询时间超过某个点的查询语句,比如超过了两秒钟。

而怎么解决慢查询问题,首先就是可以使用一些第三方的监控系统,监控某个接口响应时间是否异常等;或者通过配置mysql数据库的方式,开启其慢查询的功能;这样超过一定时间限制的sql语句就会被记录下来,这时再根据具体的业务需求,对sql进行优化;比如关联查询拆分成单表查询,然后在业务代码中对数据进行组合处理等。

还有就是使用mysql提供的explain字段,来查看sql语句的执行过程,是否有命中索引等,以此来对sql语句或索引进行优化。

第二,表结构优化。在表结构的设计过程中,根据不同的业务场景,对数据表结构进行设计,没有关系的字段不要放到同一张表中;有关系的字段可以进行适当的业务关联或者表结构冗余。

比如,订单表和用户表,如果完全遵循数据库的三范式,那么订单表中就不应该保存用户的任何信息,只需要把订单表和用户表进行关联就行了;比如在订单表中保存用户的id信息,或者再使用一张表去关联订单与用户的信息。但如果在与订单相关联的业务中经常需要使用到用户的手机号。

这时就可以在订单表中添加一个用户手机号的字段,这样就不用每次需要使用手机号时,都要关联用户表,增加查询的复杂度。

第三,读写分离。读写分离是一种常见的数据库优化方法,其主要原理就是采用数据的主从模式;在主表中写入数据,从从表中读取数据;这样防止读写都在一个数据库里,增加数据库的压力。

但读写分离会带来一个问题就是主从复制是需要时间的,不论是使用mysql自带的主从复制功能,还是使用比如canal这种中间件;所以可能会存在短时间内的数据不一致问题。

第四,分库分表。分库分表在大型互联网公司中算是一种基本操作,比如腾讯,阿里,抖音等用户量都接近十亿级,每天日活量上亿;所以,这种情况下的单库就无法支撑如此庞大的数据访问,所以就需要分库分表。

分库分表分为垂直拆分与水平拆分;所谓的垂直拆分,就是把一张数据表的字段拆分到多张表中;比如,有些公司一张表可能有几十个,甚至上百个字段;这样就会导致数据库单张表的压力太大。

而所谓的水平拆分就是一张表中的数据太多,比如抖音有十几亿用户,如果把这些用户信息放到一张表中,那么没有任何数据库产品能够做到。所以,就需要把这些数据拆分到多张数据表中。比如,抖音可以把不同省份的人放到不同的数据表中,这样就可以大大减轻表数据的压力。

而在根据是否把拆分的表放到同一个数据库中,还是放到不同的数据库中,又分为同库垂直分表,同库水平分表;以及异库分表——也就是分库分表。

在数据库系统的优化过程中,如果是在单库中,那么只需要使用前两种的优化方式即可;而如果涉及到读写分离,和分库分表;那么就涉及到多个数据库的数据一致性问题;数据同步问题,事务问题等。以及不同库等匹配规则;比如读写分离有多个库时,怎么确保读取数据平均分布在不同的数据库上,其具体策略是什么,应该怎么实现。

在比如,读写分离时,怎么根据不同的业务场景,合理的把数据拆分到不同的数据库中;拆分完成之后,怎么保证数据请求能够请求到正确的数据库中;数据一致性怎么保证,分布式事务怎么处理,数据异常时的回滚怎么做。

当然,市面上已经提供了具体的实现产品,比如sharding-jdbc以及mycat等;但由此产生的数据一致性问题以及分布式事务问题,还需要自己解决。

其次,自从微服务的出现,分布式思想深入人心;但事实上,分布式也可以理解成一种垂直方向上的分表,不同的业务模块拆分成不同的服务,每个服务有自己独立的数据库。

而且,这四种优化方式,并不是完全独立的, 而是可以进行叠加的。

比如,分库分表时,垂直拆分和表结构的优化可以作为一个东西来看待;但同样,分库分表时,在不同的数据库表中,索引怎么建,水平拆分时怎么建索引,垂直拆分时又该怎么建索引?

在垂直拆分时,如果一条数据需要多张表中的字段,也就是跨表查询语句该怎么写,索引该怎么建?水平拆分时,如果查询记录涉及到跨表该怎么办?

比如说,一张订单表中有二十个字段,一共有一亿条数据;这时需要把这张表进行分库分表;也就是说,订单表中的二十个字段要垂直拆分到两张表中,一亿条数据拆分到五张表中,每张表两千万数据,数据根据id进行拆分,1到2千万在第一张表中,2千万零1到4千万在第二张表中,以此推类。

这时,一个业务场景中,需要查询到字段中涉及到拆分的两张表中的字段,然后查询的订单数据中需要分页查询,并且分页的是一千九百九九万九千九百九十到两千万零十,这样跨表查询的索引应该怎么建,分页查询应该怎么实现?

这都是需要考虑的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值