阳光网驿-企业信息化交流平台【DTC零售连锁全渠道解决方案】

 找回密码
 注册

QQ登录

只需一步,快速开始

扫描二维码登录本站

手机号码,快捷登录

老司机
查看: 1284|回复: 1

[转帖] mysql 行级物理模式优化与评估

[复制链接]
  • TA的每日心情
    开心
    2012-3-7 10:15
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2012-2-7 15:23:51 | 显示全部楼层 |阅读模式
    给定环境中,查询请求扫描多少行是合适的,每页应该存放多少行?每表存放多少字段?该有多大的字段?行该有多大?怎么评估响应时间?
    原始数据:(下面三张图原为同一个记录):
    3.jpg

    考虑在文件系统块大小为16K时,且innodb页为16K
    rw_per = (inn_num_r+inn_num_w) / qps == 每查询需读取写入page”ios”
    rw_bytes_per = ( inn_k_r + inn_k_w ) / qps == 每查询需要的bytes
    rw_q_bytes = rw_bytes_per / rw_per == 每查询引用的数据量bytes
    qrow = ( inn_row_r + inn_row_w ) / qps == 每qps 物理读取行数
    p_rwk = rw_q_bytes / qrow == 每行长度如果rw_per大于1
    ,则平均每查询都会产生物理io ,而不是buffer hit , rw_per 越高则ibf_hit越低,io越高
    行长度 :
    行长度,部分决定了在io层,缓存层,result 层的开销(不会涉及到net层)在理想情况下
    ,对于一个表结构,当查询含大量与result无关数据列和行,ios明显增大,缓存命中降低
    ,特别是某些情况下,将使缓存将失效,增大大io操作,当io成为瓶颈,将产生大量上下文
    ,在profiling 中看到的上下文会变得很大,从而影响响应速度
    根据出度公式 O( log( rowcount , page / line_size as pavg ) ) ,
    在F[n]中,当rowcount 增加,对数值的增长较为平缓,当pavg增长,将导致log成直线增长
    ,驱动参数为pavg ,因为存在F[n], O(log(F[n])) (= O(pavg) 由于innodb至多行大小为8190
    ,当溢出后,产生Uncompress blob页(在innodb plugin中得到了改进),将导致更多的io
    , 当 p_rwk > 8090 时,表结构存在设计问题(事实上,当度出越小,B-数过深,开销越大
    ,性能越低,因为它直接影响下钻及顺序访问操作 ) , 应考虑采用精确的数据类型
    ,合理的纵向切割方法,降低单行数据所带来的O(log(F[n])),用以降低由于下钻所需要的开销
    行深度 :
    rw_rto_r == 读写比例中读次数
    rw_rto_w == 读写比例中写次数
    是否提取过多行 ?
    假设用户体验需求为100ms
    用户的体验,依赖于响应时间,一般的讲,要想有良好的用户体验,每查询过程响应时间是最重要的指标
    影响响应时间的因素很多,如ibf 操作 ,磁盘搜索 , 结果集 , 网络通信 , 服务器及数据库配置等等 。
    在 网络通信 , 服务器及数据库配置等因素排除(因为这些通常恒定)的情况下,ibf 查询速度很快
    ,开销主要集中在io中 ,满足100ms ,要求io开销要求小于 70 , 响应时间主要由io得出
    ,在文件系统中,块的大小与行长度共同决定读取的io效率,mysql页为16K,也就是说当文件系统为16K时
    ,io性能依赖于磁盘参数 ,通常15000/rpms的磁盘理论能提供的响应时间为 4ms
    ,raid10的响应时间为 rw_rto_r * ( 4 / 2 ) + rw_rto_w * (4 * 2 ) * 0.7(假设写入缓冲merge为 0.3)
    ,在这里假设读写比例为 rw =100 , rw_ratio = 200 , r = 66 , w = 34
    ,可以计算出ios响应时间为:66*2 + 34 * 8 * 0.7 = 322.4 ms 能相信,这样的响应速度是不可忍受的
    根据公式得出:
    r = inn_num_r / qps == 每查询读取次数
    w = inn_num_w / qps == 每查询写入次数
    row_r = inn_row_r / qps == 每查询读取行数
    row_w = inn_row_w / qps == 每查询写入行数
    rk = inn_k_r / qps == 每查询读取字节数
    wk = inn_k_w / qps == 每查询写入字节数
    通过计算出读写次数,得出每个读写需要读取所需的行数,if p_rwk 时,得出每个r|w影响行数
    ,由于每个r|w行数的开销,通过降低扫描行数,能降低ios,有效提高系统吞吐量,将读取量控在:
    1、算出出度:
    rd_nu = rk / row_r == 每读取行占用字节数
    wd_nu = wk / row_w
    16384 / ( wk / row_w )
    2、算出读写比例
    r_rto = r / ( r + w )
    w_rto = w / ( r + w )
    3、算出最低容忍响应时间
    r_rto_ru = 70 * r_rto
    w_rto_ru = 70 * w_rto
    4、获取rw所需要的响应时间所对应的行数
    16384 * ( r_rto_ru / ( 1000 / ( 15000 / 60 ) / 2 ) ) / rd_nu == 获取读操作最多能操作多少块是能忍受的
    16384 * ( w_rto_ru / ( 1000 / ( 15000 / 60 ) / 2 ) ) / wd_nu == 获取写操作最多能操作多少块是能忍受的
    通过公式反推,响应缓慢时,应当检查是否扫描了过多的行,在可容忍的时间范围内
    ,可以通过配置行数及行长度,得到需要的响应时间
    总结:设计数据库时,根据数据特性,进行有效的数据类型,字段数,行,表 ,及物理读写评估
    ,根据有行长度进行物理层优化,能有效的降低开销 ,提升响应,也间接获得了成本优势。

    每天一点点
    楼主热帖
    启用邀请码注册,提高发帖质量,建设交流社区
  • TA的每日心情
    奋斗
    2016-11-23 13:14
  • 签到天数: 47 天

    [LV.5]常住居民I

    发表于 2012-2-8 08:28:50 | 显示全部楼层
    好深奥,基本看不懂

    凑字.exe
    启用邀请码注册,提高发帖质量,建设交流社区
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表