基础篇SQL篇运维篇体系架构篇备份恢复篇高可用篇性能优化篇故障处理篇基础篇 第01关:MySQL数据库有哪些优点?1、MySQL是开源的,允许任何人去下载使用,允许任何人去研究他的源代码并可以根据自己的需要去修改他,使之满足自己的开发需求2、支持Windows,Linux,MACOS等多种操作系统,为java,python,c,c,php等多种开发语言提供了API3、即可作为一个应用程序运行在用户客户端网络环境中,也能嵌入其他软件中作为一个库4、支持多线程,充分利用CPU资源5、可以从多个角度对数据库性能进行优化,例如:充分利用索引带来的查询效率,减少IO频率;优化锁的使用,避免多线程并发下线程阻塞等待;还有缓存bufferpool等等也在优化的范围;最终就是通过提高硬件性能,提高服务器的性能指标;当数量已经不是一台服务器能够处理的时候,那就要考虑读写分离,分库分表等,从改变体系架构的角度出发了6、MySQL支持可插拔式的存储引擎模式,可以根据自己的需求选择适当的存储引擎。例如:MyISAM默认认为写比读更重要,所以MyISAM更适合于写多读少的业务环境;Memonery内存数据库,受内存大小限制,不适用于数据量的生产环境,但是查询效率高 第02关:说说三个范式?第一范式:所有的字段均不可分割,是原子的,这些字段属性只能是基本数据类型第二范式:在第一方式的基础之上,要求所有的非主键字段完全依赖于主键,不能有部份依赖第三范式:在第二范式的基础之上,要求所有的非主键字段不能存在依赖传递在设计数据库的时候必须严格遵守三范式,如果不遵守,必须有充足的理由 第03关:事务的四大特性是什么?1、Atomicity(原子性):事务由一系列SQL语句组成的逻辑单元,要么全部执行,要么全部都不执行2、Consistency(一致性):事务对数据中的修改,使数据从一种状态转换成另一种一致性状态。(可以把数据比作能量,数据同样也遵循能量守恒定理)3、Isolation(隔离性):多个事务可以并发执行,但是多个事务之间的修改操作保持一定的不可见性4、Durability(持久性):事务一旦提交,对数据的修改将永久持久化磁盘当中,即使出现宕机,断电等状况,事务对数据产生的修改也会永久生效 第04关:在Linux下安装MySQL有哪几种方式?RPM(RedhatPackageManage):安装简单,适合初学者学习使用,一台服务器只能安装一个MySQL,RedHatEnterpriseLinuxOracleLinux二进制(BinaryPackage):安装简单;可以安装到任何路径下,灵活性好;一台服务器可以安装多个MySQL,LinuxGeneric源码(SourcePackage):在实际安装的操作系统进行可根据需,要定制编译,最灵活;性能最好;服务器安装多个SourceCode1、从官网下载对应的压缩包:mysql5。7。9linuxglibc2。5x8664。tar。gz(https:downloads。mysql。comarchivescommunity)2、上传到linux服务器中并解压缩,tarzvxfmysql5。7。9linuxglibc2。5x8664。tar。gz(上传目录:usrlocal)3、修改配置文件etcmy。cnf4、创建mysql用户组和用户名:groupaddmysql,useraddrgmysql5、在目录usrlocalmysql下创建data目录6、将mysql修改为mysql所有:chownRmysql。mysqlusrlocalmysql7、初始化:mysqldinitializeusermysqlbasedirusrlocalmysqldatadirusrlocalmysqldata(保留临时密码)8、将supportfilemysql。server复制到etcinit。d目录下,》servicemysqlstart9、授权chmodR777usrlocalmysql10、使用root和临时密码登录mysql 第05关:为什么要升级MySQL8。0,升级前注意事项?为什么升级MySQL1、基于安全考虑2、基于性能和稳定性考虑:mgr复制,并行复制writeset等功能,性能提升3、新的功能:Hashjoin,窗口函数,DDL即时,json支持4、原始环境中版本太多,统一版本5、8。0版本基本已到稳定期,可以大量投入生产环境中升级前注意事项1、字符集设置:为了避免新旧对象字符集和校验规则不一致现象,在配置文件中将字符集和校验规则设置为旧版相同即可2、密码认证插件的变更:为了避免连接问题,可以仍采用5。7的mysqlnativepassword认证插件。3、是否需要手动修改系统表:在MySQL8。0。16版本之前,需要手动的执行mysqlupgrade来完成该步骤的升级,在MySQL8。0。16版本及之后是由mysqld来完成该步骤的升级4、高可用架构:需要先升级从库,再逐步升级主库 第06关:存储引擎如何选择?1、如果没有特殊需求,使用默认的Innodb就好。Innodb引擎由于其对事务的完整性参照,更高的并发能力,逐渐取代了MyISAM2、根据每个存储引擎提供的核心功能以及应用场景进行分析。存储引擎核心功能一般分为四类:支持的数据类型,锁机制,索引,事务3、MyISAM设计的初衷认为写操作比读操作更重要,更适合读写插入的应用程序,比如博客,新闻4、更新(删除)操作频率也高,或者要保证数据的完整性,并发量高,支持事务和外键。比如OA自动化办公系统,如下是InnoDB引擎的4大特点:插入缓冲自适应哈希双重写预读 第07关:事务隔离级别有哪些?读未提交:一个事务对数据的更新操作,即使该事务没有提交,其他事务也是可见的读已提交:一个事务对数据的更新操作,在事务提交之前,其他任何事务都是不可见可重复读:在一个事务中重复读取过滤条件相同的数据,得到的结果使相同的串行化:每个事务同步执行,效率低,一般不建议使用这里需要注意的是:Mysql默认采用的REPEATABLEREAD隔离级别Oracle默认采用的READCOMMITTED隔离级别SQL篇 第08关:简述以下SQL及分类结构化查询语言(StructuredQueryLanguage)简称SQL,是一种数据库查询语言。作用:用于存取数据、查询、更新和管理关系数据库系统。基本的分类如下:1。数据查询语言(DataQueryLanguage,DQL)负责进行数据查询而不会对数据本身进行修改的语句,这是最基本的SQL语句。2。数据定义语言(DataDefinitionLanguage,DDL)负责数据结构定义与数据库对象定义的语言,由CREATE、ALTER与DROP三个语法所组成3。数据操纵语言(DataManipulationLanguage,DML)负责对数据库对象运行数据访问工作的指令集,以INSERT、UPDATE、DELETE三种指令为核心,分别代表插入、更新与删除。4。数据控制语言(DataControlLanguage)它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。由GRANT和REVOKE两个指令组成 第09关:drop,delete,truncate的区别 drop,delete。truncate区别如下图所示: drop,delete。truncate区别图 第10关:MySQL中的关联查询介绍一下1。交叉连接(CROSSJOIN)2。内连接(INNERJOIN)3。外连接(LEFTJOINRIGHTJOIN)4。联合查询(UNION与UNIONALL)5。全连接(FULLJOIN)6。自连接(SelfJOIN)下图可以清晰的描述了各种关联查询结果 第11关:MySQL中in和exist的区别1、in:in首先查询子查询,然后再与外表做一次笛卡尔积,最后通过in中给定的值进行过滤,适合子查询较小的查询2、exist:首先查询外表,然后遍历外表的数据行,对比子查询中的行,是否与外表相同,如果相同则返回,适合外表较小的查询3、如果查询语句使用了notin那么内外表都进行全表扫描,没有用到索引;而notextsts的子查询依然能用到表上的索引。所以无论那个表大,用notexists都比notin要快。 第12关:基于MySQL简述以下SQL的生命周期1。应用服务器与数据库服务器建立一个连接2。数据库进程拿到请求sql3。解析并生成执行计划,执行4。读取数据到内存并进行逻辑处理5。通过步骤一的连接,发送结果到客户端6。关掉连接,释放资源运维篇 第13关:MySQL有哪些数据类型?MySQL支持多种类型,大致可以分为三类:数值、日期时间和字符串(字符)类型1。数值类型整数类型:TINYINT、SMALLINT、MEDIUMINT、INT或INTEGER、BIGINT带小数的类型:FLOAT(单精度)、DOUBLE(双精度)、DECIMAL(定点数)2日期和时间类型DATE:YYYYMMDD日期值TIME:HH:MM:SS时间值或持续时间YEAR:YYYY年份值DATETIME:YYYYMMDDHH:MM:SS混合日期和时间值TIMESTAMP:YYYYMMDDHHMMSS混合日期和时间值,时间戳3。字符串类型CHAR:定长字符串0255字节VARCHAR:065535字节变长字符串频繁改变的列建议用vachar类型BLOB:065535字节二进制形式的长文本数据,二进制大对象TEXT:065535字节长文本数据、varchar的加长增强版LONGTEXT:04294967295字节极大文本数据ENUM:12字节枚举类型(单一值)SET:18字节一个集合 第14关:MySQL约束有哪几种约束?NOTNULL:用于控制字段的内容一定不能为空(NULL)。UNIQUE:控件字段内容不能重复,一个表允许有多个Unique约束。PRIMARYKEY:也是用于控件字段内容不能重复,但它在一个表只允许出现一个。FOREIGNKEY:用于预防破坏表之间连接的动作,也能防止非法数据插入外键列,因为它必须是它指向的那个表中的值之一。CHECK:用于控制字段的值范围。 第15关:索引的设计原则?1、适合索引的列应该是出现子where子句或者在联合查询中指定的列2、基数较小的列做索引意义不大3、数据类型较大的列不适合做索引,如果数据类型较大应该使用前缀4、经常更新的字段不适合作为索引列,对标数据的修改同时也要修改索引 第16关:请简述以下存储过程及其优点1、存储过程:存储过程是一组为了完成特定功能的SQL语句集,编译后保存在数据库中,用户需要使用的时候直接调用即可2、存储过程的优点a。增强了SQL语句的灵活性b。固定的业务模块化封装,较少开发重复性c。执行速度很快d。存储过程被做为一种安全机制,充分的得到了利用 第17关:MySQL如何使用定时任务(event)?事件(event)是MySQL在相应的时刻调用的过程式数据库对象。一个事件可调用一次,也可周期性的启动,它由一个特定的线程来管理的,也就是所谓的事件调度器。事件和触发器类似,都是在某些事情发生的时候启动。事件是根据调度事件来启动的,事件取代了原先只能由操作系统的计划任务来执行的工作,而且MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精确到每分钟执行一次。定时任务的使用SHOWVARIABLESLIKE‘eventsche’;开起定时任务SETGLOBALeventscheduler1;关闭定时任务SETGLOBALeventscheduler0;如果需要长期开起定时任务需要在my。ini中配置eventscheduleron这里设置的就是从202208040300:10:00开始每1天执行一次。创建定时任务的SQL语句如下。CREATEEVENTUntitledONSCHEDULEEVERY‘1’DAYSTARTS‘202208040300:10:00’INTERVAL‘2’SECONDDOselectfrommysql。体系架构篇 第18关:请简述下MySQL体系机构MySQL由数据库和数据库实例组成,是单进程多线程架构1。数据库:物理操作系统文件或者其它文件的集合,在mysql中,数据库文件可以是frm、myd、myi、ibd等结尾的文件,当使用bdb存储引擎时候,不是os文件,是存放于内存中的文件。2。数据库实例:由数据库后台进程线程以及一个共享内存区组成,共享内存可以被运行的后台进程线程所共享。 第19关:MySQL参数文件位置及如何配置Linux默认的参数文件为etcmy。cnf,但是也不排除其他位置,在mysqld启动的时候,可以加上defaultsfile参数,该参数指定了参数文件的名称。〔rootjeames〕mysqlhelpgrep‘my。cnf’etcmy。cnfetcmysqlmy。cnfusrlocalmysqletcmy。cnf。my。cnf参数文件内容Windows系统配置:〔mysqld〕port3306basedirE:mysql8。0。26winx64datadirE:mysql8。0。26winx64data80263307maxconnections200maxconnecterrors10charactersetserverutf8mb4defaultstorageengineINNODBdefaultauthenticationpluginmysqlnativepasswordLinux系统配置:〔mysqld〕mysqldusrlocalmysql80mysql8019binmysqldsafemysqladminusrlocalmysql80mysql8019binmysqladminport3509basedirusrlocalmysql80mysql8019datadirusrlocalmysql80mysql8019datasocketusrlocalmysql80mysql8019datamysqls80193509。sockdefaultauthenticationpluginmysqlnativepasswordserverid80193509logbindefaulttimezone‘8:00’logtimestampsSYSTEMskipnameresolvecharactersetserverutf8mb4 第20关:MySQL参数持久化是什么?MySQL的动态参数可以在运行时通过SETGLOBAL命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。在MySQL8。0之前参数文件的动态修改不能写到配置文件,为了改善这一问题MySQL8。0支持了动态修改参数并将其保存到一个新的参数文件文件中mysqldauto。cnf,默认在datadir目录下,在所有的参数之后启动,权限为SYSTEMVARIABLESADMINorSUPER。mysqlsetpersistmaxconnections300;数据字典查询mysqlSELECTFROMperformanceschema。持久化清除:对于已经持久化了变量,可通过resetpersist命令清除掉,注意,其只是清空mysqldauto。cnf和performanceschema。persistedvariables中的内容MySQL会将该命令的配置保存到数据目录下的mysqldauto。cnf文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。不建议手动修改该文件,因为其内容是json格式的,其有可能导致数据库在启动过程中因解析错误而失败,有些参数不支持持久化的。非持久化:Nonpersistent持久化:PERSIST只读持久化:PERSISTONLY 第21关:socket是什么,如何用socket登录?Linux系统下本地连接mysql可以采用linux域套接字socket方式,需要一个套接字socket发文件,可以由参数socket控制,一般默认在tmp目录下,也可以通过如下方式查看〔rootjeames〕psefgrepmysqlmysqlshowvariableslike‘socket’;如果socket录文件丢失,那么会导致不能从本地登录mysql,可以通过重启的方式来重新生成。mysql。sock是mysql的主机和客户机在同一host上的时候,使用unixdomainsocket做为通讯协议的载体,它比tcp快。对mysql。sock来说,其作用是程序与mysqlserver处于同一台机器,发起本地连接时可用。〔rootjeames〕mysqlurootpStmpmysql。sock 第22关:MySQL表文件结构有哪些?InnoDB中用于存储数据的文件总共有两个部分,一是系统表空间文件,包括ibdata1、ibdata2等文件,其中存储了InnoDB系统信息和元数据,是所有表公用的,另一个是。idb文件,是每张表独有的。。ibd文件就是每一个表独有的表空间,文件存储了当前表的数据,索引数据和插入缓冲等信息innodb包括ibd和frm,当你启用了innodbfilepertable,表被存储在他们自己的表空间里 第23关:错误日志如何配置?错误ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a对mysql的启动、运行、关闭过程进行了记录,MySQLDBA在遇到问题时候,第一时间应该查看这个错误ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件,该文件不但记录了出错信息,还记录了一些警告信息以及正确信息,这个errorahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件类似于oracle的alert文件。可以通过showvariableslike‘logerror’;命令查看错误ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a的路径【配置方法】默认是启动的,一般以err做后缀名,需要在参数文件中配置先找到参数文件logerrorusrlocalmysqldataerror。err 第24关:慢查询日志如何配置?当查询超过一定时间没有返回结果的时候,才会记录进慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a。慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a可以帮助DBA找出执行效率缓慢的SQ语句,为数据库优化工作提供帮助。慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a默认是不开启的,建议开启慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a。当需要进行采样分析时手工开启。【慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a开启】关于慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a,主要涉及到下面几个参数:slowquerylog:是否开启慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a功能(必填)slowquerylogfile:慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件及位置longquerytime:超过设定值,将被视作慢查询,并记录至慢查询ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件中(必填)也就是说,只有满足以上三个条件,慢查询功能才可能正确开启。参数文件修改如下:修改配置文件my。cnf,在〔mysqld〕下的下方加入〔mysqld〕slowquerylogONslowquerylogfileusrlocalmysqldataslow。loglongquerytime1重启MySQL服务servicemysqldrestart即可 第25关:redo和binlog有什么区别?所有的数据库都是ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a先行,先写ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a,再写数据文件,所以才会有redolog的规则。为了保证事务的持久性,mysql的InnoDB采用了WAL技术,WAL的全称是WriteAheadLogging1。RedoLog:RedoLog是InnoDB存储引擎提供的一种物理ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a结构,用来描述对底层数据页操作的具体内容,记录物理页的修改,主要用于实现崩溃恢复(crashrecover),并提升磁盘操作效率。2。Binlog:Binlog是MySQLServer本身提供的一种逻辑ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a,和具体存储引擎无关,描述的是数据库所执行的SQL语句或数据变更情况,主要用于数据复制和增量恢复。备份和恢复篇 第26关:MySQL备份方式有哪些?1、根据是否需要数据库离线冷备(coldbackup):需要关mysql服务,读写请求均不允许状态下进行;温备(warmbackup):服务在线,但仅支持读请求,不允许写请求;热备(hotbackup):备份的同时,业务不受影响。2、根据要备份的数据集合的范围完全备份:fullbackup,备份全部字符集。增量备份:incrementalbackup上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。差异备份:differentialbackup上次完全备份以来改变了的数据。建议的恢复策略:完全增量二进制ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a完全差异二进制ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a??? 第27关:MySQL备份计划如何指定?视库的大小来定,一般来说100G内的库,可以考虑使用mysqldump来做,因为mysqldump更加轻巧灵活,备份时间选在业务低峰期,可以每天进行都进行全量备份(mysqldump备份出来的文件比较小,压缩之后更小)。100G以上的库,可以考虑用xtranbackup来做,备份速度明显要比mysqldump要快。一般是选择一周一个全备,其余每天进行增量备份,备份时间为业务低峰期。 第28关:备份恢复失败如何处理?首先在恢复之前就应该做足准备工作,避免恢复的时候出错。比如说备份之后的有效性检查、权限检查、空间检查等。如果万一报错,再根据报错的提示来进行相应的调整。 第29关:数据表损坏修复的方式有哪些?使用myisamchk来修复,具体步骤:1)修复前将mysql服务停止。2)打开命令行方式,然后进入到mysql的bin目录。3)执行myisamchkrecover数据库所在路径。MYI使用repairtable或者OPTIMIZEtable命令来修复,REPAIRTABLEtablename修复表OPTIMIZETABLEtablename优化表REPAIRTABLE用于修复被破坏的表。OPTIMIZETABLE用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并没有立即被回收,使用了OPTIMIZETABLE命令后这些空间将被回收,并且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)高可用篇 第30关:主从复制的作用及解决的问题是什么?1。主从复制的作用主数据库出现问题,可以切换到从数据库。可以进行数据库层面的读写分离。可以在从数据库上进行日常备份。2。解决的问题数据分布:随意开始或停止复制,并在不同地理位置分布数据备份负载均衡:降低单个服务器的压力高可用和故障切换:帮助应用程序避免单点失败升级测试:可以用更高版本的MySQL作为从库 第31关:读写分离有哪些方案?读写分离是依赖于主从复制,而主从复制又是为读写分离服务的。方案一使用mysqlproxy代理优点:直接实现读写分离和负载均衡,不用修改代码,master和slave用一样的帐号,mysql官方不建议实际生产中使用缺点:降低性能,不支持事务方案二使用AbstractRoutingDataSourceaopannotation在dao层决定数据源。如果采用了mybatis,可以将读写分离放在ORM层,比如mybatis可以通过mybatisplugin拦截sql语句,所有的insertupdatedelete都访问master库,所有的select都访问salve库,这样对于dao层都是透明。plugin实现时可以通过注解或者分析语句是读写方法来选定主从库。不过这样依然有一个问题,也就是不支持事务,所以我们还需要重写一下DataSourceTransactionManager,将readonly的事务扔进读库,其余的有读有写的扔进写库。方案三使用AbstractRoutingDataSourceaopannotation在service层决定数据源,可以支持事务。缺点:类内部方法通过this。xx()方式相互调用时,aop不会进行拦截,需进行特殊处理。 第32关:什么是MySQL的GTID?GTID(GlobalTransactionID,全局事务ID)是全局事务标识符,是一个已提交事务的编号,并且是一个全局唯一的编号。GTID是从MySQL5。6版本开始在主从复制方面推出的重量级特性。GTID实际上是由UUIDTID组成的。其中UUID是一个MySQL实例的唯一标识。GTID代表了该实例上已经提交的事务数量,并且随着事务提交单调递增。GTID有如下几点作用:根据GTID可以知道事务最初是在哪个实例上提交的。GTID的存在方便了Replication的Failover。因为不用像传统模式复制那样去找masterlogfile和masterlogpos。基于GTID搭建主从复制更加简单,确保每个事务只会被执行一次。 第33关:分库分表和表分区的区别?表分区(Partitioning)可以将一张表的数据分别存储为多个文件。如果在写SQL的时候,遵从了分区规则,那么就能把原本需要遍历全表的工作转变为只需要遍历表里某一个或某些分区的工作。这样降低了查询对服务器的压力,提升了查询效率。如果分区表使用得当,那么也可以大规模地提升MySQL的服务能力。但是这种分区方式,一方面,在使用的时候必须遵从分区规则写SQL语句,如果不符合分区规则,那么性能反而会非常低下;另一方面,分区的结果受到MySQL实例,或者说MySQL单实例的数据文件无法分布式存储的限制,不管怎么分区,所有的数据还是都在一个服务器上,没办法通过水平扩展物理服务的方法把压力分摊出去。分表与分区的区别在于:分区一般都是放在单机里的,从逻辑上来讲只有一张表,是MySQL的一种内部实现;而分表则是将一张表分解成多张表,分库分表需要代码实现。分库分表和分区并不冲突,可以结合使用。 第34关:简述一下MySQL数据库常用的数据库中间件1。Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000个MySQL数据库的schema,集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。2。Mycat是开源社区在阿里Cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。3。OneProxy基于MySQL官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件。舍弃了一些功能,专注在性能和稳定性上。4。kingshard由小团队用go语言开发,还需要发展,需要不断完善。5。Vitess是Youtube生产在使用,架构很复杂。不支持MySQL原生协议,使用需要大量改造成本。6。Atlas是360团队基于MySQLproxy改写,功能还需完善,高并发下不稳定。7。MaxScale是mariadb(MySQL原作者维护的一个版本)研发的中间件。8。MySQLRoute是MySQL官方Oracle公司发布的中间件。 第35关:分库分表标准及类型是什么?1。标准:存储占用100G数据增量每天200w单表条数1亿条2。类型:分库:垂直分库、水平分库分表:垂直分表、水平分表分库是指把一个数据库拆分为多个数据库,一般分为垂直分库和水平分库。分表指的是通过一定规则,将一张表分解成多张不同的表,一般分为垂直分表和水平分表。性能优化篇 第36关:主键使用自增ID还是UUID?推荐使用自增ID,不要使用UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。总之,在数据量大一些的情况下,用自增主键性能会好一些。关于主键是聚簇索引,如果没有主键,InnoDB会选择一个唯一键来作为聚簇索引,如果没有唯一键,会生成一个隐式的主键 第37关:如何优化子查询?1。用关联查询替代2。优化GROUPBY和DISTINCT这两种查询据可以使用索引来优化,是最有效的优化方法3。关联查询中,使用标识列分组的效率更高如果不需要ORDERBY,进行GROUPBY时加ORDERBYNULL,MySQL不会再进行文件排序。4。WITHROLLUP超级聚合,可以挪到应用程序处理 第38关:对慢查询都怎么优化?1、首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。2、分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。3、如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表 第39关:执行计划Explain中常用的查询方式都有哪一些?最为常见的扫描方式有:system:系统表,少量数据,往往不需要进行磁盘IO;const:常量连接;eqref:主键索引(primarykey)或者非空唯一索引(uniquenotnull)等值扫描;ref:非主键非唯一索引等值扫描;range:范围扫描;index:索引树扫描;ALL:全表扫描(fulltablescan);上面各类扫描方式由快到慢:systemconsteqrefrefrangeindexALL故障处理篇 第40关:MySQLroot密码忘记了怎么办?在MySQL中,若密码丢失则无法直接找回,只能通过特殊方式来修改密码。1。Linux环境步骤1:先停止MySQL服务步骤2:启动MySQL服务mysqldsafedefaultsfileetcmy。cnfskipgranttables2。Windows环境若MySQL是8。0且安装在Windows上,则需要加上sharedmemory参数:G:mysql8。0。23winx64binmysqlddatadirG:mysql8。0。23winx64data80323308consoleskipgranttablessharedmemory然后再开一个窗口,执行下面命令cdG:mysql8。0。23winx64bin注意,此时可以以任意一个密码登陆也可以以一个空密码登陆MySQL,登陆之后你就可以修改你的root密码喽 第41关:MySQL服务器Binlog导致磁盘塞满怎么办?1、定时自动清理Binlogahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志amysqlshowvariableslike‘expirelogsdays’;mysql5。7mysqlshowvariableslike‘binlogexpirelogsseconds’mysql8。0mysql8。0处理方式mysql8开始expirelogsdays废弃启用binlogexpirelogsseconds设置binlog自动清除ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a时间保存时间以秒为单位;默认259200030天144004小时;864001天;2592003天;mysqlsetglobalbinlogexpirelogsseconds86400;mysql5。7处理方式这个默认是0,也就是logs不过期,可通过设置全局的参数,使他临时生效:mysqlsetglobalexpirelogsdays10;2、手动删除Binlogahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a第一步:登陆进入mysql,并使用查看ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件。第二步:查看正在使用的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件:当前正在使用的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件是mysqlhost01bin。000010,那么删除ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件的时候应该排除掉该文件。删除ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件的命令:purgebinarylogsto‘mysqlhost01bin。000010’;mysqlpurgebinarylogsto‘mysqlhost01bin。000010’;删除除mysqlhost01bin。000010以外的ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a文件也可以指定其他文件名,例如mysqlbin。000003。删除后就能释放大部分空间。 第42关:MySQL无法创建函数怎么办?出现ERROR1418(HY000):ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQL报错mysql的设置默认是不允许创建函数1、更改全局配置SETGLOBALlogbintrustfunctioncreators1;2、更改配置文件my。cnf,重启服务生效logbintrustfunctioncreators1;mysqlshowvariableslike‘logbintrustfunctioncreators’;