28丨从磁盘I/O的角度理解SQL查询的成本
28丨从磁盘I/O的角度理解SQL查询的成本
讲述:陈旸
时长07:56大小7.27M
数据库缓冲池
查看缓冲池的大小
数据页加载的三种方式
通过 last_query_cost 统计 SQL 语句的查询成本
总结
赞 15
提建议
精选留言(42)
- 🄽🄸🅇🅄🅂2019-08-22请问下老师,缓冲池和查询缓存是一个东西吗?
作者回复: 首先我们需要了解InnoDB存储引擎中缓冲池都包括了哪些,在InnoDB存储引擎中有一部分数据会放到内存中,缓冲池则占了这部分内存(In-Memory Structures)的大部分,它是用来存储各种数据的缓存,包括了数据页,索引页,插入缓冲,锁信息,自适应Hash,数据字典信息等。 为什么要使用缓冲池技术呢,这时因为InnoDB存储引擎是基于磁盘文件存储的,我们在访问物理硬盘和在内存中进行访问速度相差很大,为了尽可能弥补这中间的IO效率鸿沟,我们就需要把经常使用的数据加载到缓冲池中,避免每次访问都进行磁盘IO,从而提升数据库整体的访问性能。所以说“频次X位置”的原则,帮我们对IO访问效率进行了优化: 1)位置决定效率,提供缓冲池就是在内存中可以直接访问到数据,因此效率可以大幅提升 2)频次决定优先级顺序,因为缓冲池的大小是有限的,比如我们的磁盘有200G,但是内存只有16G,缓冲池大小只有1G,那么这时无法将所有数据都加载到缓冲池里,这里就有个优先级顺序的问题,也就是对经常使用频次高的热数据进行加载。 在了解了缓冲池作用之后,我们还需要了解缓冲池的另一个特性:预读。 因为缓冲池的作用就是提升IO效率,而我们进行读取数据的存在一个“局部性原理”,也就是我们使用了一些数据,大概率还会使用它周围的一些数据。因此我们可以采用“预读”的机制来减少未来的磁盘IO操作,进行提前加载。 我们再来看下什么是查询缓存? 查询缓存是提前把查询结果缓存起来,这样下次就不需要执行可以直接拿到结果。需要说明的是,在MySQL中的查询缓存,不是缓存查询计划,而是查询及对应的查询结果。这就意味着查询匹配的鲁棒性大大降低,只有相同的查询操作才会命中查询缓存。因此在MySQL的查询缓存命中率不高,在MySQL8.0版本中已经弃用了查询缓存功能。查看是否使用了查询缓存,使用命令:show variables like '%query_chache%'; 所以说缓冲池不等于查询缓存,他们两个存在共同的特点就是都是通过缓存的机制来提升效率。而缓冲池是服务于数据库整体的IO操作,通过建立缓冲池机制来弥补存储引擎的磁盘文件与内存访问之间的效率鸿沟,同时缓冲池会采用“预读”的机器提前加载一些马上会用到的数据,以提升整体的数据库性能。而查询缓存是服务于SQL查询和查询结果集的,因为命中条件苛刻,而且只要当数据表发生了变化,查询缓存就会失效,因此命中率低,在MySQL8.0版本中已经弃用了该功能。
共 7 条评论77 - DZ2019-08-14顺序读的页面平均加载效率更高是因为顺序读更贴合存储介质的物理特性,即一次顺序读取一批相邻物理块的效率,大于多次随机访问不连续的物理块的效率。 缓冲池机制和页面加载方式是计算机体系结构的经典方式,首先必须承认两个客观事实,一是资源有限,二是时间有限。从硬盘到内存再到CPU缓存,价格和效率永远存在矛盾,只能通过多级缓存的形式,将更贵的资源留给更热的数据。展开
作者回复: 整理的不错
共 2 条评论49 - Ryoma2020-03-17在什么情况下,数据不在缓冲池中,而是在内存中,此时从内存中读取?13
- 小年2019-09-06老师,不止可否在哪一期讲一讲面试的时候常考的一些SQL相关的内容呀?感觉这些索引深入了以后面试不太会涉及到,抱歉功利了点因为最近在秋招各种面试,担心看的太深了反而暂时用不到...
作者回复: SQL主要就是基本语法和性能优化
10 - lmtoo2019-08-14innodb_buffer_pool_size是缓存池总大小吗?如果缓存池个数大于1,那每个缓冲池大小是不是innodb_buffer_pool_size/innodb_buffer_pool_instances?
作者回复: 对 总大小
共 4 条评论7 - 峻铭2019-09-18SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE comment_id = 900001; SELECT comment_id, product_id, comment_text, user_id FROM product_comment WHERE comment_id BETWEEN 900001 AND 900100; 这两句查询的last_query_cost都是4.724,说明这不是页 官网:https://dev.mysql.com/doc/refman/8.0/en/server-status-variables.html The total cost of the last compiled query as computed by the query optimizer. This is useful for comparing the cost of different query plans for the same query. The default value of 0 means that no query has been compiled yet. The default value is 0. Last_query_cost has session scope 对同一个查询语句的不同查询计划的代价进行计较,选择代价最小的。last_query_cost得到的值只是一个查询计划的评分值,不是页展开
作者回复: 整理总结的不错
共 3 条评论6 - 扶幽2019-11-07是因为磁盘IO时寻道和半圈旋转时间较长吗?
作者回复: 硬盘平均寻道时间 7-14ms,假设硬盘是6000转,转一圈(100个山区)时间是0.01,平均一个扇区的时间是0.1ms
5 - NO.92019-08-25老师 你好,请教一个问题, 看完本章前面的部分之后忽然间意识到: 数据库Down掉之后的Recover,只能是用最新对backup+checkpoint+transaction的log 恢复,就是因为commit的内容还没有从缓冲池写入磁盘。
作者回复: 对的 多谢分享
5 - 用0和1改变自己2019-08-141,顺序读取是一种批量读取,读取的数据都是相邻的,所以不需要每一页都进行I/O操作,平均下来就效率更高了。 2.缓存池的刷新机制和许多缓存都是一样的,达到一定数量后进行更新,以达到提升性能都目的。
作者回复: 总结的不错
共 4 条评论4 - 王加武2019-12-24第一个问题 我们的数据在磁盘上是相邻存储的,当我们将数据从磁盘中加载读取到缓冲区的时候,就直接一堆一堆的读取,根本不需要单独的去对某个数据进行I/O的操作,这样效率就会很高,(重点在于数据在磁盘中是相邻存储的) 第二个问题 缓冲池这个东西应该跟计算机组成原理中的高速缓冲区(Cpu Cache)是一个道理的,访问速度比内存快,内存又比磁盘快,CPU在进行数据读取的时候,首先就会去访问Cache,只有当Cache中找不到数据的时候,CPU才会去访问内存,将内存中的数据加载到Cache中,然后在进行访问!这是缓冲区比较快的一方面原因,其次就是有个东西叫做“局部性原理“,包括了时间局部性和空间局部性,在访问数据的时候,这个时间局部性就起作用了,刚刚被访问过的数据,会很快的被访问到,这样CPU花在等待内存访问的时间就大大的缩短了。 我觉得CPU这个访问数据的方式和数据库中访问的方式的原理是一样的!CPU中是CPU Cache,数据库中呢是比如”Redis缓存、MemCache缓存”等! 不知道上述总结是否正确,但是我觉得万变不离其宗,很多东西只是换了一种方式去操作而已,其根本的原理是不变的!有不对的地方,还请老师指正!展开
作者回复: 总结的不错!
3 - jacksnow2020-03-10老师,有个问题请教一下: 如果是两个表进行join操作,比如 select a.*, b.* from a join b on a.xxx = b.xxx // 第一步 where a.id = 'xxxx' // 第二步 第一步是进行数据组装 第二部是进行条件筛选. 我的问题是: 第一步组装数据的意思是不是在磁盘上通过a和b两个表的page页组装成新的page页,并且需要新分配磁盘空间来存储这些新的page页,查询完成之后再将这些page页进行回收? 第二步是否是在新组装出来的page页中通过索引进行查询,并将查到的page load到内存中来?展开1
- 梁2019-11-22我想SSD磁盘在单个页面随机读的效率是否不会比单个页面顺序读的效率差了,SSD寻道时间才0.1ms。共 1 条评论1
- 梁2019-11-22我想要是全闪存磁盘的话,就算是单个页面的随机读,效率也不会比顺序读取时平均一个页面的加载效率差,1
- wonderq_gk2019-08-29如何把数据放到缓冲池
作者回复: 需要的时候,MySQL会自动将数据加载到缓冲池的,避免每次查询数据都进行磁盘IO,同样因为缓冲池的大小有限,因此MySQL也会管理和淘汰缓冲池,使得缓冲池性能最大化
2 - wonderq_gk2019-08-29老师,我这里size是32M,为什么也是有8个缓冲池
作者回复: 应该是innodb_buffer_pool_size参数设置为大于等于 1GB的时候,缓冲池的数量大于1才会生效
2 - 一米阳光2019-08-21老师,ssd硬盘也存在随机读吗,还是只是减少了机械硬盘的寻道共 1 条评论1
- Geek_Wison2019-08-16老师,您好。这一节讲的数据库缓存池和新版本MySQL8.0取消的缓存指的是同一个东西吗? 如果是的话,那这节课的内容只在旧版本的mysql成立,在新版本的mysql(取消了缓存的版本)就没用了?
作者回复: MySQL 8.0 取消的是查询缓存
共 2 条评论2 - 许童童2019-08-14你能解释下相比于单个页面的随机读,为什么顺序读取时平均一个页面的加载效率会提高吗? 和硬盘的结构有关,硬盘如果读取连续的页,那平均延时和寻道时间平均到每个页面就非常少了,甚至非常接近读取一个页面的效率。 另外,对于今天学习的缓冲池机制和数据页加载的方式,你有什么心得体会吗? 缓冲机制在计算机性能优化随处可见,其理论依据就是计算机的局部性原理,空间局部性,时间局部性。展开
作者回复: 对的 批量处理,以及缓冲池机制在系统性能设计中会经常用到
1 - 皮特尔2021-06-13SSD不存在顺序读的问题,所以数据库优化有一个简单粗暴的方案:上SSD共 2 条评论
- Geek_dd36232021-04-04缓存池的数据是怎么进行淘汰的呢? 是用 LRU 算法吗