***mysql的架构是怎样的?
1.Mysql拥有分层架构,上层是服务器层的服务和查询执行引擎,下层是存储引擎;虽然有很多不同作用的插件API,但存储引擎API还是最重要的,理解mysql存储引擎和服务层之间处理查询时,如何通过API来回交互,就能抓住mysql的核心基础架构的精髓。
***什么是mysql基准测试?
1.基准测试不仅仅是用来解决业务问题的一种时间行动,也是一种很好的学习方法,基准测试的流程就像从数学题中的文字中推导出方程式一样:首先正确地描述问题,之后选择合适的基准测试来回答问题,设计基准测试的持续时间和参数,运行测试,收集数据,分析结果数据。
***服务器性能怎么分析?
1.要提升服务器性能,首先要澄清问题,然后选择合适的技术来解决这些问题,如果我们提升服务器的总体性能,那么就要一开始将所有查询记录到日志中,然后利用某工具生成系统级别的分析报告。如何要追查某些性能低下的查询,记录和分析的方法应该会有帮助。我们可以把精力放在那些耗时最多、导致用户体验糟糕的查询上。当找到了这些“坏”查询之后,我们就要从日志的详细信息分析出产生查询效率低下的原因。
2.如何暂时找不到查询性能低下的原因,那么有可能是遇到了服务器级别的性能问题。此时,我们可以较高精度测量和绘制服务器状态计数器的细节信息,如果通过这样的分析重现了问题,那么应该通过同样的数据制定一个可靠的触发条件,来收集更多的诊断数据,多花一些时间来确定可靠的触发条件,尽量避免漏检查或者误报。
3.我们无法完整地测量工作系统,但是说到底他们都是某种状态机,所及只要足够细心,逻辑清晰地分析下去,最终就能得到我们想要的结果,不过再次之间我们不要把原因和结果搞混淆,并且在确定问题之间也不要随便改动系统。
***如何看待schema和数据类型优化的作用?
1.良好的scheme(数据库对象)设计原则都是普遍适用的,但是mysql有自己实现起来的细节要注意,总的来说,设计的时候要保证任何数据类型都要是简单和小的。
2.除非真实数据模型需要,否则尽可能避免适用NULL值。
3.尽量适用相同的数据类型去储存,尤其对有关联条件的列来说。
4.注意可变长字符串,例如VARCHAR类型,它在临时表中可能是按最大长度的内存分配。
5.尽量适用整型定义标识列。
6.小心使用EMUN、SET和BIT类型。
7.用三大范式来设计数据库总的来说是好的,但是反范式有时也是必要的,它可以加快查询的效率。
8.ALTER TABLE操作(添加或者删除列)是让人痛苦的,因为大部分情况下,该操作都会锁表并且重建整张表。
****怎样利用好索引?
1.单行访问是非常慢的,所以最好读取的块中包含尽可能多所需要的行。
2.按顺序访问范围数据是很快的,原因有两点,第一是顺序I/O不需要多次磁盘寻道,所以比随机I/O要快很多;第二是,如果服务器能够按照顺序读取数据,那么我们就不要另外的排序操作。
3.索引覆盖查询是很快速的,如果一个索引包含了查询所需要的所有列,那么存储引擎就不需要再回表查找行,这避免了大量的单行访问。
***如何优化查询性能?
1.理解查询是如何被执行的以及时间都消耗到哪里了,再加上一些,如解析和优化过程的知识,就可以更进一步地学习优化。
2.优化通常需要三管齐下:不做、少做和快速做。
3.除了从表查询本身、表结构和索引等方面考虑优化问题,掌握分区、缓存等原理也能帮助优化查询性能。
***mysql有哪些高级特性?
1.分区表
分区表是一种颗粒度较小的索引策略,适用于大数据量的过滤场景,例如没有合适索引时,对其中几个分区进行全表查询。
2.视图
对多个表进行复杂查询时,利用视图可以简化查询,但是要注意视图的查询性能问题。
3.外键
外键限制会将约束放到mysql中,这对于必须维护外键的场景,性能会更高;但是外键也会带来额外的复杂性和索引消耗,还会增加多表之间的交互,会导致系统中更多的锁竞争。
4.存储过程
5.绑定变量
当查询语句的解析和执行计划生成消耗了大量时间时,绑定变量可以在一定程度上解决问题,因为只需要解析一次,对于大量重复类型的查询语句有大用处。
6.插件
7.字符集
字符集是一种字节到字节之间的映射,而校对规则是指一个字符集的排序方法,一般默认是UTF-8。
8.全文索引
9.XA事务
10.查询缓存
顾名思义,完全相同的查询语句重复执行的时候,查询缓存可以立即返回结果,无须在数据库中重新执行一次。如何判断是否应该使用查询缓存?就需要从多方面进行分析,通过观察日志,查看缓存命中率等。
***如何优化服务器配置?
1.设置服务器配置要考虑符合服务器和工作负载的基本选项,增加安全性和完整性所需的选项。如果数据库引擎是innoDB,那么下面2个选项是很重要的配置点:
***如何优化操作系统和硬件?
1.因为MYSQL需要的4种基本资源是:CPU、内存、硬盘和网路资源,一般网络不会是提升瓶颈,而是其他3个,其中提升设置更快的CPU比设置更多的CPU带来的性能提升更高。不过最重要的是,看具体情况,也就如何设置基本资源配置取决于工作集的大小(给定时间内最常用的数据集)。
2.关于持久化存储方面,提高性能的次序排序是:SAN,传统硬盘和固态存储设备。
3.而对于操作系统而言,需要关注的配置是:存储、网络和虚拟内存管理。
***如何理解MYSQL的复制?
1.MYSQL的复制是其自带功能中的“王牌”,该功能增加了mysql的功能性和可用性。
2.在mysql复制时,需要保持主库和备库相同,为此我们需要做以下工作:
*利用第三方工具,例如percona toolkit中的pt-table-checksum命令确定备库是主库的真是拷贝;
*监控复制以保证其正在运行并且没有落后主库;
*理解复制异步地本质,并且设计你的应用避免我们从备库读到脏数据;
*在一个复制拓扑中,不要写入超过一个服务器,把备库设置为只读,并且降低操作备库的权限,防止备库数据被串改;
***如何拓展MYSQL?
1.根据项目具体需求来明确mysql的拓展方向,并且预先为快速增长的数据量做好准备。
2.在mysql扩展策略方面,通常可以先从1个服务器水平拓展成拥有读备库的架构,再到数据分片和功能分区。
3.如果存在多个服务器,那么就会出现一致性或原子性相关的问题,这时采用负载均衡器可以解决该问题。
***如何让数据库获得高可用性?
1.可以通过减少宕机来获得高可用性,主要从以下2个方面着手:
*增加2次故障之间的正常运行时间(MTBF);
最好试着从宕机中获得经验教训,但是也要谨防在故障根源分析和事后检验时,太过于集中在某一点上而忽略其他因素。
*减少从故障中恢复的时间(MTTR);
有一种策略是,可以通过监控来快速发现问题所在,同时记录大量的度量值以帮助诊断问题;
另一种策略是,为系统建立冗余,并且使系统具备故障转移能力,这样当故障发生时,就可以在冗余组件之间进行切换。
***怎样使用云端MYSQL?
1.在云服务器上安装MYSQL或者DBaas(数据库即服务)。MYSQL可以在云主机上运行得很好,但是云环境的限制会导致更早地需要进行数据拆分,并且云环境的性能和服务质量比自建的物理硬件要低很多。
2.只要我们的工作集加载到内存中,并且产生的写入负载不超过云服务器能支撑的I/O量,那么云mysql就能获得很好的效果。
***如何优化应用层?
1.先测量,剖析每一层的问题,找出是哪一层导致了大部分的响应时间?在WEB服务器配置和缓存中经常发现大问题,但是不一定是数据库的问题,应用程序的其他层也要重视,它们也可能被错误配置,特别是缓存,利用好缓存可以承受只用mysql更多的内容。
***mysql有哪些用户工具?
该书一些工具有些过时,所以只记经典的底层工具,特别是MYSQL的一些监控工具,例如innotop,可以在终端运行它,从而来观察它以及任何相关的服务器。
***如何备份和恢复mysql?
1.常用的2种备份方式,一种是从文件系统或者SAN快照中直接复制数据文件,另一种是利用Percona XtraBackup做热备份。这2种方法都可以无侵入地实现二进制的原始数据备份(改备份可以通过启动mysqld实例检查所有的表进行验证)。
2.建议备份二进制日志,并且尽可能久地保留多份备份的数据和二进制文件,这样最近备份无法使用了,还可以使用较老的备份来执行恢复或者创建新的备库。
-------------------------------高性能mysql实战视频总结--------------------------------------------------
***学习INNODB的核心知识有哪些?
***MYSQL体系结构是怎样的?
***一条select查询语句的执行流程是怎样的?
***ARIES三原则是什么?
***redo和undo日志是什么?
undo日志用于存放数据修改被修改前的值。
redo log日志用于记录数据修改后的记录,顺序记录。
***MVCC是什么?
MVCC是一种多版本并发控制机制。
*MVCC是为了解决什么问题?
大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制。事实上,他们都和MVCC–多版本并发控制来一起使用。
大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销。
*MVCC实现
MVCC是通过保存数据在某个时间点的快照来实现的。不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制。
***事务的4个特性是什么?
***4种隔离级别以及产生的对应问题是什么?
(注意!不可重复读一般是由updata和delete产生的,而幻读是由insert产生的)
***MYSQL的锁分为哪几类?
而其中常用的INNODB引擎锁的分类又有:
***死锁的产条件和如何避免死锁?
特别注意一下关于INNODB死锁的优化:
***设计高性能的mysql表要注意什么?
1.首先设计的表要遵循3范式,它的有点缺点如下:
第一范式:原子性,每个列不能重复。
第二范式:其他列要完全依赖主键。
第三范式:其他列之间不能存在间接依赖关系。
参考:https://www.jianshu.com/p/5a8bb84289a9
2.一些需要遵循的“基本”规范是什么?
*回归存储基本职能;
*查询时,尽量单表查询;
*杜绝大事务、大sql、大批量和大字段等“性能杀手”;
3.库名、表名和字段名的命名规范是什么?
*库名:
*表名:
*字段名:
***如何创建高性能索引?
首先需要知道什么是索引,以及索引的分类?
通俗的来讲,类似书本的目录,在MYSQL里面就是INDEX,主流的索引原理是B+索引和哈希索引;
索引的分类如下:
参考文献:https://www.cnblogs.com/luyucheng/p/6289714.html
*过滤因子是什么?
过滤因子用来描述谓词的选择性,即表中满足谓词条件的记录行数所占的比例,
*基数(cardinality)是什么?
*如何看查询是否走索引?
主要看2个关键指标:key_len和Extra,如果key_len=606则完全是走索引的,在看Extra来判断是否需要where条件过滤以及是否需要排序(filesort);
*索引创建的规范是什么?
***如何提高查询优化器性能?
mysql有2种自带的优化方式ICP和MRR;
然后要讲一下MYSQL查询的2种算法,BKA和BNL;
还需要知道mysql查询的3种方式:
全表查询、索引查询和全模糊查询;
再了解2种mysql中的排序方式,
最后是实际业务中,写mysql优化语句的注意事项,
(RPC:远程过程调用(Remote Procedure Call))
拓展一下,从高层(应用层)来看优化,
***高性能(高可用)数据库架构有哪些?
在了解高性能数据库架构之前,需要先了解数据库的复制,有主从复制,双主复制和环形复制(双主复制和环形复制不做过多介绍)
mysql之间数据复制的基础是二进制日志文件,一台mysql数据库一旦启用二进制日志后,就被设置为master(主库),其所有操作都被记录在该二进制日志文件中,而其他数据库作为slave(从库),通过一个I/O线程与master保持通讯,同时监控二进制日志,如果该日志文件发生变化,则会把该变化记录到主库的中继日志中,然后slave通过I/O线程也会把该变化执行到自己的库中,从而实现主从库一致性,实现主从复制。
然后就是了解什么是高可用?
首先了解一下MTBF和MTTR,
那么高可用数据库框架就是在以上基础上搭建而成了,主流的框架分为,MMM(master-master-master)架构图如下:
以及MHA(master-high-availability),它分为2部分组成:管理节点(MHA Manager)和数据节点(MHA Node),管理节点可以单独部署到一台机器上,来管理多个master-slave集群。数据节点运行在mysql服务器上,管理节点会定时检测集群中的master节点,当该节点出现问题的时候,就能把slave节点升级为新的master节点,然后所有其他slave节点重新指向新的master节点。
以上是经典的高可用数据库框架,然而到了现在,共享数据库架构也逐渐成为了主流,比如ARKDB,阿里云、新浪云等,下面是ARKDB的架构图:
最后来看下服务端的数据库出现了问题,我们该怎么去解决,也就是故障转移和故障恢复,
***稳固的MYSQL运维体系是怎样的?
说到musql的运维,就得先了解一些关于它的几个点:服务器监控,SQL审核,备份恢复;
首先来看监控,我们需要监控服务器上的MYSQL的这些点:
一般使用一些已经开发完全的监控工具:
接下来来看mysql审核,它人工的流程如下:
然后就是备份恢复,我们需要注意的问题有:
而备份恢复的流程图是(注:MFS是一个具有容错性的网络分布式文件系统):
***如何让MYSQL具有高拓展性?
首先我们要知道拓展的目的是为了解决高并发问题:
(
QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。
TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
)
然后要知道拓展mysql的三种方式有:纵向拓展、横向拓展和分布式拓展:
然后数据分区(库内)和数据分片(库外)也能起到拓展mysql的作用: