mysql高性能学习笔记03_高性能mysql学习笔记.pdf

高性能mysql学习笔记.pdf

8a2631b9dbca4c0cc5e19684a2d3cff3.gif

还剩

16页未读,

继续阅读

下载文档到电脑,马上远离加班熬夜!

亲,很抱歉,此页已超出免费预览范围啦!

如果喜欢就下载吧,价低环保!

内容要点:

高性能 MySQL学习笔记 发表于 2013/11/04由 YY_Crazy 超长文,慎入! 这是我大二暑假读《高性能 MySQL》的笔记,当时分篇记录在了 blogspot的博客上,现在那个博客已经废弃,今天爬篱笆的时候无意间看到,就把它整理了一下放到这里来。 MySQL查询性能优化 查询性能低下的最基本原因就是访问了太多数据。在分析性能欠佳的查询的时候,下面两个步骤比较有用: 1.查明应用程序是否正在获取超过需要的数据。这通常意味着访问了过多的行或列。 2.查明 MySQL服务器是否分析了超过需要的行。 当我们找到有问题的查询语句时,我们就应该重构它,下面是一些重构查 询的技巧及使用它们的时机。 1.缩短查询 一种处理查询的办法是分治法,让查询的本质上不变,但是每次只执行一小部分,以减少受影响的行数。 比如,下面是一个巨大的查询: ? 1 DELETE FROM messages WHERE created 0; 足够短的任务对服务器的影响最小。在 DELETE 语句中加入休眠语句也是一个好主意,它可以分摊负载,并且减少锁住资源的时间。 2.分解联接 许多高性能的网站都用了 “分解联接 ”技术,可以把一个多表联接分解成多个单个查询,然后在应用程序端实现联接操作。 ? 1 2 3 4 SELECT * FROM tag JOIN tag_post ON tag_post.tag_id = tag.id JOIN post ON tag_post.post_id = post.id WHERE tag.tag = 'mysql'; 可以用下面的语句代替: ? 1 2 3 SELECT * FROM tag WHERE tag = 'mysql'; SELECT * FROM tag_post WHERE tag_id = 1234; SELECT * FROM post WHERE post.id IN (123, 456, 567, 9098, 8904); 这种重构方式有下面这些重大的性能优势: a.缓存的效率更高。如果只有一个表经常改变,那么分解联接就可以减少缓存失效的次数。 b.对于 MyISAM表来说,每个表一个查询可以更有效地利用表锁,因为查询会锁住单个表较短时间,而不是把所有表长时间锁住。 c.在应用程序端进行联接可以更方便地扩展数据库,把不同的表放在不同的服务器上面。 d.查询 本身会更高效。 e.可以减少多余的行访问。在应用程序端进行联接意味着对每行数据只会访问一次,而联接从本质上来说是非正则化的,它会反复地访问同一行数据。基于同样的原因,这种重构方式可以减少网络流量和内存消耗。 想得到高性能,最佳的方式就是学习 MySQL如何优化和执行查询。 MySQL使用的是基于开销( Cost)的优化器,这意味着它会预测不同执行计划的开销,并且选择开销最小的一个。开销的单位是一次对大小为 4KB的页面的随机读取。 优化器不会考虑任何缓存因素,它认为每次读取都会有相同的 IO开销。 由于种种原因,优 化器并不总是能选择最好的方案: 1.统计数据可能是错误的。 2.开销指标和运行查询的实际开销并不精确相等。 3.MySQL的优化并不总是和我们想的一样。它只考虑开销。 4.MySQL不会考虑正在并发运行的其他查询,而并发查询会影响查询运行的速度。 5.MySQL并不总是根据开销来进行优化,有时候它仅仅遵从一些原则。 6.优化器不会考虑不受它控制的操作的开销,比如执行存储函数和用户定义的函数。 7.优化器不会总是估算每一个可能的执行计划,所以它可能错过优化方案。 MySQL优化器有两个基本方案:静态优化和动态 优化。静态优化可以简单地通过探测解析树( Parse Tree)来完

发表评论

暂无评论,赶快抢占沙发吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值