%A0速你的程序:数据读取和写入优化攻略_第1页
%A0速你的程序:数据读取和写入优化攻略_第2页
%A0速你的程序:数据读取和写入优化攻略_第3页
%A0速你的程序:数据读取和写入优化攻略_第4页
%A0速你的程序:数据读取和写入优化攻略_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、加速你的程序数据读取和写入优化攻略颜兴华 应用架构 应用设计 硬件资源 事务和隔离级别 Transact-SQL代码 数据库的配置影响程序性能的主要因素 CPU:一般情况下,OLTP系统属于IO密集型,对CPU要求并不高,OLAP则对CPU有更高的要求。 内存:对于OLTP数据库,内存能和常用数据大小一致则较为理想。OLAP数据库因为需要对大量数据进行汇总,排序等运算,对内存大小有更高的要求。服务器的硬件搭配 硬盘:SAS硬盘、SSD硬盘、 SATA硬盘1.SAS硬盘:平均读写速度100mb/s以上,iops 150-200。2.SATA硬盘:平均读写速度不到100mb/s,iops不到100

2、。3.SSD硬盘:读写速度可以达到300mb/s,iops 可以达到10000以上。 对于高并发随机读写数据库系统,采用ssd硬盘可以显著提高程序响应速度和增大系统负载能力。 采用raid可以提高磁盘性能,raid卡的内存很重要。硬盘的选择 三大主流关系型数据库对比性能:oraclesql servermysql成本:mysqlsql servermysqloracle 应用场景分析数据统计分析:sql server=oraclemysql商业金融系统:oraclesql server=mysql小型数据库应用:mysqlsql serveroracle选择合适的数据库 对于IO密集的操作,可

3、以借鉴Innodb的这个架构。数据库缓存解析以页(16kb)为存储单位,连续64个页(区)分配数据库缓存解析数据库更新操作需要记录redo log,因此牵涉到一个重要的参数:innodb_flush_log_at_trx_commit大批量更新为什么会较慢? 我总结了几个值得优化的地方: 1、合理设置数据库缓存的大小。 2、数据文件、日志文件、tempdb分别放在不同的存储上。 3、配置主从或者集群分担服务器压力。 4、结合硬件和业务优化数据库配置。 5、结合业务合理分表或者使用分区表。 6、优化SQL、索引。数据库性能调优 选择合适的数据库引擎 常用的有Innodb和 Myisam1、Myi

4、sam引擎适用于日志型表,空间利用率高。设置 concurrent_insert=2 ,select 和 insert 操作可以并发执行,单线程插入效率一般高于Innodb。2、Innodb 适用于update和delete都比较多的情况。并且因为聚集索引的特点,适合于那些经常用聚集索引筛选数据的场景。Mysql 优化Innodb 索引Myisam 索引1、innodb_buffer_pool_sizeInnodb 缓存大小设置。2、innodb_log_buffer_size log 缓存,1秒会flush到硬盘一次。3、innodb_flush_log_at_trx_commit每次事务提

5、交都flush log到硬盘。在频繁低延迟写入的场景中,设置为0或者2可以极大的提高效率,降低IO操作。InnoDB 几个关键的参数 innodb_flush_log_at_trx_commit 测试 设置为0:100w数据逐条循环插入:1分钟 设置为2:100w数据逐条循环插入:3分钟30秒 设置为1(默认):100w数据逐条循环插入:6分钟 如果使用批量提交插入的方式,速度会加快,不同刷新级别的耗时差距也会缩短。Mysql 数据库优化 Mysql 只有 nest loop join。 Oracle 和 SQL server 支持nest loop join、hash join、Sort m

6、erge join。 在Join列无索引情况下, Hash join 性能比 nest loop join强很多,而如果驱动表较大,Sort merge join 性能也会优于nest loop join。 强烈建议在Mysql的Join 列建立索引。Mysql Join的缺陷 调整最大内存占用。 启用快照隔离(基于版本控制,允许读取行的一个先前提交过的值不产生阻塞)。 调整select语句的锁定模式,允许脏读。(with nolock) 调整数据库日志记录的恢复级别(完全恢复、大批量恢复、简单恢复) 索引视图(数据修改负担增加,查询效率提高)数据中心的SQL Server 优化小节讨论1、对

7、同一个表的多次Insert语句,缓存后合并写入。Java 可以使用 BatchUpdate 命令进行批量更新。A 可以使用 SqlBulkCopy 可以把内存表数据批量写入SQL Server数据库。2、可以使用 LOAD DATA 批量导入文本数据。3、大批量数据插入:入库后再建索引。SQL Server 使用堆表,Mysql使用myisam引擎。4、多条更新语句批量执行。数据库写入优化设计游戏程序日志文件数据库 根据查询计划调整或者改变SQL结构。 关于count(*):1、SQL Server 的count(*)全表统计可以用: select max(rowcnt) from sys.sysindexes where id=object_id(表名) 代替2、对于innodb,在查询条件列建立非聚集索引是最佳选择。3、SQL Server的 count(distinct col) 有时非常弱智。数据库查询优化 对于频繁写入,不要每次都判断文件夹是否存在。 频繁

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论