高性能MySQL笔记超详细

一、MySQL架构与历史A.并发控制1.共享锁(sharedlock,读锁):共享的,相互不阻塞的2.排他锁(exclusivelock,写锁):排他的,一个写锁会阻塞其他的写锁和读锁B.事务1.事务ACID

2.四种隔离级别

2.测试何种指标:

C.基准测试方法1.需要避免的一些常见错误:

2.单组件式测试工具

2.PHP性能剖析工具:NewRelic、xhprof、IfpC.剖析MySQL查询1.剖析服务器负载

2.剖析单条查询:

D.诊断间歇性问题1.尽量不要用试错的方式来解决问题,如果一时无法定位,可能是测量的方式不正确,或者测量的点选择有误,或者使用的工具不合适2.确定单条查询问题还是服务器问题

3.捕获诊断数据

E.其他剖析工具1.使用USER_STATISTICS表2.使用strace,可以调查系统调用的情况四、Schema与数据类型优化A.选择优化的数据类型1.数据类型的选择原则:

2.应该尽量只在对小数进行精确计算时才使用DECIMAL,使用int类型通过程序控制单位效果更好3.使用VARCHAR合适的情况:字符串列的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储4.CHAR适合存储很短的字符串,或者所有值都接近同一个长度;不容易产生碎片,在存储空间上更有效率5.通常应该尽量使用TIMESTAMP,它比DATETIME空间效率更高B.MySQLschema设计中的陷阱1.不好的设计:

C.范式和反范式1.范式的优点:

2.范式化设计的缺点是通常需要关联3.反范式的优点:避免关联,避免了随机I/O,能使用更有效的索引策略D.缓存表和汇总表1.有时提升性能最好的方法是同一张表中保存衍生的冗余数据,有时也需要创建一张完全独立的汇总表或缓存表2.物化视图,MySQL并不原生支持,Flexviews3.如果应用在表中保存计数器,则在更新计数器时可能踫到并发问题,创建一张独立的表存储计数器,可以帮助避免缓存失效

E.加快ALTERTABLE操作的速度1.两种方式:

2.快速创建MyISAM索引,先禁用索引,导入数据,然后重新启用索引五、创建高性能的索引A.索引基础1.索引可以包含一个或多个列的值,如果索引包含多个列,那么列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列2.ORM工具能够产生符合逻辑的、合法的查询,除非只是生成非常基本的查询,否则它很难生成适合索引的查询3.在MySQL中,索引是在存储引擎层而不是服务器层实现的,所以,并没有统一的索引标准:不同存储引擎的索引的工作方式并不一样,也不是所有的存储引擎都支持所有类型的索引4.B-Tree意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同,能够加快访问数据的速度,从索引的根节点开始进行搜索,适用于全键值、键值范围或键前缀查找

5.B-Tree索引的限制:

6.哈希索引(hashindex)基于哈希表实现,只有精确匹配索引所有列的查询才有效,只有Memory引擎显式支持哈希索引7.哈希索引的限制:

8.空间数据索引(R-Tree),MyISAM表支持空间索引,可以用作地理数据存储,开源数据库系统中对GIS的解决方案做得比较好的是PostgreSQL的PostGIS9.全文索引,适用于MATCHAGAINST操作,而不是普通的WHERE条件操作B.索引的优点1.三个优点:

2.索引三星系统:

C.高性能的索引策略1.独立的列:如果查询中的列不是独立的,则MySQL不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数2.前缀索引和索引选择性

3.选择合适的索引列顺序

4.聚簇索引:并不是一种单独的索引类型,而是一种数据存储方式

5.覆盖索引:如果一个索引包含(或者说覆盖)所有需要查询的字段的值,就称为覆盖索引

6.如果EXPLAIN出来的type列的值为“index”,则说明MySQL使用了索引扫描来做排序7.压缩(前缀)索引,默认只压缩字符串,减少索引大小,对于CPU密集型应用,因为扫描需要随机查找,压缩索引在MyISAM上要慢好几倍8.重复索引是指在相同的列上按照相同的顺序创建的相同类型的索引,应该避免这样创建重复索引9.索引可以让查询锁定更少的行D.维护索引和表1.CHECKTABLE检查表是否损坏,ALTERTABLEinnodb_tb1ENGINE=INNODB;修复表2.records_in_range()通过向存储引擎传入两个边界值获取在这个范围大概有多少条记录,对于innodb不精确3.info()返回各种类型的数据,包括索引的基数4.可以使用SHOWINDEXFROM命令来查看索引的基数5.B-Tree索引可能会碎片化,这会降低查询的效率六、查询性能优化A.为什么查询速度会慢1.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快2.查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端B.慢查询基础:优化数据访问1.两个分析步骤:

2.是否向数据库请求了不需要的数据

3.MySQL是否在扫描额外的记录

C.重构查询的方式1.MySQL从设计上让连接和断开连接都很轻量级,在返回一个小的查询结果方面很高效2.切分查询,将大查询切分成小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分查询结果,可以避免锁住很多数据、占满事务日志、耗尽系统资源、阻塞很多小的但重要的查询3.分解关联查询优势:

4.分解关联查询的场景:

D.查询执行的基础1.查询执行路径

2.MySQL客户端和服务器之间的通信协议是“半双工”的,无法将一个消息切成小块独立来发送,没法进行流量控制,一旦一端开始发生消息,另一端要接收完整个消息才能响应它3.MySQL通常需要等所有的数据都已经发送给客户端才能释放这条查询所占用的资源,所以接收全部结果并缓存通常可以减少服务器的压力4.查询状态,SHOWFULLPROCESSLIST命令查看:

5.语法解析器和预处理,通过关键字将SQL语句进行解析,并生成一棵对应的“解析树”,解析器将使用MySQL语法规则验证和解析查询,预处理器则根据一些MySQL规则进一步检查解析树是否合法6.查询优化器,找到最好的执行计划,使用基本成本的优化器,将尝试预测一个查询使用某种执行计划时的成本,并选择其中成本最小的一个,使用SHOWSTATUSLIKE'Last_query_cost';查看需要多少个数据页的随机查找7.导致MySQL查询优化器选择错误的原因:

8.MySQL能处理的优化类型:

G.优化特定类型的查询1.优化COUNT()查询

2.优化关联查询

3.优化子查询:尽可能使用关联查询代替,如果使用MySQL5.6以上或MariaDB则可以忽略这个建议4.优化GROUPBY和DISTINCT

5.优化LIMIT分页

6.优化UNION查询

七、MySQL高级特性A.分区表1.对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成,实际上是对一组底层表的句柄对象(HandlerObject)的封装2.适用场景:

3.使用限制:

4.使用分区表

5.保证大数据量的可扩展性两个策略:

6.分区策略的问题:

7.查询优化

3.存储代码的缺点:

4.存储过程和函数的限制:

5.触发器:可以让你在执行INSERT、UPDATE或者DELETE的时候,执行一些特定的操作,可以在MySQL中指定是在SQL语句执行前触发还是在执行后触发,可以使用触发器实现一些强制限制,或者某些业务逻辑,否则,就需要在应用程序中实现这些逻辑6.触发器的注意和限制:

7.触发器的用处:

3.绑定变量相对也更安全。无须在应用程序中处理转义,一则更简单了,二则也大大减少了SQL注入和攻击的风险4.最主要的用途就是在存储过程中使用,构建并执行“动态”的SQL语句5.绑定变量的限制:

I.字符集和校对1.字符集是一种从二进制编码到某类字符符号的映射,可以参考如何使用一个字节来表示英文字母。“校对”是指一组用于某个字符集的排序规则2.每种字符集都可能有多种校对规则,并且都有一个默认的校对规则,每个校对规则都是针对某个特定的字符集的,和其他的字符集没有关系3.MySQL有很多的选项用于控制字符集,这些选项和字符集很容易混淆,只有基于字符的值才真正的“有”字符集的概念4.MySQL的两类设置:创建对象时的默认设置、服务器和客户端通信时的设置5.如果比较的两个字符串的字符集不同,MySQL会先将其转成同一个字符集再进行比较6.一些需要注意的地方:

7.某些字符集和校对规则可能会需要更多的CPU操作,可能会消耗更多的内存和存储空间,甚至还会影响索引的正常使用

7.全文索引的配置和优化:

6.对于需要消耗大量资源的查询通常都是非常适合缓存的7.缓存未命中:

8.缓存参数配置:

9.InnoDB和查询缓存

10.通用查询缓存优化:

八、优化服务器设置A.MySQL配置的工作原理1.任何打算长期使用的设置都应该写到全局配置文件,而不是在命令行特别指定2.常用变量和动态修改它们的效果:

3.MySQL保持一个连接(线程)只需要少量的内存,它还需要一个基本量的内存来执行任何给定查询,需要为高峰时期执行的大量查询预留好足够的内存,否则,查询执行可能因为缺乏内存而导致执行效率不佳或执行失败4.跟查询一样,操作系统也需要保留足够的内存给它工作,如果没有虚拟内存正在交换(Paging)到磁盘,就是表明操作系统内存足够的最佳迹象5.如果服务器只运行MySQL,所有不需要为操作系统以及查询处理保留的内存都可以用作MySQL缓存6.大部分情况下最重要的缓存:

2.MyISAM的I/O配置

F.配置MySQL并发1.InnoDB并发配置

2.MyISAM并发配置

G.基于工作负载的配置1.当服务器满载情况下运行时,请尝试记录所有的查询语句,因为这是最好的方式来查看哪种类型的查询语句占用资源最多,同时创建processlist快照,通过state或者command字段来聚合它们2.优化BLOB和TEXT场景

2.闪存的最重要特征是可以迅速完成多次小单位读取,但是写入更有挑战性。闪存不能在没有做擦除操作前改写一个单元(Cell),并且一次必须擦除一个大块。擦除周期是缓慢的,并且最终会磨损整个块3.垃圾收集对理解闪存很重要。为了保持一些块是干净的并且可以被写入,设备需要回收脏块。这需要设备上有一些空闲空间4.许多设备被填满后会开始变慢,速度下降是由于没有空闲块时必须等待擦写完成所造成的5.固态存储最适合使用在任何有着大量随机I/O工作负载的场景下,随机I/O通常是由于数据大于服务器的内存导致的,闪存设备可能大大缓解这种问题6.单线程工作负载也是另一个闪存的潜在应用场景7.闪存也可以为服务器整合提供巨大的帮助8.Flashcache,磁盘和内存技术的结合,适合以读为主的I/O密集型负载,并且工作集太大,用内存优化并不经济的情况9.优化固态存储上的MySQL

E.为备库选择硬件1.通常需要跟主库差不多的配置F.RAID性能优化1.RAID可以帮助做冗余、扩展存储容量、缓存,以及加速2.RAID0:如果只是简单的评估成本和性能,是成本最低和性能最高的RAID配置3.RAID1:在很多情况下提供很好的读性能,并且在不同的磁盘间冗余数据,所以有很好的冗余性,非常适合用来存放日志或者类似的工作4.RAID5:通过分布奇偶校验把数据分散到多个磁盘,如果任何一个盘的数据失效,都可以从奇偶校验块中重建,但如果有两个磁盘失效了,则整个卷的数据无法恢复,最经济的冗余配置。随机写是昂贵的,存放数据或者日志是一种可接受的选择,或者是以读为主的业务5.RAID10:对数据存储是个非常好的选择,由分片的镜像组成,对读和写都有良好的扩展性6.RAID50:由条带化的RAID5组成G.SAN和NAS1.SAN(StorageAreaNetwork)和NAS(Network-AttachedStorage)是两个外部文件存储设备加载到服务器的方法,访问SAN设备时通过块接口,NAS设备通过基于文件的协议来访问2.SAN允许服务器访问非常大量的硬盘驱动器,并且通常配置大容量智能高速缓存来缓冲写入3.哪些工作放在SAN上不合适:执行大量的随机I/O的单线程任务4.SAN的应用:

2.iostat

3.CPU密集型的机器,vmstat输出通常在us列会有一个很高的值,也可能在sy列有很高的值4.I/O密集型工作负载下,vmstat会显示很多处理器在非中断休眠(b列)状态,并且wa这一列的值很高5.发生内存交换的机器可能在swpd列有一个很高的值十、复制A.复制概述1.MySQL支持两种复制方式:基于行的复制和基于语句的复制,都是通过在主库上记录二进制日志、在备库重放日志的方式来实现异步的数据复制2.复制通常不会增加主库的开销,主要是启用二进制日志带来的开销,但出于备份或及时从崩溃中恢复的目的,这点开销也是必要的3.通过复制可以将读操作指向备库来获得更好的读扩展,但对于写操作,除非设计得当,否则并不适合通过写复制来扩展写操作4.复制解决的问题:

5.复制如何工作

B.配置复制1.在每台服务器上创建复制账号

2.配置主库和备库

3.通知备库连接到主库并从主库复制数据4.推荐的复制配置

C.复制的原理1.基于语句的复制

2.基于行的复制

3.基于行或基于语句:哪种更优

4.复制文件

5.发送复制事件到其他备库:log_slave_updates,可以让备库变成其他服务器的主库6.复制过滤选项

D.复制拓扑1.基本原则:

2.一主库多备库3.主动-主动模式下的主主复制:auto_increment_increment和auto_increment_offset可以让MySQL自动为INSERT语句选择不互相冲突的值4.主动-被动模式下的主主复制:其中一台服务器是只读的被动服务器5.拥有备库的主主结构:增加了冗余,能够消除站点单点失效的问题6.环形复制:每个服务器都是在它之前的服务器的备库,是在它之后的服务器的主库7.分发主库事实上也是一个备库,提取和提供主库的二进制日志8.树或金字塔形:减轻了主库的负担,但中间层出现的任何错误都会影响到多个服务器9.定制的复制方案

E.复制和容量规划1.写操作通常是复制的瓶颈,并且很难使用复制来扩展写操作2.在构建一个大型应用时,有意让服务器不被充分使用,这应该是一种聪明并且蔓延的方式,尤其在使用复制的时候,有多余容量的服务器可以更好地处理负载尖峰,也有更多能力处理慢速查询和维护工作,并且能够更好地跟上复制F.复制管理和维护1.在主库上,可以使用SHOWMASTERSTATUS命令来查看当前主库的二进制日志位置和配置2.从库上,使用SHOWSLAVESTATUS十一、可扩展的MySQLA.什么是可扩展性1.可扩展性表明了当需要增加资源以执行更多工作时系统能够获得划算的等同提升(equalbangforthebuck)的能力,缺乏扩展能力的系统在达到收益递减的转折点后,将无法进一步增长2.可扩展性就是能够通过增加资源来提升容量的能力B.扩展MySQL1.规划可扩展性最困难的部分是估算需要承担的负载到底有多少,还需要大致正确地估计日程表,需要知道底线在哪里2.可以做的准备工作:优化性能、购买性能更强的硬件3.向上扩展(垂直扩展)意味着购买更多性能强悍的硬件4.向外扩展(横向扩展、水平扩展):复制、拆分、数据分片

5.通过多实例扩展6.通过集群扩展

7.向内扩展,对不再需要的数据进行归档和清理8.保持活跃数据独立C.负载均衡1.在一个服务器集群中尽可能地平均负载量,通常在服务器前端设置一个负载均衡器十二、高可用性A.什么是高可用性1.高可用性不是绝对的,只有相对更高的可用性,100%的可用性是不可能达到的2.可用性每提高一点,所花费的成本都会远超之前,可用性的效果和开销的比例并不是线性的B.导致宕机的原因1.运行环境问题,最普遍的问题是磁盘空间耗尽2.性能问题,最普遍的原因是运行很糟糕的SQL,或服务器BUG或错误的行为3.糟糕的Schema和索引设计4.复制问题通常由于主备数据不一致导致5.数据丢失通常由于DROPTABLE的误操作导致,并总是伴随着缺少可用备份的问题C.如何实现高可用性1.可以通过同时进行以下两步来获得高可用性

D.避免单点失效1.系统中任何不冗余的部分都是一个可能失效的单点2.可以采用两种方法来为系统增加冗余:增加空余容量和重复组件3.共享存储或磁盘复制

4.MySQL同步复制

5.基于复制的冗余

2.缺点:

C.缓存1.被动缓存除了存储和返回数据外不做任何事情;主动缓存在访问未命中时做一些额外工作2.应用可以缓存部分计算结果,所以应用层缓存可能比更低层次的缓存更有效,可以节省两方面的工作:获取数据以及基于这些数据进行计算,重点是缓存命中率可能更低,并且可能使用较多的内存3.应用层缓存:

4.缓存控制策略

5.可以在后台预先请求一些页面,并将结果存为静态页面,好处:

4.逻辑备份的缺点:

5.物理备份优点:

6.物理备份缺点:

7.除非经过测试,不要假定备份是正常的8.建议混合使用物理和逻辑两种方式来做备份9.MySQL备份需要考虑的几点:

10.差异备份是对自上次全备份后所有改变的部分做备份,而增量备份则是自从任意类型的上次备份后所有修改做的备份11.差异、增量备份的建议:

2.文件系统快照*支持快照的文件系统和设备包括FreeBSD的文件系统、ZFS文件系统、GNU/Linux的逻辑卷管理(LVM),以及许多的SAN系统和文件存储解决方案F.从备份中恢复1.恢复步骤:

G.备份和恢复工具1.MySQLEnterpriseBackup2.PerconaXtraBackup3.mylvmbackup4.ZmandaRecoveryManager5.mydunper6.mysqldump十六、MySQL用户工具A.接口工具1.MySQLWorkbench2.SQLyog3.phpMyAdmin4.AdminerB.命令行工具集1.PerconaToolkit2.MaatkitandAspersa3.Theopenarkkit4.MySqlworkbenchC.SQL实用集1.common_schema2.mysql-sr-lib3.MySQLUDF仓库4.MySQLForgeD.监测工具1.开源的监控工具

THE END
1.固态硬盘的数据加密密钥获取恢复方法和数据读写方法与流程根据获取的所述数据加密密钥dek对写入的数据进行加密,或者,对读取的加密数据进行解密。 [0033] 本申请实施例还提供了一种固态硬盘的数据加密密钥恢复方法,所述方法可以包括: [0034] 在确定所述固态硬盘内放入主控芯片后,重新生成固态硬盘的主控芯片管理密钥; ...https://www.xjishu.com/zhuanli/55/202011460780.html
2.EVS存储设备硬盘状态分析%rrqm和%wrqm:这两个参数分别表示合并读取和写入请求的百分比,如果数值异常高或持续增加,可能表明磁盘存在请求合并问题。 原因分析: sds硬盘性能不足导致存储设备异常报警 解决方案: 更换硬盘 问题与总结: 通过分析硬盘的健康状态和性能可分析查看出硬盘的使用情况,进一步快速确定问题原因...https://support.dahuatech.com/dataSectionDetail/bf45f7bdeea1476aba390320672ab46e
1.磁盘指标OS 磁盘写入操作次数/秒:每秒在 OS 磁盘中写入的输出操作的次数。 数据磁盘延迟(预览版):监视数据磁盘期间完成 IO 的平均时间。 值以毫秒为单位。 数据磁盘队列深度:当前未完成的等待在数据磁盘中读取或写入的 IO 请求数。 数据磁盘读取字节数/秒:每秒从数据磁盘中读取的字节数。 如果启用了只读或读/写磁盘缓存...https://docs.microsoft.com/zh-cn/azure/virtual-machines/disks-metrics?view=vs-2017
2.磁盘处理读取或写入请求的时间百分比为100.使用过程中特别卡...bois恢复出厂默认,如果你的PE是老版本的,要把硬盘接口改成Controller或IDE,要是WIN7的PE,就改成AHIC,...https://ask.zol.com.cn/x/4169793.html
3.监控显示硬盘数据库发生错误数据库可能已损坏建议备份硬盘录像...磁盘 监视cpu: %processor time :cup执行进程所有的时间,如果值持续在80%-90%的状态,可能表明需要升级cpu或需要增加更多的处理器 %user time :处理器执行用户进程所用的时间的百分比,该指标数应当尽量低 %privileged time:处理器炒作系统的内核命令(如sqlserver i/o请求)所用的时间百分比,该值尽可能低 ...https://blog.51cto.com/u_16099211/12606873
4.Iometer存储测试工具参数说明图形主界面(整理)当前测试规则的读取/写入比率,比如66%读取的同时34%为写入,打个比方,我们的操作系统运行时在读取的时候,后台也在写入。 4)Percent Random/Sequential Distribution (测试请求的随机/持续比例) 随机和持续占的百分比,比如测4KB随机80%的同时测4KB持续20%。 https://www.jianshu.com/p/8d76de1679de
5.Oppo百万级高并发mongodb集群性能数十倍提升优化实践3. 一个链接一个线程,该线程除了负责网络收发外,还负责写数据到存储引擎,整个网络I/O处理和磁盘I/O处理都由同一个线程负责,本身架构设计就是一个缺陷。 2.2.2 网络线程模型优化方法 为了适应高并发的读写场景,mongodb-3.6开始引入serviceExecutor: adaptive配置,该配置根据请求数动态调整网络线程数,并尽量做到网络...https://tech.southcn.com/node_1ac4f21108/442c3b9f2e.shtml
6.翔安区社会监控资源联网共享二期项目附件c.投标人的CA证书或外包装应标记“项目名称、项目编号、投标人的全称”等内容,以方便识别、使用。 d.投标人的CA证书应能正常、有效使用,否则产生不利后果由投标人承担责任。 ⑥关于投标截止时间过后 a.未按招标文件规定提交投标保证金的,其投标将按无效投标处理。 http://ccgp-xiamen.gov.cn/upload/document/20221111/78a36cf8832941aa9e9e15d67bd6b723.html
7.技能篇:linux服务性能问题排查及jvm调优思路linux 内存里的 Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读写的数据。下次访问这些文件数据时,则直接从内存中快速获取,而不再次访问磁盘 磁盘性能指标 使用率,是指磁盘处理 I/O 的时间百分比。过高的使用率(比如超过 80%),通常意味着磁盘 I/O 存在性能瓶颈。 https://cloud.tencent.com/developer/article/1988361
8.面试题总结自适应自旋锁:意味着自旋时间或次数不再固定,而是由前一次的状态来决定。 1.6 简述一下BIO、AIO和NIO的区别 1>BIO是同步阻塞通信 服务器实现模式为一个连接一个线程:客户端有连接请求时服务器端就需要启动一个线程进行处理。如果这个连接不做任何事情会造成不必要的线程开销。 https://maimai.cn/article/detail?fid=1715494134&efid=beSDegNPWCkpQeec6i5ijw
9.>第4章管理OracleSolarisZFS存储池可以使用全路径(如/dev/dsk/c1t0d0)或构成/dev/dsk目录中设备名称的缩略名称(如c1t0d0)来指定磁盘。例如,以下是有效的磁盘名称: c1t0d0 /dev/dsk/c1t0d0 /dev/foo/disk 创建ZFS 存储池的最简单方法是使用整个物理磁盘。在从磁盘片、硬件 RAID 阵列中的 LUN 或基于软件的卷管理器所提供的卷中生成池时,无...https://docs.oracle.com/cd/E19253-01/819-7065/gavwn/index.html