我上大学的那个时候喜欢研究一些数据库的技术,那时候觉得数据处理很重要,而且数据优化也是相当重要的,看了很多数据库方面的资料,虽然在实际的项目也遇到过一些数据库优化的任务,完成之后还是有些心情愉快。但是一直没有遇到过数据优化的DBA工作。个人也是从事java开发和一些采集监控系统,但是做过的项目也不算是很到,没有遇到过10万以上的监控采集点的项目,也有想过在开发工程中用下内存数据库,但是做过的项目还是没有必要使用到内存数据库。遇到的系统瓶颈大概是以下8个方面:

1 磁盘I/O:磁盘IO读写速度要比内存慢很多,内存要比磁盘快10万倍~100万倍的速度。如果程序在运行过程中,如果IO操作效率低下将会是系统的瓶颈。

2 网络操作:对网络数据进行操作时由于网络的不确定性也将成为系统的瓶颈。

3 CPU:对CPU的争夺情况也将可能成为系统的瓶颈。

4 异常:异常的处理是一个很耗费资源的过程,如果系统频繁出现异常的处理将成为系统的瓶颈。

5 数据库:对数据库的操作,如果数据库中的数据量逐渐增加,将会使数据库的操作花费的时间也逐渐增加,将成为系统的瓶颈。

6 锁竞争:对高并发程序来说,如果存在激烈的锁竞争,也会对性能带来巨大的开销。将会成为系统的瓶颈。

7 内存:如果内存分配的不合理,也将会成为系统的瓶颈(内存交换频繁将可能存在系统耗费资源多)。

8 系统处理的访问量:如果系统承受的访问量大也将成为系统的瓶颈。

前期提到的技术路线有

分析表的使用情况,频繁增删的,用链式结构;频繁查改的,用顺序结构。频繁查找字段,加入索引,索引覆盖,从索引上获取全部数据。

分析E-R,实现3个范式的数据库完整性,减少数据冗余。

对大数据表,分表处理,包括水平拆分和垂直拆分

优化字段类型,能确定varchar字段长度的尽量长度给小。

页面查询的时候,分页查询数据库内容,采用select * 尽量使用确定的字段写出来并且确定只有查询1条的数据一定要使用limit 1 ,查询尽量能使用limit就要使用limit,这样能有复杂的流程换取时间。

一次操作数据量适中,不用3重循环来处理数据,不要无限制的封装函数,特别是循环量大的函数一定要注意。

关于读写分离,如果数据库压力很大,一台机器支撑不了,用mysql复制实现多台机器同步,我觉得上百万的数据这个还是没有必要用到。

如果for循环比较多,可以尝试将改成for(int i=0;i<x;i=i+n)这样的方式来优化循环,循环是比较拖累程序的。

在for循环能一些对字符串的操作频繁的时候注意数据类型的选择,这个也是很重要的。

如果存在乘除法的语句能够用位运算代替的尽量用位运算,这样效率更高。

异常处理的过程最好不要放在for循环之中,这样会拖慢系统性能。

百万条数据量主要优化是在代码优化之中并且效果明显。而且只有在运维的时候了解实际的运行状况才能知道系统的瓶颈在哪里。

具体实施的方案1:使用数据库连接池,创建多个数据库连接放在连接池中,当用户提交数据时直接从数据库中拿到数据库的连接操作并行向数据库中插入数据,这样会节省很多时间到达优化的效果,我做了下测试在数据库表中的数据到达到了200多万时,也能达到要求但是这样占用的数据库连接比较多,资源占用比较多。基本的流程图如下:

具体实施的方案2:在用户请求数据时数据库先不存在响应,先缓存数据,等到达时间,1秒或者是500毫秒,也可以是缓存上线1000条数据之后,打开连接一起存入到数据库中,这样对性能的优化效果更好,基本流程如下图:

通过测试在数据库中数据到达200万条的时候插入数据为1000条时,能到达201毫秒的时间,优化的效果很好,并且占用资源少。

该系统的数据量不大建议使用第二种方式。

 
 
 

百万行mysql数据库优化(补充)的更多相关文章

  1. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  2. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  3. 50多条mysql数据库优化建议

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...

  4. 30多条mysql数据库优化方法【转】

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  5. 转载:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  7. mysql 数据库优化第一篇(基础)

    Mysql数据库优化 1. 优化概述 存储层:存储引擎.字段类型选择.范式设计 设计层:索引.缓存.分区(分表) 架构层:多个mysql服务器设置,读写分离(主从模式) sql语句层:多个sql语句都 ...

  8. mysql数据库优化课程---10、mysql数据库分组聚合

    mysql数据库优化课程---10.mysql数据库分组聚合 一.总结 一句话总结:select concat(class,' 班') 班级,concat(count(*),' 人') 人数 from ...

  9. Mysql数据库优化技术之配置篇、索引篇 ( 必看 必看 转)

    转自:Mysql数据库优化技术之配置篇.索引篇 ( 必看 必看 ) (一)减少数据库访问对于可以静态化的页面,尽可能静态化对一个动态页面中可以静态的局部,采用静态化部分数据可以生成XML,或者文本文件 ...

随机推荐

  1. hdu1848 Fibonacci again and again(SG游戏功能)

    现在的变化是看不清楚SG功能什么寻求方法 临时模板标题是首当 性能mex1它正在寻求g(x) 然后XOR #include<cstdio> #include<iostream> ...

  2. POJ 2255 Tree Recovery 二叉树恢复

    一道和Leetcode的一道题目基本上一样的题目. 给出前序遍历和中序遍历序列,要求依据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出. Leetcode上有给出后序和中序,恢复二叉树的. 只是 ...

  3. 《java系统性能优化》--2.高速缓存

    上一节.简介了怎样发现性能瓶颈.从这节開始.我会和大家分享我在项目中做的一些性能调优工作.这个系列没有什么顺序可言,认为什么重要.就说说什么. 这节.我们聊缓存. 最開始接触缓存这个词,是学习硬件知识 ...

  4. Critical thinking and Thoughtful writing

    Critical thinkers are able to : Articulate their ideas clearly and persuasively in writing Understan ...

  5. ASPX的Timer位置没放正确,导致整页刷新,而不是UpdatePanel里的内容刷新。

    提示:Timer应该放在UpdatePanel的ContentTemplate标签里,才行.放在外面的话,会导致整页刷新.

  6. MVC5 + EF6 + Bootstrap3 (8) HtmlHelper

    MVC5 + EF6 + Bootstrap3 (8) HtmlHelper用法大全(上) 上一节:MVC5 + EF6 + Bootstrap3 (7) Bootstrap的栅格系统 源码下载:点我 ...

  7. NHibernate系列

    NHibernate系列 写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗 ...

  8. DDD分层架构之值对象(层超类型篇)

    DDD分层架构之值对象(层超类型篇) 上一篇介绍了值对象的基本概念,得到了一些朋友的支持,另外也有一些朋友提出了不同意见.这其实是很自然的事情,设计本来就充满了各种可能性,没有绝对正确的做法,只有更好 ...

  9. 谈Linux

    新手谈Linux   目录: 什么是Linux? Linux与UNIX的区别 Linux与Windows比较 什么是Linux发布版? Linux应用领域 Linux版本的选择 怎么学习Linux? ...

  10. [C++] 获取IE代理server的账号password

    非常多程序须要使用'浏览器设置'的代理server,IE设置的代理server有可能是须要账号password的.如何编程获取浏览器设置的代理server的账号password呢? InternetQ ...