你想进大厂吗这份所有大厂都绕不过的MyS

济南白癜风医院 http://baidianfeng.39.net/a_zczz/131229/4319054.html

前言:

好久没有给我的粉丝们分享过资料了,眼看着秋招就来了特意给大家总结了一份大厂秋招宝典,如今基本上所有的大厂都绕不过MySQL只要你想进大厂不管是腾讯、阿里也好还是字节百度只要你去面试就一定会问你MySQL怎么样,为了我的粉丝们秋招的时候能面试上自己心仪的大厂,我特意找了某大厂的核心员工买来了这份宝典,希望能帮助我的粉丝在秋招上拿到自己喜欢的offer!

目录:

因为文档内容实在太多了,我会尽可能多地为大家进行展示,如果感兴趣的话,可以帮忙点赞转发下,后台私信,获取完整内容免费下载方式

MySQL架构与历史

MySQL逻辑架构

如果能在头脑中构建出一幅MySQL各组件之间如何协同工作的架构图,就会有助于深人理解MySQL服务器。

MySQL时间线(Timeline)

在选择MySQL版本的时候,了解一下版本的变迁历史是有帮助的,对于怀旧者也可以享受一下过去的好日子里是怎么使用MySQL的。

MySQL基准测试

基准测试应该运行多长时间

基准测试应该运行足够长的时间,这一点很重要。如果需要测试系统在稳定状态时的性能,那么当然需要在稳定状态下测试并观察。而如果系统有大量的数据和内存,要达到稳定状态可能需要非常长的时间。大部分系统都会有一些应对突发情况的余量,能够吸收性能尖峰,将一些工作延迟到高峰期之后执行。但当对机器加压足够长时间之后,这些余量会被消耗尽,系统的短期尖峰也就无法维持原来的高性能。

绘图的重要性

如果你想要统治世界,就必须不断地利用“阴谋””。而最简单有效的图形,就是将性能指标按照时间顺序绘制。通过图形可以立刻发现一些问题,而这些问题在原始数据中却很难被注意到。或许你会坚持看测试工具打印出来的平均值或其他汇总过的信息,但平均值有时候是没有用的,它会掩盖掉一些真实情况。幸运的是,前面写的脚本的输出都可以定制作为gnuplot或者R绘图的数据来源。假设使用gnuplot,假设输出的数据文件名是QPS-per-5-seconds:

gnuplotplot"QPS-per-5-seconds"using5wlinestitle"Qps"

服务器性能剖析

通过性能剖析进行优化

一旦掌握并实践面向响应时间的优化方法,就会发现需要不断地对系统进行性能剖析(profiling)。性能剖析是测量和分析时间花费在哪里的主要方法。性能剖析一般有两个步骤:测量任务所花费的时间;然后对结果进行统计和排序,将重要的任务排到前面。

剖析MySQL查询

对查询进行性能剖析有两种方式,每种方式都有各自的问题,本章会详细介绍。可以剖析整个数据库服务器,这样可以分析出哪些查询是主要的压力来源(如果已经在最上面的应用层做过剖析,则可能已经知道哪些查询需要特别留意)。定位到具体需要优化的查询后,也可以钻取下去对这些查询进行单独的剖析,分析哪些子任务是响应时间的主要消耗者。

Schema与数据类型优化

日期和时间类型

MySQL可以使用许多类型来保存日期和时间值,例如YEAR和DATE。MySQL能存储的最小时间粒度为秒(MariaDB支持微秒级别的时间类型)。但是MySQL也可以使用微秒级的粒度进行临时运算,我们会展示怎么绕开这种存储限制。

范式和反范式

对于任何给定的数据通常都有很多种表示方法,从完全的范式化到完全的反范式化,以及两者的折中。在范式化的数据库中,每个事实数据会出现并且只出现一次。相反,在反范式化的数据库中,信息是冗余的,可能会存储在多个地方。

创建高性能的索引

索引的类型

索引有很多种类型,可以为不同的场景提供更好的性能。在MySQL中,索引是在存储引擎层而不是服务器层实现的。所以,并没有统一的索引标准:不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引。即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。

索引的优点

索引可以让服务器快速地定位到表的指定位置。但是这并不是索引的唯一作用,到目前为止可以看到,根据创建索引的数据结构不同,索引也有一些共他的附加作用。

查询性能优化

查询执行的基础

当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行。

查询优化器的提示(hint)

如果对优化器选择的执行计划不满意,可以使用优化器提供的几个提示(hint)来控制最终的执行计划。下面将列举一些常见的提示,并简单地给出什么时候使用该提示,通过在查询中加入相应的提示,就可以控制该查询的执行计划。关于每个提示的具体用法。

MySQL高级特性

视图

MySQL5.0版本之后开始引入视图。视图本身是一个虚拟表,不存放任何数据。在使用SQL语句访问视图的时候,它返回的数据是MySQL从共他表中生成的。视图和表是在同一个命名空间,MySQL在很多地方对于视图和表是同样对待的。不过视图和表也有不同,例如,不能对视图创建触发器,也不能使用DROPTABLE命令删除视图。

插件

除了UDF,MySQL还支持各种各样的插件。这些插件可以在MySQL中新增启动选项和状态值,还可以新增INFORMATION_SCHENA表,或者在MySQL的后台执行任务,等等。

优化服务器设置

配置MySQL的I/O行为

有一些配置项影响着MySQL怎样同步数据到磁盘以及如何做恢复操作。这些操作对性能的影响非常大,因为都涉及到昂贵的I/0操作。它们也表现了性能和数据安全之间的权衡。通常,保证数据立刻并且一致地写到磁盘是很昂贵的。如果能够冒一点磁盘写可能没有真正持久化到磁盘的风险,就可以增加并发性和减少I/O等待,但是必须决定可以容忍多大的风险。

优化BLOB和TEXT的场景

配置服务器的一个目标是把它定制得符合特定的工作负载。这需要精通所有类型的服务器活动的数量、类型,以及频率——不仅仅是查询语句,也包括共他的活动,例如连接服务器以及刷新表。

操作系统和硬件优化

平衡内存和磁盘资源

配置大量内存最大的原因其实不是因为可以在内存中保存大量数据:最终目的是避免磁盘I/O,因为磁盘I/O比在内存中访问数据要慢得多。关键是要平衡内存和磁盘的大小、速度、成本和其他因素,以便为工作负载提供高性能的表现。

I/O密集型的机器

在I/O密集型工作负载下,CPU花费大量时间在等待I/O请求完成。这意味着vmstat会显示很多处理器在非中断休眠(b列)状态,并且在wa这一列的值很高,下面是个例子:

复制

复制解决的问题

下面是复制比较常见的用途:

数揣分布

MySQL复制通常不会对带宽造成很大的压力,但在5.1版本引入的基于行的复制会比传统的基于语句的复制模式的带宽压力更大。你可以随意地停止或开始复制,并在不同的地理位置来分布数据备份,例如不同的数据中心。即使在不稳定的网络环境下,远程复制也可以工作。但如果为了保持很低的复制延迟,最好有一个稳定的、低延迟连接。

复制的原理

我们已经介绍了复制的一些基本概念,接下来要更深入地了解复制。让我们看看复制究竟是如何工作的,有哪些优点和弱点,最后介绍一些更高级的复制配置选项。

可扩展的MySQL

扩展MySQL

如果将应用所有的数据简单地放到单个MySQL服务器实例上,则无法很好地扩展,迟早会碰到性能瓶颈。对于许多类型的应用,传统的解决方法是购买更多强悍的机器,也就是常说的“垂直扩展”或者“向上扩展”,另外一个与之相反的方法是将任务分配到多台计算机上,这通常被称为“水平扩展”或者“向外扩展”。我们将讨论如何联合使用向上扩展和向外扩展的解决方案,以及如何使用集群方案来进行扩展。最后,大部分应用还会有一些很少或者从不需要的数据,这些数据可以被清理或归档。我们将这个方案称为“向内扩展”,这么取名是为了和其他策略相匹配。

向外扩展

可以把向外扩展(有时也称为横向扩展成者水平扩展)策略划分为三个部分:复制、拆分,以及数据分片(sharding)。

高可用性

如何实现高可用性

可以通过同时进行以下两步来获得高可用性。首先,可以尝试避免导致宕机的原因来减少宕机时间。许多问题其实很容易避免,例如通过适当的配置、监控,以及规范或安全保障措施来避免人为错误。第二,尽量保证在发生宕机时能够快速恢复。最常见的策略是在系统中制造冗余,并且具备故障转移能力。这两个维度的高可用性可以通过两个相关的度量来确定:平均失效时间(MTBF)和平均恢复时间(MTTR)。一些组织会非常仔细地追踪这些度量值。

中间件解决方案

可以使用代理、端口转发、网络地址转换(NAT)或者硬件负载均衡来实现故障转移和故障恢复。这些都是很好的解决方案,不像共他方法可能会引入一些不确定性(所有系统组件认同哪一个是主库吗?它能够及时并原子地更改吗?),它们是控制应用和服务器间连接的中枢。但是,它们自身也引人了单点失效,需要准备冗余来避免这个问题。

云端的MySQL

云的优点、缺点和相关误解

云计算有许多优点,但很少是为MySQL特别设计。有一些书籍已经介绍了相关的话题“3,这里我们不再赞述。不过我们会列出一些比较重要的条目供参考,因为接下来会讨论到云计算的缺点,我们不希望你认为我们是在过分苛求云计算。

MySQL数据库即服务(DBaaS)

在云端服务器上安装MySQL并不是在云中使用MySQL的唯一方法。已经有越来越多的公司开始将数据库本身作为云资源,称之为数据库即服务(DBaaS,有时候也叫DaaS),这意味着你可以在一个地方使用云中的数据库,而在另外的地方运行真正的服务。虽然我们在本章花很多时间解释了IaaS,但IaaS市场正在快速商品化,我们期望未来重点会转到DBaaS。在写作本书时已经有以下几个DBaaS服务提供商。

应用层优化

Web服务器问题

Apache是最流行的Web应用服务器软件。它在许多情况下都运行良好,但如果使用不当也会消耗大量的资源。最常见的问题是保持它的进程的存活(alive)时间过长,或者在各种不同的用途下混合使用,而不是分别对不同类型的工作进行优化。

缓存

缓存对高负载应用来说是至关重要的。一个典型的Web应用程序会提供大量的内容,直接生成这些内容的成本比采用缓存要高得多(包含检查和缓存超时的开销),所以采用缓存通常可以获得数量级的性能提升。诀窍是找到正确的粒度和缓存过期策略组合。另外也需要决定哪些内容适合缓存,缓存在哪里。

备份与恢复

管理和备份二进制日志

服务器的二进制日志是备份的最重要因素之一。它们对于基于时间点的恢复是必需的,并且通常比数据要小,所以更容易进行频繁的备份。如果有某个时间点的数据备份和所有从那时以后的二进制日志,就可以重放自从上次全备以来的二进制日志并“前滚”所有的变更。

备份和恢复工具

有各种各样的好的和不是那么好的备份工具。我们喜欢对LVM使用mylvmbackup做快照备份,使用PerconaXtrabackup(开源)或MySQLEnterpriseBackup(收费)做InnoDB热备份。不建议对大数据量使用mysqldump,因为它对服务器有影响,并且漫长的还原时间不可预知。

MySQL用户工具

命令行工具集

MySQL包含了一些命令行工具集,例如mysqladmin和mysqlcheck。这些在MySQL手册上都有提及和记录。MySQL社区同样创建了大量高质量的工具包,并有很好的文档支撑这些实用工具集。

监测工具

以我们的经验来看,大多数MySQL商店需要提供两种类型的监测工具:健康监测工具——检测到异常时告警——和为趋势、诊断、问题排查、容量规划等记录指标的工具。大多数系统仅在这些任务中的一个方面做得很好,而不能两者兼顾。更不幸的是,有十几种工具可选,使得评估和选择一款适合的工具非常耗时。

MySQL分支与变种

MariaDB

在Sun收购MySQL后,MontyWidenius,这位MySQL的创建者,因不认同MySQL开发流程而离开Sun。他成立了Monty程序公司,创立了MariaDB,以培养一个“开放的开发环境以鼓励外部的参与”。MariaDB的目标是社区开发,Bug修复和许多的新特性!

MySQL服务器状态

SHOWSTATUS

SHOWSTATUS命令会显示每个服务器变量的名字和值。和上面讲的服务器参数不一样,状态变量是只读的。可以在MySQL客户端里运行SHOWSTATUS或在命令行里运行mysqladminextended-statas来查看这些变量。如果使用SQL命令,可以使用LIKE或WHERE来限制结果。可以用LIKE对变量名做标准模式匹配。命令将返回一个结果表,但不能对它排序,与另外一个表做联合操作,或像对MySQL表一样做一些事情。在MySQL5.1或更新版本中,可以直接从INFORMATION_SCHEMA.GLOBAL_STATUS和INFORMATIONSCHEMA.SESSIONSTATUS表中查询值。

大文件传输

复制文件

这个任务实际上就是完成以下事情。

1.(可选)压缩数据。

2.发送到另外一台机器上。

3.把数据解压缩到最终目的地。

4.在复制完成后,校验文件以确认共没有被损坏。

我们对能达成这些目标的一系列方法进行了基准测试。本附录的余下部分将展示我们是

怎么做的,以及我们找到的最快速的方法是什么。

EXPLAIN

调用EXPLAIN

要使用EXPLAIN,只需在查询中的SELECT关键字之前增加EXPLAIN这个词。MySQL会在查询上设置一个标记。当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是执行它。它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序。

锁的调试

服务器级别的锁等待

锁等待可能发生在服务器级别或存储引擎级别。准1(应用程序级别的锁可能也是一个问题,但我们在此只


转载请注明:http://www.aierlanlan.com/grrz/1788.html