原文博客如下:

http://yoshinorimatsunobu.blogspot.com/2013/10/making-full-table-scan-10x-faster-in.html

如下是读博客做的笔记:

Facebook对全表扫描的需求场景:
1.logical backups(eg: mysqldump);
2.online schema changes(eg: SELECT... INTO OUTFILE);
 
Facebook 使用logical backups(vs physical backup)的原因:
1.size is mush smaller(3x ~10 x);
2.eaier to parse backups;
 
drawbacks of logical backup:
full backup and full restore are much slower than physical backup/restore.
 
如果数据库大时,表一般都是fragmented,此时InnoDB的全表扫描是随机读而非顺序读。
Logical Readahead即为实现InnoDB全表扫描时的顺序读。
 
给出的性能提升数据:
1. 9~10 times faster         under usual production workloads
2. 15~20 times faster       under heavy production workloads
在HDD上效果明显。
 
InnoDB已经支持的prefetching feature "Linear Read Ahead"对提升全表扫描的性能并没有什么帮助,因为Linear Read Ahead是按照磁盘物理的page顺序做prefetch(默认64个page,这个范围太小了)。而稍大些的fragmented tables,逻辑上相邻的两个page在物理上距离一般会更大(文章中举例 page 3 -> page 5230 -> page 4).
 
Logical Read Ahead基本原理:
根据primary key的B+树的branch节点记录的leaf page number信息,按照page的顺序(大部分转化为顺序读)将很多leaf节点的数据读入buffer pool,提升后续全表扫描时buffer pool的命中率,进而避免随机读。
实现思路(步骤):
1.Reading many branch pages of the primary key
2.Collecting leaf page numbers
3.Reading many (configurable amount of) leaf pages by page number order (mostly sequential disk reads)
4.Reading rows by primary key order (same as usual full table scan, but buffer pool hit rate should be very high)
 
提供两个新的session variables:
1. innodb_lra_size;  (the size of prefetch leaf pages)
2. innodb_lra_sleep; (???做啥用的???)
在需要使用LRA时将这个特性打开。
 
Submitting multiple async I/O requests at once
In 5.6, InnoDB开始默认使用aio。将多个连续的16KB读取一次submit,可以利用Linux对多个请求的merge,提高效率。
在HDD Raid 1+0的条件下,作者每次提交64个连续页面的读取请求,将读取效率由160MB/s提升至1000MB/s.
 
测试数据如下:
1. Full table scan on pure HDD (basic benchmark, no other workload)
Table size Without LRA With LRA Improvement
10GB 10 min 55.00 sec 1 min 15.20 sec 8.71x
50GB 52 min 44.42 sec 6 min 36.98 sec 7.97x

2. Online schema change under heavy workload

Table size Without LRA With LRA Improvement
1GB 7 min 33 sec 24 sec 18.8x
关于上述改进的三处改动都给了patch。

Facebook对MySQL全表扫描性能的改进的更多相关文章

  1. MYSQl 全表扫描以及查询性能

    MYSQl 全表扫描以及查询性能 -- 本文章仅用于学习,记录 一. Mysql在一些情况下全表检索比索引查询更快: 1.表格数据很少,使用全表检索会比使用索引检索更快.一般当表格总数据小于10行并且 ...

  2. 造成MySQL全表扫描的原因

    全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止.通常在数据库中,对无索引的表进行查询一般称为全表扫描:然而有时候我们即便添加了索引,但当我们的SQL语句写的不合理的时候也 ...

  3. mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)

    full index scan:全索引扫描,查询时,遍历索引树来获取数据行.如果数据不是密集的会产生随机IO 在执行计划中是Type列,index full table scan:通过读物理表获取数据 ...

  4. mysql 全表扫描场景

    全表扫描是数据库搜寻表的每一条记录的过程,直到所有符合给定条件的记录返回为止.通常在数据库中,对无索引的表进行查询一般称为全表扫描:然而有时候我们即便添加了索引,但当我们的SQL语句写的不合理的时候也 ...

  5. MySql避免全表扫描【转】

    原文地址:http://blog.163.com/ksm19870304@126/blog/static/37455233201251901943705/ 对查询进行优化,应尽量避免全表扫描,首先应考 ...

  6. Mysql避免全表扫描sql查询优化 .

    对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: ·   使用ANALYZE TABLE tbl_n ...

  7. MySql避免全表扫描

    对查询进行优化,应尽量避免全表扫描,首先应考虑在where 及order by 涉及的列上建立索引: .尝试下面的技巧以避免优化器错选了表扫描: · 使用ANALYZE TABLE tbl_name为 ...

  8. Mysql怎么样避免全表扫描,sql查询优化

    对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引: 尝试下面的技巧以避免优化器错选了表扫描: 使用ANALYZE TABLE tbl_name为扫 ...

  9. MYSQL的全表扫描,主键索引(聚集索引、第一索引),非主键索引(非聚集索引、第二索引),覆盖索引四种不同查询的分析

    文章出处:http://inter12.iteye.com/blog/1430144 MYSQL的全表扫描,主键索引(聚集索引.第一索引),非主键索引(非聚集索引.第二索引),覆盖索引四种不同查询的分 ...

随机推荐

  1. HTML第一课——基础知识普及【1】

    请关注公众号:自动化测试实战 HTML概念及编写规范 html叫做超本文标记语言,注意它知识标记语言,不是编程语言. 编写规范: 由标记(html, div, p, h1等)组成 标记成对出现(< ...

  2. mac终端下修改MySQL的编码格式--找不到my-default.cnf及my.cnf

    首先请确认正确安装好MySQL. 1- 先配置环境变量path 1.1 打开终端,输入: cd ~ 会进入~文件夹, 1.2 然后输入:touch .bash_profile 回车执行后, 1.3 再 ...

  3. SublimeText设置在浏览器打开 快捷键

    这里插入一下安装"view in browser"官方版的说明:(前提是得先安装package control插件) 1.通过"ctrl+shift+p"打开命 ...

  4. socket编程---SCTP

    sctp_sndrcvinfo结构体 sctp_event_subscribe结构体 更多的关于SCTP的结构体http://aisxyz.iteye.com/blog/2408978 SCTP套接字 ...

  5. sdk manager 代理,解决下载速度慢的问题

    原文:http://blog.csdn.net/android_panda/article/details/18598883 地址:mirrors.neusoft.edu.cn 端口:80 要勾选:F ...

  6. unity里面查找所有物体

    测试的时候发现一个很诡异的bug,在prefab里面的物体的属性居然不断的在变化,最后一步步调试才发现,区别是查找物体的api,特此记录下 两种api Canvas[] canvasArray = ( ...

  7. SQL 知识及用法备忘录

    ---查询当前数据库一共有多少张表 ) from sysobjects where xtype='U' ---查询当前数据库有多少张视图 ) from sysobjects where xtype=' ...

  8. WebDriverAgent原理

    传输层:HTTP/HTTPS/HSF/Socket 安全性:HTTP/HTTPS 功能.单元 性能-限流.加服务器 目的:稳定的服务的TPS摸高测试(短时间的极限,不可持续) API接口测试-施压-服 ...

  9. PHP调用OCX控件的具体方法

    需要设置php.ini文件,找到这行com.allow_dcom=true,把com组件支持启用 使用PHP调用OCX控件,本不是个难题,但现实中采用flash回避的方法更通用.真正使用ocx的不多, ...

  10. Solr Facet 统计查询

    一)概述 Facet是solr的高级搜索功能之一,可以给用户提供更友好的搜索体验.在搜索关键字的同时,能够按照Facet的字段进行分组并统计.例如下图所示,你上淘宝,输入“电脑”进行搜索,就会出现品牌 ...