Mysql-性能优化方案及技术.doc
《Mysql-性能优化方案及技术.doc》由会员分享,可在线阅读,更多相关《Mysql-性能优化方案及技术.doc(17页珍藏版)》请在咨信网上搜索。
1、Mysql 性能优化方案及技术目录目录1背景及目标2Mysql 执行优化2认识数据索引2为什么使用数据索引能提高效率2如何理解数据索引的结构2如何理解影响结果集3理解执行状态4常见分析手段4分析流程6总结7Mysql 运维优化9存储引擎类型9内存使用考量9性能与安全性考量9存储压力优化10运维监控体系10Mysql 架构优化11架构优化目标11防止单点隐患11方便系统扩容11安全可控,成本可控11分布式方案12分库&拆表方案12主从架构14故障转移处理15缓存方案15缓存结合数据库的读取15缓存结合数据库的写入15背景及目标l 厦门游家公司()用于员工培训和分享。l 针对用户群为已经使用过my
2、sql环境,并有一定开发经验的工程师l 针对高并发,海量数据的互联网环境。l 本文语言为口语,非学术标准用语。l 以实战和解决具体问题为主要目标,非应试,非常规教育。友情提醒,在校生学习本教程可能对成绩提高有害无益。l 非技术挑战,非高端架构师培训,请高手自动忽略。Mysql 执行优化认识数据索引为什么使用数据索引能提高效率n 数据索引的存储是有序的n 在有序的情况下,通过索引查询一个数据是无需遍历索引记录的n 极端情况下,数据索引的查询效率为二分法查询效率,趋近于 log2(N)如何理解数据索引的结构n 数据索引通常默认采用btree索引,(内存表也使用了hash索引)。n 单一有序排序序列
3、是查找效率最高的(二分查找,或者说折半查找),使用树形索引的目的是为了达到快速的更新和增删操作。n 在极端情况下(比如数据查询需求量非常大,而数据更新需求极少,实时性要求不高,数据规模有限),直接使用单一排序序列,折半查找速度最快。u 实战范例 : ip地址反查资源: Ip地址对应表,源数据格式为 startip, endip, area 源数据条数为 10万条左右,呈很大的分散性目标:需要通过任意ip查询该ip所属地区性能要求达到每秒1000次以上的查询效率挑战:如使用 between and 数据库操作,无法有效使用索引。如果每次查询请求需要遍历10万条记录,根本不行。方法:一次性排序(只
4、在数据准备中进行,数据可存储在内存序列)折半查找(每次请求以折半查找方式进行)n 在进行索引分析和SQL优化时,可以将数据索引字段想象为单一有序序列,并以此作为分析的基础。u 实战范例:复合索引查询优化实战,同城异性列表资源: 用户表user,字段 sex性别;area 地区;lastlogin 最后登录时间;其他略目标: 查找同一地区的异性,按照最后登录时间逆序 高访问量社区的高频查询,如何优化。查询SQL: select * from user where area=$area and sex=$sex order by lastlogin desc limit 0,30;挑战:建立复合索
5、引并不难, area+sex+lastlogin 三个字段的复合索引,如何理解?首先,忘掉btree,将索引字段理解为一个排序序列。如果只使用area会怎样?搜索会把符合area的结果全部找出来,然后在这里面遍历,选择命中sex的并排序。 遍历所有 area=$area数据!如果使用了area+sex,略好,仍然要遍历所有area=$area and sex=$sex数据,然后在这个基础上排序!Area+sex+lastlogin复合索引时(切记lastlogin在最后),该索引基于area+sex+lastlogin 三个字段合并的结果排序,该列表可以想象如下。广州女$时间1广州女$时间2广
6、州女$时间3广州男.深圳女.数据库很容易命中到 area+sex的边界,并且基于下边界向上追溯30条记录,搞定!在索引中迅速命中所有结果,无需二次遍历!如何理解影响结果集n 影响结果集是数据查询优化的一个重要中间数据u 查询条件与索引的关系决定影响结果集如上例所示,即便查询用到了索引,但是如果查询和排序目标不能直接在索引中命中,其可能带来较多的影响结果。而这会直接影响到查询效率u 微秒级优化l 优化查询不能只看慢查询日志,常规来说,0.01秒以上的查询,都是不够优化的。l 实战范例和上案例类似,某游戏社区要显示用户动态,select * from userfeed where uid=$uid
7、 order by lastlogin desc limit 0,30; 初期默认以uid为索引字段, 查询为命中所有uid=$uid的结果按照lastlogin排序。 当用户行为非常频繁时,该SQL索引命中影响结果集有数百乃至数千条记录。查询效率超过0.01秒,并发较大时数据库压力较大。 解决方案:将索引改为 uid+lastlogin 复合索引,索引直接命中影响结果集30条,查询效率提高了10倍,平均在0.001秒,数据库压力骤降。n 影响结果集的常见误区u 影响结果集并不是说数据查询出来的结果数或操作影响的结果数,而是查询条件的索引所命中的结果数。u 实战范例l 某游戏数据库使用了inn
8、odb,innodb是行级锁,理论上很少存在锁表情况。出现了一个SQL语句(delete from tabname where xid=),这个SQL非常用SQL,仅在特定情况下出现,每天出现频繁度不高(一天仅10次左右),数据表容量百万级,但是这个xid未建立索引,于是悲惨的事情发生了,当执行这条delete 的时候,真正删除的记录非常少,也许一到两条,也许一条都没有;但是!由于这个xid未建立索引,delete操作时遍历全表记录,全表被delete操作锁定,select操作全部被locked,由于百万条记录遍历时间较长,期间大量select被阻塞,数据库连接过多崩溃。这种非高发请求,操作目
9、标很少的SQL,因未使用索引,连带导致整个数据库的查询阻塞,需要极大提高警觉。n 总结:u 影响结果集是搜索条件索引命中的结果集,而非输出和操作的结果集。u 影响结果集越趋近于实际输出或操作的目标结果集,索引效率越高。u 请注意,我这里永远不会讲关于外键和join的优化,因为在我们的体系里,这是根本不允许的! 架构优化部分会解释为什么。理解执行状态常见分析手段l 慢查询日志,关注重点如下n 是否锁定,及锁定时间u 如存在锁定,则该慢查询通常是因锁定因素导致,本身无需优化,需解决锁定问题。n 影响结果集u 如影响结果集较大,显然是索引项命中存在问题,需要认真对待。l Explain 操作n 索引
10、项使用u 不建议用using index做强制索引,如未如预期使用索引,建议重新斟酌表结构和索引设置。n 影响结果集u 这里显示的数字不一定准确,结合之前提到对数据索引的理解来看,还记得嘛?就把索引当作有序序列来理解,反思SQL。l Set profiling , show profiles for query操作n 执行开销u 注意,有问题的SQL如果重复执行,可能在缓存里,这时要注意避免缓存影响。通过这里可以看到。u 执行时间超过0.005秒的频繁操作SQL建议都分析一下。u 深入理解数据库执行的过程和开销的分布l Show processlistn 状态清单u Sleep 状态, 通常代
11、表资源未释放,如果是通过连接池,sleep状态应该恒定在一定数量范围内l 实战范例: 因前端数据输出时(特别是输出到用户终端)未及时关闭数据库连接,导致因网络连接速度产生大量sleep连接,在网速出现异常时,数据库 too many connections 挂死。l 简单解读,数据查询和执行通常只需要不到0.01秒,而网络输出通常需要1秒左右甚至更长,原本数据连接在0.01秒即可释放,但是因为前端程序未执行close操作,直接输出结果,那么在结果未展现在用户桌面前,该数据库连接一直维持在sleep状态!u Waiting for net, reading from net, writing t
12、o netl 偶尔出现无妨l 如大量出现,迅速检查数据库到前端的网络连接状态和流量l 案例: 因外挂程序,内网数据库大量读取,内网使用的百兆交换迅速爆满,导致大量连接阻塞在waiting for net,数据库连接过多崩溃u Locked状态l 有更新操作锁定l 通常使用innodb可以很好的减少locked状态的产生,但是切记,更新操作要正确使用索引,即便是低频次更新操作也不能疏忽。如上影响结果集范例所示。l 在myisam的时代,locked是很多高并发应用的噩梦。所以mysql官方也开始倾向于推荐innodb。u Copy to tmp tablel 索引及现有结构无法涵盖查询条件,才会
13、建立一个临时表来满足查询要求,产生巨大的恐怖的i/o压力。l 很可怕的搜索语句会导致这样的情况,如果是数据分析,或者半夜的周期数据清理任务,偶尔出现,可以允许。频繁出现务必优化之。l Copy to tmp table 通常与连表查询有关,建议逐渐习惯不使用连表查询。l 实战范例:n 某社区数据库阻塞,求救,经查,其服务器存在多个数据库应用和网站,其中一个不常用的小网站数据库产生了一个恐怖的copy to tmp table 操作,导致整个硬盘i/o和cpu压力超载。Kill掉该操作一切恢复。u Sending datal Sending data 并不是发送数据,别被这个名字所欺骗,这是从物
14、理磁盘获取数据的进程,如果你的影响结果集较多,那么就需要从不同的磁盘碎片去抽取数据,l 偶尔出现该状态连接无碍。l 回到上面影响结果集的问题,一般而言,如果sending data连接过多,通常是某查询的影响结果集过大,也就是查询的索引项不够优化。l 如果出现大量相似的SQL语句出现在show proesslist列表中,并且都处于sending data状态,优化查询索引,记住用影响结果集的思路去思考。u Freeing itemsl 理论上这玩意不会出现很多。偶尔出现无碍l 如果大量出现,内存,硬盘可能已经出现问题。比如硬盘满或损坏。u Sorting for l 和Sending dat
15、a类似,结果集过大,排序条件没有索引化,需要在内存里排序,甚至需要创建临时结构排序。u 其他l 还有很多状态,遇到了,去查查资料。基本上我们遇到其他状态的阻塞较少,所以不关心。分析流程l 基本流程n 详细了解问题状况u Too many connections 是常见表象,有很多种原因。u 索引损坏的情况在innodb情况下很少出现。u 如出现其他情况应追溯日志和错误信息。n 了解基本负载状况和运营状况u 基本运营状况l 当前每秒读请求l 当前每秒写请求l 当前在线用户l 当前数据容量u 基本负载情况l 学会使用这些指令n Top n Vmstatn uptime n iostat n df
16、l Cpu负载构成n 特别关注i/o压力( wa%)n 多核负载分配l 内存占用n Swap分区是否被侵占n 如Swap分区被侵占,物理内存是否较多空闲l 磁盘状态n 硬盘满和inode节点满的情况要迅速定位和迅速处理n 了解具体连接状况u 当前连接数 l Netstat an|grep 3306|wc ll Show processlistu 当前连接分布 show processlistl 前端应用请求数据库不要使用root帐号!n Root帐号比其他普通帐号多一个连接数许可。n 前端使用普通帐号,在too many connections的时候root帐号仍可以登录数据库查询 show
17、processlist!n 记住,前端应用程序不要设置一个不叫root的root帐号来糊弄!非root账户是骨子里的,而不是名义上的。l 状态分布n 不同状态代表不同的问题,有不同的优化目标。n 参见如上范例。l 雷同SQL的分布n 是否较多雷同SQL出现在同一状态u 当前是否有较多慢查询日志l 是否锁定l 影响结果集n 频繁度分析u 写频繁度l 如果i/o压力高,优先分析写入频繁度l Mysqlbinlog 输出最新binlog文件,编写脚本拆分l 最多写入的数据表是哪个l 最多写入的数据SQL是什么l 是否存在基于同一主键的数据内容高频重复写入?n 涉及架构优化部分,参见架构优化-缓存异步
18、更新u 读取频繁度l 如果cpu资源较高,而i/o压力不高,优先分析读取频繁度l 程序中在封装的db类增加抽样日志即可,抽样比例酌情考虑,以不显著影响系统负载压力为底线。l 最多读取的数据表是哪个l 最多读取的数据SQL是什么n 该SQL进行explain 和set profiling判定n 注意判定时需要避免query cache影响u 比如,在这个SQL末尾增加一个条件子句 and 1=1 就可以避免从query cache中获取数据,而得到真实的执行状态分析。 l 是否存在同一个查询短期内频繁出现的情况n 涉及前端缓存优化n 抓大放小,解决显著问题u 不苛求解决所有优化问题,但是应以保证
19、线上服务稳定可靠为目标。u 解决与评估要同时进行,新的策略或解决方案务必经过评估后上线。总结l 要学会怎样分析问题,而不是单纯拍脑袋优化l 慢查询只是最基础的东西,要学会优化0.01秒的查询请求。l 当发生连接阻塞时,不同状态的阻塞有不同的原因,要找到原因,如果不对症下药,就会南辕北辙n 范例:如果本身系统内存已经超载,已经使用到了swap,而还在考虑加大缓存来优化查询,那就是自寻死路了。l 监测与跟踪要经常做,而不是出问题才做n 读取频繁度抽样监测u 全监测不要搞,i/o吓死人。u 按照一个抽样比例抽样即可。u 针对抽样中发现的问题,可以按照特定SQL在特定时间内监测一段全查询记录,但仍要考
20、虑i/o影响。n 写入频繁度监测u 基于binlog解开即可,可定时或不定时分析。n 微慢查询抽样监测u 高并发情况下,查询请求时间超过0.01秒甚至0.005秒的,建议酌情抽样记录。n 连接数预警监测u 连接数超过特定阈值的情况下,虽然数据库没有崩溃,建议记录相关连接状态。l 学会通过数据和监控发现问题,分析问题,而后解决问题顺理成章。特别是要学会在日常监控中发现隐患,而不是问题爆发了才去处理和解决。Mysql 运维优化存储引擎类型l Myisam 速度快,响应快。表级锁是致命问题。l Innodb 目前主流存储引擎n 行级锁 u 务必注意影响结果集的定义是什么u 行级锁会带来更新的额外开销
21、,但是通常情况下是值得的。n 事务提交 u 对i/o效率提升的考虑u 对安全性的考虑l HEAP 内存引擎n 频繁更新和海量读取情况下仍会存在锁定状况内存使用考量l 理论上,内存越大,越多数据读取发生在内存,效率越高l 要考虑到现实的硬件资源和瓶颈分布l 学会理解热点数据,并将热点数据尽可能内存化n 所谓热点数据,就是最多被访问的数据。n 通常数据库访问是不平均的,少数数据被频繁读写,而更多数据鲜有读写。n 学会制定不同的热点数据规则,并测算指标。u 热点数据规模,理论上,热点数据越少越好,这样可以更好的满足业务的增长趋势。u 响应满足度,对响应的满足率越高越好。u 比如依据最后更新时间,总访
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Mysql 性能 优化 方案 技术
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【快乐****生活】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【快乐****生活】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。