个人学习MySQL的总结学习笔记,参考资料都在文末给出,建议阅读 衡量指标: 这三个指标都会记录到MySQL的慢日志中。 响应时间包括 主要是优化服务时间。 评估响应时间是否合理(是否真实反应服务时间) 知道一个查询所需要哪些索引以及它的执行计划是什么,然后计算大概需要多少个顺序和随机I/O,再用其乘以在具体硬件下一次I/O的消耗时间,最后把消耗相加。 一个任务由多个子任务组成,优化一个查询任务,可以通过消除一些子任务、减少子任务的执行次数或者让子任务运行得更快来达到目的。 MySQL执行一个查询的过程 第四步是最重要的一步,其中包含了大量的调用和数据处理,包括排序、分组。 在整个过程中,网络、CPU计算,生成信息和执行计划、互斥等操作都需要花费时间。向存储引擎检索数据的调用操作所需要的时间,包括内存操作、CPU操作和I/O操作等时间。 优化查询主要是减少和消除一些额外操作、重复操作、慢操作的时间。 Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。 比较重要的字段有: 查询性能低下的最基本愿意是访问的数据太多。 通过以下分析可以优化查询 理想情况下扫描的行数和返回的行数是相同的。使之实现的最有效的方式是使用索引来覆盖查询。 如果没有找到合适的访问类型,最有效的办法是增加一个合适的索引,索引让MySQL以最高效、扫描行数最少的方式找到需要的记录。 扫描类型 对比 全索引扫描并不一定就比全表扫描好,取决于数据存储位置。 如果数据在内存,那么这两种没有太大区别。 如果数据在磁盘,全表扫描比全索引扫描要好,这是因为,全表扫描是顺序读数据,sequential read,是顺序IO。全索引扫描可能会产生随机读(reandom read),随机IO,显然,顺序读要比随机读快很多。 WHRER的使用 从好到坏 扫描大量数据但只需返回少数的行 将大查询切分成小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分查询结果。 一个大查询如果一次性执行的话,可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。 一次删除一万行 进一步优化 删除任务之间设置时间间隔,可以将服务器的一次性压力分散,降低对服务器的影响,减少删除时锁的持有时间。 很多高性能的应用都会对关联查询进行分解。 将一个大连接查询分解成对每一个表进行一次单表查询,然后在应用程序中进行关联,这样做的好处有: 参考资料 《高性能MySQL》
概念
使用Explain进行分析
优化数据访问
1. 减少请求的数据量
2. 减少服务器端扫描的行数
重构查询方式
1. 切分大查询
DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); rows_affected = 0
do { rows_affected = do_query( "DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000") } while rows_affected > 0
2. 分解大连接查询
SELECT * FROM tag JOIN tag_post ON tag_post.tag_id=tag.id
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);
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算