个人学习MySQL的总结学习笔记,参考资料都在文末给出,建议阅读
⭐️内容较多,点赞收藏不迷路 ⭐️
衡量指标:
这三个指标都会记录到MySQL的慢日志中。
响应时间包括
主要是优化服务时间。
评估响应时间是否合理(是否真实反应服务时间)
知道一个查询所需要哪些索引以及它的执行计划是什么,然后计算大概需要多少个顺序和随机I/O,再用其乘以在具体硬件下一次I/O的消耗时间,最后把消耗相加。
一个任务由多个子任务组成,优化一个查询任务,可以通过消除一些子任务、减少子任务的执行次数或者让子任务运行得更快来达到目的。
MySQL执行一个查询的过程
第四步是最重要的一步,其中包含了大量的调用和数据处理,包括排序、分组。
在整个过程中,网络、CPU计算,生成信息和执行计划、互斥等操作都需要花费时间。向存储引擎检索数据的调用操作所需要的时间,包括内存操作、CPU操作和I/O操作等时间。
优化查询主要是减少和消除一些额外操作、重复操作、慢操作的时间。
Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explain 结果来优化查询语句。
比较重要的字段有:
查询性能低下的最基本愿意是访问的数据太多。
通过以下分析可以优化查询
理想情况下扫描的行数和返回的行数是相同的。使之实现的最有效的方式是使用索引来覆盖查询。
如果没有找到合适的访问类型,最有效的办法是增加一个合适的索引,索引让MySQL以最高效、扫描行数最少的方式找到需要的记录。
扫描类型
对比
全索引扫描并不一定就比全表扫描好,取决于数据存储位置。
如果数据在内存,那么这两种没有太大区别。
如果数据在磁盘,全表扫描比全索引扫描要好,这是因为,全表扫描是顺序读数据,sequential read,是顺序IO。全索引扫描可能会产生随机读(reandom read),随机IO,显然,顺序读要比随机读快很多。
WHRER的使用
从好到坏
扫描大量数据但只需返回少数的行
将大查询切分成小查询,每个查询功能完全一样,只完成一小部分,每次只返回一小部分查询结果。
一个大查询如果一次性执行的话,可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。
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
进一步优化
删除任务之间设置时间间隔,可以将服务器的一次性压力分散,降低对服务器的影响,减少删除时锁的持有时间。
很多高性能的应用都会对关联查询进行分解。
将一个大连接查询分解成对每一个表进行一次单表查询,然后在应用程序中进行关联,这样做的好处有:
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);
一个好的索引结构,是好的查询的必备基础,或者说,了解了如何创建一个良好的索引结构,那么写出良好的查询也就不成什么问题了。
如何构建一个良好索引?
面试MySQL必备知识点
⭐️
如果对你有帮助,请点个赞,加个收藏噢!
参考资料
《高性能MySQL》
cyc2018