如何用分表存储来提高性能 推荐_数据库其它

首先,童家旺介绍了他认为的什么是优化:第一、做任何事情最快的方法就是什么也不做。


▲支付宝资深数据库架构师童家旺

  第二、不访问不必要的数据:使用B*Tree/hash等方法定位必要的数据。使用column Store或分表的方式将数据分开存储。使用Bloom filter算法排除空值查询。

  第三、合理的利用硬件来提升访问效率:使用缓存消除对数据的重复访问。使用批量处理来减少磁盘的Seek操作。使用批量处理来减少网络的Round Trip。使用SSD来提升磁盘访问效率。

  响应时间和吞吐量之间的关系

  1、性能。衡量完成特定任务的速度或效率。

  2、响应时间。衡量系统与用户交互式多久能够发出响应。

  3、吞吐量。衡量系统在单位时间里可以完成的任务量。

  

  ▲反应时间

  

  ▲传统磁盘的访问特性

  B*Tree优化数据访问介绍

  

  ▲B*Tree优化数据访问

  B*Tree优化数据访问模拟场景

  

  ▲B*Tree优化数据访问模拟场景

  童家旺通过阿里巴巴的真实应用场景介绍了如何用分表存储来提高性能。

  一、场景介绍:

  1、表VeryBigTable含有30个列

  2、表的记录数为50,000,000条

  3、平均每个用户为300条左右

  4、其中有2个列属于详细描述字段,平均长度为2k

  5、其它的列的总长度平均为250个字节

  6、此表上的查询有两种模式

  7、列出表中的主要信息(每次20条,不包含详细信息,90%的查询)

  8、查看记录的详细信息(10%的查询)

  9、保存与Oracle数据库,默认block_size(8k)

  二、要求:

  1、对此业务进行优化

  2、分析数据,说服开发部门实施此优化

  三、性能分析

  1、每块记录数

  8192 * 0.80(1) / 250 = 25.5 (主表)

  8192 * 0.80 / 2000 = 3.27(详情表)

  8192 * 0.80 / ( 2000 + 250 ) = 2.91

  2、访问的逻辑IO(内存块访问)

  List的查询代价

  改进后=( 300/25.5 ) * y + 4 + x = 4 + x + 11.8y = 4(2) + 7(3) + 11.8 * 1.5(4) = 28.7

  改进前=( 300/2.91 ) * y + 4 + x = 4 + x + 103.y = 4 + 7 + 103 * 1.5 = 165.5

  3、访问涉及到的物理读(磁盘块访问)

  List的查询代价(逻辑IO * ( 1 – 命中率 ))

  改进后=28.7 * ( 1 – 0.85(5)) = 4.305

  改进前=165.5 * ( 1 – 0.85 ) = 24.825

  4、访问时间(ms)

  改进前=逻辑IO时间+物理IO时间= 28.7 * 0.01(6) + 4.305 * 7(7) = 30.422ms
  改进后=逻辑IO时间+物理IO时间= 165.5 * 0.01 + 24.825 * 7 = 175.43ms

时间: 2024-12-01 04:28:24

如何用分表存储来提高性能 推荐_数据库其它的相关文章

利用分表存储来提高网站负载与性能

▲支付宝资深数据库教程架构师童家旺 第二.不访问不必要的数据:使用B*Tree/hash等方法定位必要的数据.使用column Store或分表的方式将数据分开存储.使用Bloom filter算法排除空值查询. 第三.合理的利用硬件来提升访问效率:使用缓存消除对数据的重复访问.使用批量处理来减少磁盘的Seek操作.使用批量处理来减少网络的Round Trip.使用SSD来提升磁盘访问效率. 响应时间和吞吐量之间的关系 1.性能.衡量完成特定任务的速度或效率. 2.响应时间.衡量系统与用户交互式

MySQL 分表存储的使用示例

一般我们项目中如果数据量特别大的话通常会考虑将某一表数据进行分表处理,例如:我们的用户访问日志.如果将该数据始终保存在一张表的话那么久而久之这张表的数据量会特别大,导致查询效率降低.这个时候就需要考虑将该数据分别存储到多张表中. 而日志数据具有典型的如下特点: 1. 数据量大. 2. 每天每月都稳定输出. 3. 对数据的操作在插入之后大部分只有查询,很少有编辑或者删除操作. MySQL数据库提供了数据分表的方式. MERGE存储引擎 我们在使用SQL语句Create table创建表时可以指定数

dba_indexes视图的性能分析_数据库其它

select case when status='UNUSABLE' then 'alter index '||owner||'.'||index_name||' rebuild online compute statistics;' when to_number(degree)>1 then 'alter index /* '||degree ||' */'||owner||'.'||index_name||' noparallel;' end case from (select * from

详解表单验证正则表达式实例(推荐)_正则表达式

验证:!reg.test(value) 邮箱: 复制代码 代码如下: reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/i; 不包含中文: 复制代码 代码如下: reg = /.*[\u4e00-\u9fa5]+.*$/i; 身份证号: // 验证身份证号码 var city = {11:'北京',12:'天津',13:'河北',14:'山西',15:'内蒙古',21:'辽宁',22:'吉

一些关于数据存储和查询优化的想法_数据库其它

总结如下: 1. 存储过程: sql语句的批处理,面相应用和服务的,将常用的连续操作做成批处理形式. 解决瓶颈问题:大量sql查询速度慢s 2. 索引服务: 建立key和文档之间的倒排索引. 解决瓶颈问题:key的全文检索like '%key%'语句执行速度慢 3. 数据库字段索引: 为数据库表字段建立索引. 解决瓶颈问题:查询速度慢

phalapi-进阶篇6(解决大量数据存储数据库分表分库拓展)

phalapi-进阶篇6(解决大量数据存储数据库分表分库拓展) 前言 时隔半个月随着PHP7的推出为PHP打了一瓶兴奋剂,在性能提升了一倍的情况下我们会逐渐发现,瓶颈会集中在数据库操作,那我们的内容就接着数据库读写分离,来聊聊分表分库应该怎么玩,应为PhalApi的分表分库并不是非常方便,笔者在这里提供了一个分表分库数据库集群的拓展,详细文档请见博客基于PhalApi的DB集群拓展 V0.1bate 大家可以自行在开源中国扩展Git地址中找到Cluster进行下载使用. 先在这里感谢phalap

mongodb 分片代替数据库分表

MongoDB 的Sharding机制解决了海量存储和动态扩容的问题,但离生产环境的高可靠,高可用还有距离,Sharding在单点出现故障时就无能为力了.但是 MongoDB的副本集却可以很轻松的处理单点故障,所以就有了Replica Sets + Sharding的高可用,高安全的架构.Mongodb支持自动分片和划分架构,可以利用它构建一个水平扩展的数据库集群系统,将数据库分表存储在各个sharding节点上. 架构如下:       1,shard服务器:使用Replica Sets确保每

通过 SQL Server 2005 索引视图提高性能

本文介绍了 SQL Server 2005 Enterprise Edition 中经过改进的索引视图功能.文中对索引视图进行了说明介绍,并讨论了可通过该功能改善性能的一些具体情况 一.索引视图 多年以来,Microsoft SQL Server 一直支持创建称为视图的虚拟表.通常,这些视图的主要作用是: • 提供一种安全机制,将用户限制到一个或多个基表的某个数据子集中. • 提供一种机制,允许开发人员自定义用户通过逻辑方式查看存储在基表中的数据的方式. 通过 SQL Server 2000,S

透明的分库分表方案

问题提出 随着应用规模的不断扩大,单机数据库就慢慢无法满足应用的需要了,这主要表现在如下方面: 存量数据越来越大,查询速度越来越慢 访问并发越来越大,磁盘IO.网络IO.CPU都慢慢成为瓶颈 事务数越来越多,事务冲突越来越严重,导致TPS越来越少 这个时候,有的人采用了换商用数据库的方案比如Oracle,然后用Oracle的RAC方式进行水平扩展.但是带来的缺点也比较明显,第一是成本太高,一般人吃不消:第二,管理复杂度较单节点有非常大的提升,风险及管理成本也相应增加:第三,对人员的水平要求更高,