原文博客如下:

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. 使用 Win2D 绘制带图片纹理的圆(或椭圆)

    使用 Win2D 绘制图片和绘制椭圆都非常容易,可是如何使用 Win2D 绘制图片纹理的椭圆呢? 本文内容 重力迷宫小球 Win2D 实现 关于 CanvasCommandList 重力迷宫小球 ▲ ...

  2. PAT 1021 个位数统计 C语言

    1021. 个位数统计 (15) 给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0) ...

  3. UNIX 时间戳 C#

    /// 将Unix时间戳转换为DateTime类型时间 /// </summary> /// <param name="d">double 型数字</ ...

  4. FastAdmin 前台会员分组的权限分析

    FastAdmin 前台会员分组的权限分析 之前有用户反馈前台用户组权限无法选中无子节点的节点 1. 其实这个理解是不对的,是无法选中菜单可视的节点. 从这里 UserRule.php 可能可以看出. ...

  5. linux nginx不区别大小写处理方法

    # 把所有的目录及文件名全改成小写,注意之后新增目录及文件只使用小写命名 递归转换目录或文件名方法:python把指定目录下的递归所有目录和文件名转换成小写或大写(http://www.cnblogs ...

  6. windows上如何安装Sqlite

    一.安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下载下来sqlite-dll-win ...

  7. postgresql PL/pgSQL—存储过程结构和变量声明

    ref: https://www.postgresql.org/docs/9.6/static/plpgsql-structure.html 一. 函数结构 CREATE FUNCTION somef ...

  8. Java之MD5加密

    一.Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Riv ...

  9. servlet 3.0无需配置web.xml,使用注入方式配置servlet实现登陆功能(服务器需要支持servlet3.0)

    首先申明上面的报错红叉,我也不知道怎么回事.总之能运行. 新建项目时选择java EE6.0,低版本没有servlet3.0. 先看一个基本示例. Test.java是用来测试无需配置文件,无需静态页 ...

  10. PHP数组键值使用单引号和双引号和无符号的区别

    PHP数组键值使用单引号和双引号和无符号的区别 方法/步骤 1 第一种:$array['key']此单引号键值模式可以直接被解析为一个数组即$array 第二种:$array["key&qu ...