欢迎来到天天文库
浏览记录
ID:37678963
大小:518.45 KB
页数:17页
时间:2019-05-28
《高性能MySQL学习笔记》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、高性能MySQL学习笔记发表于2013/11/04由YY_Crazy超长文,慎入!这是我大二暑假读《高性能MySQL》的笔记,当时分篇记录在了blogspot的博客上,现在那个博客已经废弃,今天爬篱笆的时候无意间看到,就把它整理了一下放到这里来。MySQL查询性能优化查询性能低下的最基本原因就是访问了太多数据。在分析性能欠佳的查询的时候,下面两个步骤比较有用:1.查明应用程序是否正在获取超过需要的数据。这通常意味着访问了过多的行或列。2.查明MySQL服务器是否分析了超过需要的行。当我们找到有问题的查询语句时,我们就应该重构它,下面是一些重构查询的技巧及使用它们的时机。1.缩短查询一
2、种处理查询的办法是分治法,让查询的本质上不变,但是每次只执行一小部分,以减少受影响的行数。比如,下面是一个巨大的查询:?1DELETEFROMmessagesWHEREcreated0;足够短的任务对服务
3、器的影响最小。在DELETE语句中加入休眠语句也是一个好主意,它可以分摊负载,并且减少锁住资源的时间。2.分解联接许多高性能的网站都用了“分解联接”技术,可以把一个多表联接分解成多个单个查询,然后在应用程序端实现联接操作。?1SELECT*FROMtag2JOINtag_postONtag_post.tag_id=tag.id3JOINpostONtag_post.post_id=post.id4WHEREtag.tag='mysql';可以用下面的语句代替:?1SELECT*FROMtagWHEREtag='mysql';2SELECT*FROMtag_postWHEREtag_i
4、d=1234;3SELECT*FROMpostWHEREpost.idIN(123,456,567,9098,8904);这种重构方式有下面这些重大的性能优势:a.缓存的效率更高。如果只有一个表经常改变,那么分解联接就可以减少缓存失效的次数。b.对于MyISAM表来说,每个表一个查询可以更有效地利用表锁,因为查询会锁住单个表较短时间,而不是把所有表长时间锁住。c.在应用程序端进行联接可以更方便地扩展数据库,把不同的表放在不同的服务器上面。d.查询本身会更高效。e.可以减少多余的行访问。在应用程序端进行联接意味着对每行数据只会访问一次,而联接从本质上来说是非正则化的,它会反复地访问同一
5、行数据。基于同样的原因,这种重构方式可以减少网络流量和内存消耗。想得到高性能,最佳的方式就是学习MySQL如何优化和执行查询。MySQL使用的是基于开销(Cost)的优化器,这意味着它会预测不同执行计划的开销,并且选择开销最小的一个。开销的单位是一次对大小为4KB的页面的随机读取。优化器不会考虑任何缓存因素,它认为每次读取都会有相同的IO开销。由于种种原因,优化器并不总是能选择最好的方案:1.统计数据可能是错误的。2.开销指标和运行查询的实际开销并不精确相等。3.MySQL的优化并不总是和我们想的一样。它只考虑开销。4.MySQL不会考虑正在并发运行的其他查询,而并发查询会影响查询运
6、行的速度。5.MySQL并不总是根据开销来进行优化,有时候它仅仅遵从一些原则。6.优化器不会考虑不受它控制的操作的开销,比如执行存储函数和用户定义的函数。7.优化器不会总是估算每一个可能的执行计划,所以它可能错过优化方案。MySQL优化器有两个基本方案:静态优化和动态优化。静态优化可以简单地通过探测解析树(ParseTree)来完成。静态优化和值无关。它可以被应用一次,然后始终都有效,即使用不同的参数重新执行查询也不会改变。动态优化根据上下文而定,和很多因素有关。每次查询执行的时候都会重新执行优化。下面是MySQL能够处理的一些优化类型:1.对联接中的表进行重新排序。2.将外联接转换
7、成内联接。3.代数等价法则。4.优化COUNT(),MIN()和MAX()。5.计算和减少常量表达式。6.覆盖索引。7.子查询优化。8.早期终结。9.相等传递。10.比较IN()里面的数据。表和索引统计服务器层有查询优化器,却没有保存数据和索引的统计数据。存储引擎负责统计这些数据。因为服务器层没有保存统计数据,所有MySQL优化器就不得不向存储引擎询问查询所使用的表的统计数据。存储引擎会向优化器提供每个表或索引的页面数量、表和索引的基数性、键和行的长度及键
此文档下载收益归作者所有