下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

数据库正在变化,数据库优化渐进的过程,这些你都知道?

作者:课课家教育     来源: http://www.kokojia.com点击数:944发布时间: 2019-04-16 09:36:27

标签: 数据库系统工程师视频数据库系统数据库SQL设计

  其实呢,对于一些数据库工程师,首先就是要知道数据库是做什么用的,其实呢,数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式。

  数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。

  大家在面试的时候经常会被问到数据库优化的问题,今天给大家总结了几点:

  第一阶段优化sql和索引

数据库正在变化,数据库优化渐进的过程,这些你都知道?_数据库系统工程师视频_数据库系统_数据库SQL设计_课课家

  这才是调优的第一阶段啊,为什么呢?

  因为这一步成本最低啊,不需要加什么中间件。

  那步骤是什么样呢?我说个大概

  用慢查询日志定位执行效率低的SQL语句

  用explain分析SQL的执行计划

  确定问题,采取相应的优化措施,建立索引等

  第二阶段使用缓存

  在优化sql无法解决问题的情况下,才考虑搭建缓存。毕竟你使用缓存的目的,就是将复杂的、耗时的、不常变的执行结果缓存起来,降低数据库的资源消耗。

  这里需要注意的是:搭建缓存后,系统的复杂性增加了。你需要考虑很多问题,比如:

  缓存和数据库一致性问题?(比如是更缓存,还是删缓存)

  缓存击穿、缓存穿透、缓存雪崩问题如何解决?是否有做缓存预热的必要。不过我猜,大部分中小公司应该都没考虑。

  第三阶段读写分离

  缓存也搞不定的情况下,搞主从复制,上读写分离。在应用层,区分读写请求。或者利用现成的中间件mycat或者altas等做读写分离。

  需要注意的是,只要你敢说你用了主从架构,有三个问题,你要准备:

  1.主从的好处?

  回答:实现数据库备份,实现数据库负载均衡,提高数据库可用性

  2.主从的原理?

  回答:如图所示

  主库有一个logdump线程,将binlog传给从库

  从库有两个线程,一个I/O线程,一个SQL线程,I/O线程读取主库传过来的binlog内容并写入到relaylog,SQL线程从relaylog里面读取内容,写入从库的数据库。

  3.如何解决主从一致性?

  回答:这个问题,我不建议在数据库层面解决该问题。根据CAP定理,主从架构本来就是一种高可用架构,是无法满足一致性的。

  哪怕你采用同步复制模式或者半同步复制模式,都是弱一致性,并不是强一致性。所以,推荐还是利用缓存,来解决该问题。

  步骤如下:

  自己通过测试,计算主从延迟时间,建议MySQL版本为5.7以后,因为mysql自5.7开始,多线程复制功能比较完善,一般能保证延迟在1s内。不过话说回来,mysql现在都出到8.x了,还有人用5.x的版本么。

  数据库的写操作,先写数据库,再写cache,但是有效期很短,就比主从延时的时间稍微长一点。

  读请求的时候,先读缓存,缓存存在则直接返回。如果缓存不存在(这时主从同步已经完成),再读数据库。

  第四阶段利用分区表

  说句实在话,你们面试的时候,其实可以略过这个阶段。因为很多互联网公司都不建议用分区表,我自己也不太建议用分区表,采用这个分区表,坑太多。

  这里引用一下其他文章的回答:

  什么是mysql的分区表?

  回答:所有数据还在一个表中,但物理存储根据一定的规则放在不同的文件中。这个是mysql支持的功能,业务代码不需要改动,但是sql语句需要改动,sql条件需要带上分区的列。

  缺点

  分区键设计不太灵活,如果不走分区键,很容易出现全表锁

  在分区表使用ALTERTABLE…ORDERBY,只能在每个分区内进行orderby。

  分区表的分区键创建索引,那么这个索引也将被分区。分区键没有全局索引一说。

  自己分库分表,自己掌控业务场景与访问模式,可控。分区表,研发写了一个sql,都不确定该去哪个分区查,不太可控。

  第五阶段垂直拆分

  上面四个阶段都没搞定,就来垂直拆分了。垂直拆分的复杂度还是比水平拆分小的。将你的表,按模块拆分为不同的小表。大家应该都看过《大型网站架构演变之路》,这种类型的文章或者书籍,基本都有提到这一阶段。

  如果你有幸能够在什么运营商、银行等公司上班,你会发现他们一个表,几百个字段都是很常见的事情。所以,应该要进行拆分,拆分原则一般是如下三点:

  把不常用的字段单独放在一张表。

  把常用的字段单独放一张表

  经常组合查询的列放在一张表中(联合索引)。

  第六阶段水平拆分

  水平拆分是最麻烦的一个阶段,拆分后会有很多的问题,我再强调一次,水平拆分一定是最最最最后的选择。从某种意义上,我觉得还不如垂直拆分。因为你用垂直拆分,分成不同模块后,发现单模块的压力过大,你完全可以给该模块单独做优化,例如提高该模块的机器配置等。如果是水平拆分,拆成两张表,代码需要变动,然后发现两张表还不行,再变代码,再拆成三张表的?水平拆分后,各模块间耦合性太强,成本太大,慎重。

  你真的了解数据库工程师吗?写给想从事数据库方面工作的朋友

  小编结语:其实,SQL是一款非常好用的工具,在信息化社会,充分有效地管理和利用各类信息资源,是进行科学研究和决策管理的前提条件。数据库技术是管理信息系统、办公自动化系统、决策支持系统等各类信息系统的核心部分,是进行科学研究和决策管理的重要技术手段。

赞(29)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程